Go関連のことを調べてみた2021年03月20日

Go関連のことを調べてみた2021年03月20日

プログラミング超入門(7)〜GO言語〜

#条件分岐
分岐処理とは、ある条件が満たされるときのみ特定の処理を行い、そうでなければ別の処理をしたり、また別のある条件が満たされているときのみ特定の処理を行い、そうでなければ何もしないなどといった与えられた式の値でtrueかfalseに分け異なる処理を行うようにすることをいいます。
##if文
`if 条件 { 条件を満たしたときの処理}` 

“`Branch1.go
package main

import “fmt”

func main() {
age := 24

if age >= 20 {
fmt.Println(“adult”)
}
}
“`
###実行結果
“`
adult
“`
##if~else文
`if 条件 A { 条件Aを満たしたときの処理} else { 条件を満たさないときの処理}`

“`Branch2.go
package main

import “fmt”

func main() {
age := 18

if age >= 20 {
fmt.P

元記事を表示

Go のディレクトリ操作まわりの関数

今回のトピックも自分のメモの色合いが強い。今回これを書いている理由は、「記憶するため」の一つの手段だ。

今回のお題はとても簡単で

ディレクトリを捜査して、Dockerfile にマッチするものを見つけてそのディレクトリにあるメタデータやディレクトリの名前を取得したいというとっても簡単なもの。問題は私が Go でどう書くかを記憶していないことにある。そこでブログを書いてみて整理してみよう。

# Current Directry

“`go
currentDir := os.Getwd()
“`

# ファイルパスの結合

ファイルパスの結合はプラットフォームによって異なるので、自分で足すと暗黒。
Join のパラメータは、`…string` であるので可変長である。リストにも簡単に変換できる。

“`go
path := filepath.Join(currentDir, “tests”, “images)
“`

ちなみに、`…` は Ellipsis という。`[]string` から Ellipsis に変換したいケースは

“`go
param := [

元記事を表示

構造体に入門してみた

おはようございます。(おそらく投稿するときは夜だと思いますが、、、)朝一で頭が冴えてる間に構造体について調べてみました。

この記事を書き始めている今時点の構造に対する認識は、

– いろんな型を持つ変数をひとくくりでまとめられる

こんなイメージです。

ドキュメントでは以下のように構造体が定義されています。

> struct (構造体)は、フィールド( field )の集まりです。

[https://go-tour-jp.appspot.com/moretypes/2](https://go-tour-jp.appspot.com/moretypes/2)

いや、そうなんだろうけどよくわからん!!って感じでした。

## やはりよくわからないのでいろいろ試してみます。

とりあえず構造体を使用してみます。

“`go
package main

import (
“fmt”
)

type User struct {
name string
age int
}

func main() {
var me User
me.name = “endo”
me.age

元記事を表示

GolangでMeCab+NEologdが使えるDockerイメージ作成してみた

#はじめに
社内のサーバーサイド公式言語である[Golang](https://golang.org/)で、
形態素解析ライブラリの`MeCab+NEologd`を試したいな〜
という情熱が燃えたぎったので、挑戦してみました。

Dockerfile、初体験であります。(ドキドキ)

#TL;DR
– `main.go`の用意
– `docker-compose.yml`の用意
– `Dockerfile`の作成
– `startup.sh`の作成

#`main.go`
[go gin](https://github.com/gin-gonic/gin)のフレームワークを使って、REST APIを作成し、テキストを受け取るとともにMeCabによる形態素解析の結果を返す`main.go`です。
(※エディタは`goland`を使いました。`Go Modules`とかの管理が楽)

“`golang:main.go
package main

import (
“fmt”
“log”
“net/http”

mecab “github.com/bluele/mecab-gola

元記事を表示

gqlgenでresolver・model・schemaファイルを分割しコードの見通しを良くする

gqlgenで開発していると、`gqlgen generate`で生成されるresolversとmodelsが長くなってしまい、分割したくなることがあると思いますので、その方法を書きます。

■方針
今回は、GraphQL形式でクライアントがDBのデータをリクエストすることを可能にするGraphQLサーバをGoで構築することが目的だったことから、schema、resolvers、modelsをテーブル単位で分割することにしました。

## model分割
ここはドキュメント読めば分かると思うのですが一応書きます。
↓分割する際には`models_gen.go`にある構造体をテーブル毎にファイル分割して、あとは↓のように`gqlgen.yml`に書いておけば`go generate ./…`で新しく生成されなくなります。

“`yml

models:
Users:
model: git-xxx/repository-name/graph/model.Users
“`

## resolvers分割
一番分割したかったのがここ。ドキュメントを読んでも分割する方法が書

元記事を表示

【Go言語】文字結合 (string concatenate) パフォーマンス strings.Builderを使おう

# TL;DR

go1.10からのstrings.Builderは実態はGoのBufferタイプと同じ。アロケーションが発生しないので多量な文字結合するならばstrings.Bufferを使っていこう。

# ベンチマークコード

“`go:vs_test.go
package main

import (
“strings”
“testing”
)

func Benchmark_string(b *testing.B) {
var s string
b.StartTimer()
for i := 0; i < b.N; i++ { s += "a" } b.StopTimer() } func Benchmark_stringsBuilder(b *testing.B) { var sb strings.Builder b.StartTimer() for i := 0; i < b.N; i++ { sb.WriteString("a") } _ = sb.String() // output string b.StopTimer() }

元記事を表示

GoでO/Rマッパーと生SQLの違いを比較してみた

# はじめに
Ruby on Railsを学習している方はActiveRecordという名称のORマッパーを目にする事が度々あると思います。
私もプログラミングの学習をRubyから始めたのですが、ORマッパーと聞くとなんとなく「DBからのデータの取り出しを簡単にやってくれているんだな」くらいの認識でした。
Railsがあまりに様々な事をよしなにしてくれるので、Rails初学者の方は生のSQLを書く機会もほとんどないのではないかと思います。
最近Goを勉強し始めた事で、そのRailsがよしなにしてくれていた部分を基本から学び直す必要が出てきたので、ORMに関しても一つ学び直してここに備忘録として残したいと思います。

# 対象者
– プログラミング初学者
– SQLは書いた事があるがORMは利用した事がない。あるいはORMは利用した事があるが生のSQLを書く事はあまりない。

# 概要
Goのデータベースとのやり取りを、生のSQLで行った場合とORマッパーを利用した場合とでどうコードの違いが出るのかを比較して見ていきます。
Goを扱っていますが、簡単なコードなのでGoを触った事が無い方で

元記事を表示

【Go 言語】interface のポインタからメソッドコールできないのはなぜ?

## 結論

簡潔に言うと「interface を指すポインタは interface を実装した構造体のポインタのポインタになるから」です。
これだけではよくわからないので詳しくみていきましょう。

## interface のポインタからメソッドコールができないとは?

interface の Mammal とそれを実装した Human という構造体を考えましょう。

“`go
type Mammal interface {
GetAge() int
}

type Human struct {
Age int
}

func (h *Human) GetAge() int {
return h.Age
}
“`

この時、以下のように Mammal というインターフェースのポインタから GetAge() をコールしようとするとコンパイルエラーになってしまいます。

“`go
func Foo(human *Mammal) {
_ = human.GetAge() // コンパイルエラー
}
“`

GetAge() をコールするためには *Mammal ではなく

元記事を表示

Rustにおける「厳密な型付け」という文化

# はじめに

Rustの特徴としてはメモリ安全性やGCなしで高速といったことがよく挙げられます。それらもRustの利点ではありますが、個人的に魅力を感じる部分の一つに「厳密な型付けをする文化」があると思っています。それはあまり明文化されておらず、個人的に感じているだけなのですが、Rustを使う動機の1つになりうると思うので、ここで宣伝してみます。

ちなみにこの記事のきっかけの1つが

[アンサー: なぜTypeScriptの型定義に凝るのか](https://qiita.com/uhyo/items/3bc5f951f922804ede51)

です。これを読んでいて、「自分はRustの型付け方針が好きなんだなぁ」とあらためて気づきました。
技術的な正確性より「気持ち」多めなのでポエムということで。

# 「厳密な型付けをする文化」とは

Rustは静的型付き言語なので、ソースコード上の様々なところで型付けが行われます。これ自体は他の静的型付き言語と同様ですが、Rustではどのような型を付けるかということについて、比較的厳密に考える傾向があると思っています。

例えば標準ライブラリ

元記事を表示

Rubyで理解するポリモーフィズムから、Goのインターフェースへ①

#何を書くか
私は現在、Go言語の学習に取り組んでいます。
そこで、**「インターフェース」**という概念を学びました。

##何やこれ
正直、教本を読んでも全然なんのこっちゃと言った感じだったので、[こちら](https://qiita.com/k-penguin-sato/items/885a61d819cc431304f5)の記事を覗いてみました。

すると

>interface(インターフェース) を利用することで、オブジェクト指向言語でいうところのポリモーフィズムと同様の機能を実現できます。

との説明がありました。ふむふむ。ポリモーフィズムね。

何だそりゃ。

##ということで
Rubyの学習も兼ねて、まずはオブジェクト指向のポリモーフィズムを理解し、それからインターフェースを学習していこうと思います。

一応二部作の予定で書いていきます。
1部目の今回は、**ポリモーフィズム**について、自分が調べただけつらつらとお話ししていこうと思います。

#ポリモーフィズムとは
**オブジェクト指向言語(Rubyが持つプログラミング言語が持つ概念的な捉え方)**には、守べき設計

元記事を表示

Golangでzipファイルを解凍する

こんにちは。初投稿です。どうぞお手柔らかにm(__)m。

Go言語に触れ始めて数か月、それほどガッツリ書いてるわけではないですが、少しわかってきた気がします(危険な時期)

さて、タイトルの通りZipファイルを解凍するのですが、よくあるZip解凍ツールのように「ファイル名を展開先のディレクトリ名に使う」のってよくありませんか?ないですかそうですか。

例えば「test20210318.zip」であれば「test20210318」というディレクトリを作って、その下層に展開する、というものです。
実際に業務でニーズがありまして、同じファイル構成でzip圧縮されたファイル群を、繰り返し解凍するような仕組みです。

作ったサンプルがこちら。

“`Go:sample/unzip/main.go
package main

import (
“archive/zip”
“fmt”
“io”
“os”
“path/filepath”
“regexp”
)

// unZip zipファイルを展開する
func unZip(src, dest string) error {
r,

元記事を表示

Polymorphism with Interfaces

https://play.golang.org/p/ojRqAxy5JYm

https://medium.com/technofunnel/polymorphism-with-golang-interfaces-b2f58a05b221

# work

“`
package main

import (
“fmt”
)

type Test interface{
Run()
// Debug()
}

type My struct{
body string
}

func (m My)Run(){
fmt.Println(m.body)
}

func main() {
my := &My{body: “DOOOOOOOO”}
fmt.Println(“Hello, playground”)
testRun(my)
}

func testRun(t Test){
t.Run()
}

“`

“`
Hello, playground
DOOOOOOOO
“`

# Error

“`
package main

import (
“fmt”

元記事を表示

M5StickC Plus (ESP32) とTinyGoでLチカ

# はじめに
最近、仕事でGO使ってて、趣味ではESP32を使ってるので、TinyGoでESP32をプログラミングしたくなってきた。ということで、Lチカすることにした。

# 環境
macOS Big Sur Ver 11.1

# インストール
## TinyGo
tinygoは、ここを参考にして、インストールした。
[macOS :: TinyGo – Go on Microcontrollers and WASM](https://tinygo.org/getting-started/macos/)

いろいろ書かれてるけど、これだけで動くはず。

“`zsh
brew tap tinygo-org/tools
brew install tinygo
“`

## ESP32のためのツール群
これにしたがって下記ツールを入れた。

[ESP32 – mini32 :: TinyGo – Go on Microcontrollers and WASM](https://tinygo.org/microcontrollers/esp32-mini32/)

– pyserial

元記事を表示

Goでnslookupする

“`golang
package main

import (
“fmt”
“log”
“net”
)

func main() {
addr, err := net.LookupHost(“vamdemicsystem.black”)
if err != nil {
log.Fatal(err)
return
}
fmt.Println(addr)
}
“`

“`
⋊> /t/golang go run main.go 23:06:26
[183.181.88.32]
“`

元記事を表示

deferに入門してみた

# deferに入門してみた

ちょっと退屈してたたので、deferについて調べてまとめてみます。

この記事を書き始めている今時点のdeferに対する認識は、

– 処理を実行を遅らせてくれる便利なやつ
– どこで実行しても最後に処理してくれるから、忘れてた!!ってことを防止できるやつ

こんなイメージを持ってます。

## では早速ごちゃごちゃ動かしてみます。

“`go
package main

import (
“fmt”
)

func main() {
defer fmt.Println(“defer Hello, playground”)
fmt.Println(“Hello, playground”)
}
“`

実行結果

“`
Hello, playground
defer Hello, playground
“`

イメージした通り、処理が遅れましたね。

では、deferが2つあったときは??

“`go
package main

import (
“fmt”
)

func main() {
defer fmt.Println(“def

元記事を表示

Golangで依存パッケージの脆弱性を調査するならNancyがおすすめ

# 概要
* Goで使用する外部パッケージが安全かどうかを調べる時にオススメなのが、[nancy](https://gonancy.dev/)です。
* ちなみにnancyとは、Sonatype OSS Indexを利用して、Golangの依存関係の脆弱性をチェックするツールです。
* nancyではdepまたはgo modの依存関係を調査してくれます。

![nancy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/79fec195-ab17-3383-03db-e5319d156c58.png)

# 導入方法
* install方法

“`

> brew tap sonatype-nexus-community/tap
> brew install nancy
“`

# 試す

* helpを見てみる
* 見てみると、引数にGopkg.lockまたは、go.sumのpathを指定してあげるようです。

“`
❯ nancy –help
Usage:
nancy [opti

元記事を表示

Golangでインストールしたパッケージ(依存パッケージも含む)のversion確認方法

# 概要
Go言語で依存パッケージも含めてパッケージのversionを確認したいときに利用するコマンドです。
ただ、注意点としては、パッケージの開発が別のリポジトリに移動すると最新のversionを追えません。

“`
go list -m -u all
“`

# 試してみた
試しに、goのsample projectで上記のコマンドを試してみたいと思います。
cloneしたsample => https://github.com/golang/example

“`
❯ go list -m -u all
go: finding github.com/yuin/goldmark v1.2.1
go: finding golang.org/x/net v0.0.0-20201021035429-f5854403a974
go: finding golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9
go: finding golang.org/x/tools v0.0.0-20210112183307-1e6ecd4bf1b0

元記事を表示

日報Go

# きっかけ
「リモートワークで勤怠入力が必須になってしまった…」
「いちいちブラウザ開いて入力したくない….」
ということでGolangの勉強がてらに作りました:fist:

上司に許可とって、きちんとやっている内容出していればOKとのことだったので自動化してみた感じです。:tea:
簡単な内容ですが、同僚には受けがよかったです…w

間違いなどありましたらご指摘していただけると幸いです。

# ソース
https://github.com/sgash708/go_chatwork_notice

# 前提
* Golang ver1.15
* goquery
* Agouti
* ChromeDriver ver88.0.4324.96
* zsh
* macOS ver10.15.7

https://chromedriver.chromium.org/downloads

# 注意
スクレイピングは脅威にもなります。
サイトごとに行ってよいか注意しながら行いましょう。
待ち処理などを適宜入れてください。

# 前準備
goファイルが走るように設定しま

元記事を表示

プログラミング超入門(6)〜GO言語〜

#for文(繰り返し制御)
配列から要素を一つずつ取り出せるようになります。GO言語の繰り返し処理には、**while文**(データの個数がわからない時に使用する条件式)が無くシンプルにfor文というデータの個数分までループ構造を繰り返す処理のみになります。`for スタート値; 継続条件; 増減式 { }`スタート値は第一引数にあたり、繰り返し処理をスタートさせる値になります。変数名に**i**(indexやintegerの頭文字)が使われるのが一般的です。0からスタートとなる**カウンタ変数**(アクションの実行回数)を省略形**(:=)**で代入し定義します。継続条件の部分は繰り返しをやめるまでの条件としてブール値を返す式を記述します。通常はiの値に関する式となり、式の値がfalseとなったら繰り返しをやめ、{ }の中から抜けることになります。例として`i <= 4;` `i < len(aprices)`を記述します。増減式は1回の繰り返し処理で1ずつ増やすインクリメント演算子「++」を使用します**「i++」**は、「i += 1」の略です。{ }波括弧の中には繰り返したい処

元記事を表示

WindowsベースのDockerコンテナを動かす

#Windowsのコンテナを作ろう
Dockerといえば、普通はLinuxのコンテナですが、Windowsのコンテナを使いたいときもあると思います。
そんなボーイズ&ガールズにWindowsのコンテナを作るDockerfileをお贈りしよう。

#GO言語の実行環境を構築
試しにGO言語の実行環境を構築してみます。
環境が変わればプレイングも変わるのが常ですが、
GOはオールラウンダーなので、さほど変わりませんから楽ですね。

“`
FROM mcr.microsoft.com/windows:1909

ENV GOLANG_VERSION 1.14.10
ENV GOLANG_DOWNLOAD_URL “https://golang.org/dl/go$GOLANG_VERSION.windows-amd64.zip”

RUN powershell -Command \
$ErrorActionPreference = ‘Stop’; \
(New-Object System.Net.WebClient).DownloadFile(‘%GOLANG_DOWNLO

元記事を表示

OTHERカテゴリの最新記事