Goの勉強をやり始めたのでメモ。
「プログラミング言語 Go」を読んでる。
インストール
公式サイトからインストールできる。
前にやったときはインストーラなんてなかった気がするけど、最近はあるみたい。
GOPATH, ROOTPATH
よくわかってないけどGoLandの場合は設定すると動かなくなる。
フォーマット
とりあえず gofmt
と goimports
を設定しとけば良さそう。
GoLandではFileWatchers
で設定できる。
変数
var s string s := ""
のように書く。
初期値を設定しなかった場合はゼロ値が入るので、上の2つは同じ意味。
定数
const ( seconds = 60 minutues = 60 hours = 24 )
のように書く。コンパイル時に値が確定しているものを定数として扱う。
条件分岐
if
if a > 0 { }
また、変数宣言なども同時に行える。
if err := request.ParseForm(); err != nil { }
こちらのほうがスコープが短くなるので良いらしい。
switch
switch variable { case 1: return "one" case 2: return "two" default: return "other" }
PHPと違って次のcaseには抜けない。次のcaseに抜けさせたい場合は fallthrough
を使う。
タグなしswitchもある。
switch { case num > 0: return "正の数" case num == 0: return "ゼロ" default: return "負の数" }
これは便利。PHPにもきてほしい。
ループ
とりあえず以下の2通り。whileなどない。
for i := 0; i < 10; i++ { } for index, value := range array { }
引数
基本は値渡しではなく参照渡しになる。
ポインタを使うケースもあるが、使い分けはまだわかってない。
コマンドライン引数
args := os.Args()
で取れる。
マップ
items = make(map[int]string)
のように書ける。PHPのように何でも有りの連想配列ではなさそう。
ゴルーチン
非同期処理。
func main() { ch := make(chan string) go fetch("https://example.com", ch) go fetch("https://example.org", ch) fmt.Println(<-ch) fmt.Println(<-ch) } func fetch(url string, ch chan<- string) { res, err:= http.Get(url) if err != nil { ch <- fmt.Sprint(err) return } ch <- res.Status }
のように書く。
go
でゴルーチンを作成し、それぞれのゴルーチンが非同期で動作する。
channel
を使ってやり取りをする。いずれかのゴルーチンがチャンネルに対して受信・送信をするとそのゴルーチンは待機状態になり、他のゴルーチンが受信・送信することで処理が再開される。
無名関数
handler := func() { }
名前付き型
type Point struct { X, Y int }