読者です 読者をやめる 読者になる 読者になる

don-bra.co

さいきんはphpとたわむれてます

A Tour of Goをやってみて

Goの構文を学んでいきます。
今回はこのチュートリアルを通しました。

A Tour of Go

この記事でのサンプルコードはほとんどチュートリアルに載っているものです。packageやimportの記述を省略しているので、そのままでは実行できません。

超のつくほど初心者なので間違っているところがあればコメントもらえると、とっても助かります。。

Named return values

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

このreturnの後ろに何も書かないreturnを naked return と呼びます
戻り値は関数の宣言時に指定した(x, y int)になります。

forのセミコロン省略

func main() {
    sum := 1
    for sum < 1000 {
        sum += sum
    }
    fmt.Println(sum)
}

初期化と後処理は省略可能で、セミコロンも省略できます。 なのでこんな書き方も可能です。whileっぽく書けるみたいです。

defer

defer ステートメントは、 defer へ渡した関数の実行を、呼び出し元の関数の終わり(returnする)まで遅延させるものです。

mainの中に書いたら、main関数が終わる直前に呼び出されます。

func main() {
    defer fmt.Println("world")

    fmt.Println("hello")
}

実行結果は

hello
world

となります。

deferに渡した関数はlast-in first-out(後から入れたやつから出てくる)です。なので

func main() {

  fmt.Println("hello")

  defer fmt.Println("tea")
  defer fmr.Println("milk")
  defer fmt.Println("coffee")

  fmt.Println("world")
}

の結果は

hello
world
coffee
milk
tea

になります。

deferの使い所に関しては

遅延実行 - はじめてのGo言語

の記事がとてもわかりやすかったです!
ファイルを開いたあとに必ずcloseしたい時はdeferを用いるのが一般的なようです。

ポインタ

rubyくらいしかまともに勉強していないので理解が怪しいのですが。。
&オペレータは&の後ろの変数のポインタを取得します。

*オペレータは*の後ろの変数(ポインタ)が指す変数を示します。
*をつかって、変数に直接代入したりもできます。

func main() {
  i, j := 30, 140
  p := &i
  
  fmt.Println(p)
  fmt.Println(*p)
  
  p = &j
  *p = 155
  
  fmt.Println(j)
}

実行結果

0x10434114
30
155

fmt.Println(p)の結果は実行環境によって異なります。

とりあえずいったんここまでにします。なんかJavaっぽいなあと思いながら写経中です。