標準パッケージ

archive/tar

https://golang.org/pkg/archive/tar/

tarアーカイブへのアクセスを実装。

archive/zip

https://golang.org/pkg/archive/zip/

ZIPアーカイブの読み書き機能を提供。

bufio

https://pkg.go.dev/bufio

バッファリング付きI/Oを提供する。

Examples:

// 1行ずつテキストを読み込んで、EOFが入力されるまで読んだ行をそのまま表示し続ける
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
	fmt.Println(scanner.Text()) // Println will add back the final '\n'
}
if err := scanner.Err(); err != nil {
	fmt.Fprintln(os.Stderr, "reading standard input:", err)
}

実行例:

$ go run main.go
xx yy zz
xx yy zz
a   b c   d
a   b c   d
     # 注: 空入力で改行しても処理は終わらない

     # EOF入力で終了

Tips:

  • 1行だけ読み取るなら、Scan()を1回だけ実行すればよい

参考:

func NewScanner

https://pkg.go.dev/bufio?tab=doc#NewScanner

func NewScanner(r io.Reader) *Scanner

rに対するScannerを生成。
デフォルトで改行区切りとなる。

type Scanner (struct)

https://pkg.go.dev/bufio?tab=doc#Scanner

スキャナーオブジェクト。読み取ったテキストやエラーを保持する。

func Split

https://pkg.go.dev/bufio?tab=doc#Scanner.Split

func (s *Scanner) Split(split SplitFunc)

読取り時にテキストを分割する方法(1回のs.Scan()でどこまで読み取るか)を変更する。

Example:

scanner := bufio.NewScanner(strings.NewReader(input))
// 空白文字区切りで読み取る
scanner.Split(bufio.ScanWords)
// Count the words.
count := 0
for scanner.Scan() {
	count++
}
// エラー処理は省略
fmt.Printf("%d\n", count)

See also https://pkg.go.dev/bufio?tab=doc#example-Scanner-Words

compress/gzip

https://pkg.go.dev/compress/gzip

RFC 1952に準拠したgzip圧縮ファイルの読み書き。

context

https://golang.org/pkg/context/

Webサーバとかで引きずり回すコンテキスト。

Examples:

ctx := context.Background() # context.Contextな構造体を生成

// タイムアウト付きコンテキストを生成。cancelはタイムアウト時に実行される
ctx2, cancel := context.WithDeadline(ctx, time.Now().Add(timeout))
defer cancel()

// 時間指定。↑とほぼ同じだと思う
ctx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond)
defer cancel()

参考:

contextとは

contextパッケージのgodoc序文より。

contextパッケージはContext型を定義する。 これはタイムアウトやキャンセルのためのシグナルなどリクエストに紐づく値を保持する。 これらの値はAPIの境界を越えるものだったり、プロセス間で使われるものだ。

  • サーバに入ってくるリクエストはContextを作るべきだし、サーバへのリクエストはContextを受け入れるべき
  • これらの間(サーバがリクエストを処理する間 or Contextを生成してサーバにリクエストを送信するまでの間)で関数が連鎖するときは、Contextは伝播しないといけない
  • ただし、伝播してきたContextをWithCancelやWithDeadline, WithTimeout, WithValueで作り直したContextに置き換えることができる
  • Contextがキャンセルされたとき、そのContextに由来するすべてのContextも同様にキャンセルされるべきである。

Context利用時の作法:

  • Contextを構造体の中に保持してはいけない。必要とする全ての関数に明示的に渡すこと。第1引数として、典型的には ctx を仮引数名とする
  • 関数が許していても、Contextにnilを渡さないこと。代わりに context.TODO を渡すこと
  • context ValuesはプロセスやAPIをまたぐリクエストスコープのデータに使うようにして、関数へのオプショナルなパラメータのために使わないこと

ユースケース:

  • goroutineのキャンセル

参考:

crypto/sha256

https://golang.org/pkg/crypto/sha256/

SHA224, SHA256ハッシュアルゴリズムの実装。

func New

https://golang.org/pkg/crypto/sha256/#New

func New() hash.Hash

Example:

h := sha256.New()
h.Write([]byte("hello world\n"))
fmt.Printf("%x", h.Sum(nil))

go/build

https://golang.org/pkg/go/build/

Goパッケージの情報を集める。

Build Constraints

https://golang.org/pkg/go/build/#hdr-Build_Constraints

build tagのこと。
ここに詳しい仕様が書いてある。

関連項目:

Example:

// +build linux,386 darwin,!cgo

build tagは、上のように // +build で始まる行に記される。

, 区切りでAND条件を、スペース区切りでOR条件を、 ! をprefixにつけることでNOT条件を表す。
即ち、上のbuild tagをブール演算で表記すると、

(linux AND 386) OR (darwin AND (NOT cgo))

となる。

コマンド実行例:

go build -tags linux       # マッチしない
go build -tags linux,386   # マッチする
go build -tags darwin      # マッチする
go build -tags darwin,cgo  # マッチしない

-tags オプションで指定されたbuild tagにマッチしない場合、そのファイルは無視され、コンパイル対象とならない。

メモ:

  • GOOS, GOARCH といったクロスコンパイル時に指定される環境変数もbuild tagとして渡されるのだと思う

特別なbuild tagとして、以下を記すと常にコンパイル対象から除外される:

// +build ignore

Spec:

  • build tagはファイルの先頭に書かなければならない
  • build tagを複数行書くこともできる。評価される条件は、各行のAND条件になる
  • build tagを記した後には空行が必要

参考:

hash

https://golang.org/pkg/hash/

データのハッシュ値を求めるためのインタフェースを提供する。

利用例については、crypto/sha256#Newを参照。

hash/crc32

https://golang.org/pkg/hash/crc32/

CRC-32の実装。

関連項目:

func NewIEEE

https://golang.org/pkg/hash/crc32/#NewIEEE

func NewIEEE() hash.Hash32

log

https://golang.org/pkg/log/

ロガー。ログレベルの概念はない。

log.Print など、標準のロガーを使うやり方と、 log.New(...)Logger を作って使うやり方がある。

SYNOPSIS:

// 標準のロガーを使う
log.SetPrefix("[info] ")
log.Printf("a = %v", a)

// ロガーを生成して使う
logger := log.New(os.Stderr, "[error] ", flag.LstdFlags|flag.Llongfile)
if err != nil {
  logger.Fatalf("Error! %v", err) // ログ出力後、 os.Exit(1)
}

関連項目:

Constants

https://pkg.go.dev/log?tab=doc#pkg-constants

const (
	Ldate         = 1 << iota     // the date in the local time zone: 2009/01/23
	Ltime                         // the time in the local time zone: 01:23:23
	Lmicroseconds                 // microsecond resolution: 01:23:23.123123.  assumes Ltime.
	Llongfile                     // full file name and line number: /a/b/c/d.go:23
	Lshortfile                    // final file name element and line number: d.go:23. overrides Llongfile
	LUTC                          // if Ldate or Ltime is set, use UTC rather than the local time zone
	Lmsgprefix                    // move the "prefix" from the beginning of the line to before the message
	LstdFlags     = Ldate | Ltime // initial values for the standard logger
)

↑log.Newするときflag引数に与えるビット列の定義。

runtime

https://golang.org/pkg/runtime/

Goのランタイムとやりとりする操作を提供するパッケージ。

Examples:

// スタックトレースの表示
// iをインクリメントしていき、スタックトレースを表示する
i := 0
for {
    pt, file, line, ok := runtime.Caller(i)
    if !ok {
        // 取得できなくなったら終了
        break
    }
    funcName := runtime.FuncForPC(pt).Name()
    fmt.Printf("file=%s, line=%d, func=%v\n", file, line, funcName)
    i += 1
}

参考:

Constants

const (
  // 386, amd64, arm, s390x, and so on
  GOARCH string = sys.GOARCH
  // darwin, freebsd, linux, and so on
  GOOS string = sys.GOOS
)

Tips:

  • GOOSとGOARCHの組合せを見るには go tool dist list を実行するといい

sort

https://golang.org/pkg/sort/

スライスやユーザ定義のコレクションをソートするプリミティブを提供。

func Sort

https://golang.org/pkg/sort/#Sort

func Sort(data Interface)

dataの中身を昇順に並び替える。

  • data.Lenを1回実行
  • O(n*log(n)) 回数、data.Lessとdata.Swapを実行

func Strings

https://golang.org/pkg/sort/#Strings

func Strings(a []string)

stringのスライスを昇順に並び替え。

Example:

s := []string{"Go", "Bravo", "Gopher", "Alpha", "Grin", "Delta"}
sort.Strings(s)
fmt.Println(s)
//=> [Alpha Bravo Delta Go Gopher Grin]

strconv

https://pkg.go.dev/strconv

文字列と基本データ型間の変換機能を実装している。

Example:

v := "10"
if s, err := strconv.Atoi(v); err == nil {
	fmt.Printf("%T, %v", s, s) //=> int, 10
}

syscall [Deprecated]

https://golang.org/pkg/syscall/

=> https://pkg.go.dev/golang.org/x/sys

Go 1.4でフリーズされて、上に移ったみたい。

参考:

time

https://golang.org/pkg/time/

SYNOPSYS:

td = 30 * time.Seconds() # time.Duration型で30
t1 = time.Now() # 現在日時を time.Time型で返す
t2 = t1.Add(td) # 30秒後の日時を time.Time型で

Examples:

func After

https://golang.org/pkg/time/#After

func After(d Duration) <-chan Time

タイムアウトを実現するときによく使われる。

Example:

select {
case m := <-c:
        handle(m)
case <-time.After(5 * time.Minute):
        fmt.Println("timed out")
}

More examples: