やったもん勝ち

主にプログラミングのこと。生産性向上の某とかも。

goでよく使うスニペット(随時更新)

go modでのモジュール管理

以下のようなパスでプロジェクトを作成。 プロジェクトのパスは、以前はGOPATH配下に置かないとだめだったようだが、今はgo modで管理すればどこでもOK.

dirtest
├── go.mod
├── main.go
└── subpkg
    └── sub1.go

$go.moddirtest配下で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())

命名規則

関数名

  • キャメルケース
  • 公開する場合はアッパーキャメルケース
  • 公開しない場合はローワーキャメルケース