Open9

Golangを勉強していく

winnie279winnie279

Golangに入門する

Goの公式チュートリアル[1]をやってみた。

Goのモジュールを作成する。

cd  # example
mkdir hello
cd hello
go mod init example/hello  # モジュールを初期化

カレントディレクトリにhello.goを作成する。

hello.go
package main

import "fmt"

import "rsc.io/quote"

func main() {
    fmt.Println(quote.Go())
}

hello.goを実行する。

go mod tidy  # 外部モジュールを追加
go run .  # Don't communicate by sharing memory ...
脚注
  1. https://go.dev/doc/tutorial/getting-started ↩︎

winnie279winnie279

例外処理ないらしいぞ。エラーがnilかどうか判断する。

type error interface {
  Error() string
}

panic()は継続不可能なエラー。あまり使わないらしい。
error interfaceをチェックするのが一般的。

errは関数の最後の返り値に与える。その後の処理ではerrを最初に処理する。

hoged, err := hoge()
if err == nil {
  ...
}
winnie279winnie279

実用Go言語

winnie279winnie279

1章

命名はできる限りシンプルに。
errorではなくerrhttp.HTTPServerではなくhttp.Server

名前の後ろに型名をつけるとその型に束縛されますが、つけなければ「定数」のままで、型がありません。
定数をvarに割り当てたり、関数の引数として渡すこともできます。このときに型が指定されていなければ、それぞれの定数のデフォルトとなる型(int、float64、bool、string)が設定されます。

識別子

識別子(変数、関数、クラスなどの名前)

固定長の配列より可変長のスライスを使うことが多い。
スライスの裏では配列が割り当てられており、一定の長さを超えると裏の配列がサイズの大きい配列にコピーされる。これはパフォーマンスの低下につながる恐れがある。そのため、スライスの最小長がわかっている場合にはmake()を使って事前に必要な長さを確保しておくと良い。

実際に配列を使うことはあるのか?

defer便利らしい。for文の中で使わないように注意。

1.9 文字列の結合方法

文字列はイミュータブルなので、+演算子で結合すると新たな文字列が生成されてしまう。strings.Builderを使うと良い。

1.10 日時の取り扱い

日時形式の指定はJan 2 15:04:05 2006 MSTのように行う。
また既存のフォーマットが定義されており、JavaScriptとの互換性を考えるとtime.RFC3339Nanoなどが使える。

winnie279winnie279
winnie279winnie279

Basics

Packages, variables, and functions.

Named return values

返り値に名前を付けられる。また、名前を付けると返り値を省略できる(naked return)。
ただし、可読性の点から短い関数でのみ使うべきである。

func split(sum int) (x, y int) {  // x, y
	x = sum * 4 / 9
	y = sum - x
	return  // naked return
}
Zero values

宣言時に値を代入しなくても初期値(初期化子)が入る。
なお、初期値を与えた場合は型を省略できる。

var i int
fmt.Print(i)  // 0