【学習記録】Golangの入門
記事内容
- Golangの入門を行うので、その記録をする。
- 開始日は2021/07/22
- 暫定の目標としては「チャット」を作る
リンク(自分用)
備考
個人的なメモ書きです。
その場の思いつきで書くことが多いので、体系だってません。。。
色々と知識が集まったら、整理とかしようかなと思っています。
For文
package main
import "fmt"
func main() {
sum := 0
for i := 0; i < 10; i++ {
sum += i
}
fmt.Println(sum)
}
ポイント
- 基本は他言語と同じ。
- ただし()で括る必要はなし。
If文
package main
import (
"fmt"
"math"
)
func sqrt(x float64) string {
if x < 0 {
return sqrt(-x) + "i"
}
return fmt.Sprint(math.Sqrt(x))
}
ポイント
- 基本的に他言語と同じ
- ただしこちらの()でくくる必要なし。
for文2
Arrays(配列)
固定長。
スライス
可変長。
データを柔軟に格納できる。
大きさの指定をしない
ary := []string{"12", "23", "34"}
追加
newSlice =append(slice, 要素)
range
var slice = []string{"1", "2", 3"}
for index, value := range slice {
//処理
}
range節は、「スライス」や「マップ」を一つずつ反復処理するために使う節。
スライスをrangeで利用する場合、2つの変数が必要。
1つ目がindex
2つ目がvalue
不要な値は_で受け取れば使わなくて済む。
Goのパッケージ管理
(めっちゃ内容飛んでる気が・・・)
概要
GOMODULEというパッケージ管理を使うと良い。
(イメージとしてはpipとかかな?)
初期設定
go mod init gomodtest
パッケージ追加
go get -u go.uber.org/zap
パッケージをゲットする。
go.sumファイルが増える。
パッケージが不正な改善がされていないか、確認できるらしい。
既存のモジュールのインストール
go mod tidy
pip install フリーズしたファイル
みたいなイメージ?
疑問1
API仕様書の自動生成ってどうやるんだろ?
go-swagger
go-swaggerとかいうフレームワークを使って、自動的に作るっぽい。
要調査。
タスク
- go-swaggerを調べる。
gRPC
調べてると、なんかgRPCっていう規格を見つけた。
一見してすごい便利そうだったので、試しに使ってみる。
参考
一番わかりやすいので参考にさせていただいた。
調べたいこと
- RPCっていう規格って何?
- Flutterから使える?
- ドキュメントの作り方
Dockerで実行するまで
Dockerで実行するには。
上記の記事を参考にするとできた。
go + VSCodeでなんか依存関係のエラーが出る
何故かこの組み合わせだと、エラーが出る。
環境
VSCode:
versrion: 1.58.2
go:
version: 1.16.6
事象
以下のエラーでVSCodeがグルグルする。
Error loading workspace: You are outside of a module and outside of $GOPATH/src. If you are using modules, please open your editor to a directory in your module. If you believe this warning is incorrect, please file an issue: https://github.com/golang/go/issues/new.
原因
gopllsというツールのエラーだそうです。
解決
エラーのところを解消すれば、ひとまずエラーは消える。
継続1
次は、go moduleで「github.com/gin-gonic/gin」がインポートできない問題が発生。
調査[継続1]
なんかムズそう。
根本的にそういった事象が起きてるっぽい?
解決
一応解決はできた。
やったこととしては、VSCodeの各ワークスペースのsettingsパスに、ワークスペースのパスを「GOPATH」を通すことで解決?
(なんか無理矢理感ある気がする)
原因?
(推測多め。信憑性は低)
WORKSPACEを複数開くことで、golpsがうまく読み取れてないっぽい?
実際、「go run」コマンドを叩くと、基本的に動く。
手順
手順としては以下の通り。
- WORKSPACEで「CTRL + SHIFT + P」で「設定」を呼び出す。
- settings.jsonを出す(なんか適当なファイル触れば出てくる)
- 「"go.gopath": "該当のワークスペース"」これをsettings.jsonに追加する。
- 再起動するとエラー解消する。
備考
根本解決って感じがしない。
なんとなく、今回の原因として「複数ワークスペース」を開いた時に起こる事象だと思った。
(単一のワークスペースだと、この問題が出ない)
settings.jsonを追加しないなら、ワークスペースを1つだけにすることで回避。
The Go language server is currently not supported in a multi-root set-up with different GOPATHs.
普通にエラーで出てきた。
The workspace module feature is currently available as an opt-in experiment, and it will allow you to work with multiple modules without creating workspace folders for each module. You can try it out by configuring the experimentalWorkspaceModule setting.
お、これっぽい。
リンク先を見ると、settings.jsonの設定があった。
experimentalWorkspaceModule
この値をfalseにすることで、回避できた!!
ざっと読んだ感じ、最近のgoはマルチモジュールを許可してない?っぽい。
いや、もっと面倒くさいっぽい。
この設定をちゃんとやらないといけないっぽい。
ちょっと導入には重たいかな。
対応
いったんはIDEで対応。
利用するのは「GoLand」で。
(さらばVSCode……)
そもそもgoplsの設定はずせば解決やないか……
(なんでgopls入ってるんだろ。入れた覚えなし)
手順
- ctrl + shift + P
- preference
- goのuse language serverを無効化する。
- おわり
Structに関して
構造体。
C++を少し触った時に学んだぐらいの知識。
Structのタグ
goの構造体は、タグを付与して「参照可能なメタ情報」をつけることができるらしい。
type Organization struct {
Name string `label:"名前"`
Language string `label:"言語"`
}
用途
- jsonパッケージでは、jsonタグを参照してキー名を利用する。
- バリデーションにも使える
(詳しいことはリンク先の方が解説してるので、そちらを参照)
タグは複数つけられる
type Organization struct {
Name string `label:"名前" json:"name" validate:"required"`
Language string `label:"言語" json:"language" validate:"required"`
}