Goの勉強 チュートリアル

Goの勉強をやり始めたのでメモ。
プログラミング言語 Go」を読んでる。

インストール

公式サイトからインストールできる。
前にやったときはインストーラなんてなかった気がするけど、最近はあるみたい。

GOPATH, ROOTPATH

よくわかってないけどGoLandの場合は設定すると動かなくなる。

フォーマット

とりあえず gofmtgoimports を設定しとけば良さそう。
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  
}