goでよく使うスニペット(随時更新)
go modでのモジュール管理
以下のようなパスでプロジェクトを作成。 プロジェクトのパスは、以前はGOPATH配下に置かないとだめだったようだが、今はgo modで管理すればどこでもOK.
dirtest ├── go.mod ├── main.go └── subpkg └── sub1.go
$go.mod
はdirtest
配下でgo mod init dirtest
とすると、自動で作られる。
go.mod
module dirtest go 1.19
main.go
package main import ( "dirtest/subpkg" "fmt" ) func main() { fmt.Println("main is called.") subpkg.PrintHoge() }
sub1.go
package subpkg import "fmt" func PrintHoge() { fmt.Println("Hoge is called from subpkg") }
go mod を指定しないとmain.go:4:2: package dirtest/subpkg is not in GOROOT (/usr/local/go/src/dirtest/subpkg)
となる。
ちなみにvscodeで編集している場合、一度再起動しないと、補完が効かずずっとエディタ上でimportのエラーが解決しない問題があった。(これの調査に2時間くらいかかった。。。)
Tutorial: Create a Go module - The Go Programming Language
ファイルの読み込み
f, err := os.Open("words.txt") if err != nil { fmt.Println(err) } defer f.Close() b, err := ioutil.ReadAll(f) fmt.Println(string(b))
読み込み方法は複数あるようなので、ケースに適した方法を使用する。
for文
for i, v := range []string{"foo", "bar", "baz"} { fmt.Println(i, v) }
標準入力
var str string fmt.Scan(&str) fmt.Println(str, str)
s := bufio.NewScanner(os.Stdin) // 標準入力を受け付けるスキャナ s.Scan() // 1行分の入力を取得する fmt.Println(s.Text(), s.Text())
命名規則
関数名
- キャメルケース
- 公開する場合はアッパーキャメルケース
- 公開しない場合はローワーキャメルケース