基礎からわかるGo言語 改訂2版 備忘録

関数宣言のコードスタイル

開始波カッコをfuncと同じ行に記述する

OK

func main() {
   fmt.Println("hoge")
}

だめ

func main()
{
    fmt.Println("hoge")
}

ソースコードの整形

go fmt ソースファイル名

型なしと型ありを計算させると型ありの方の型になる

package main
import "fmt"

const C1 = 12345
const C2 int = 34567

func main() {
     var x int = C1 * C2 // C2がintなので型を持たないC1もintとして計算される
}

インクリメント/デクリメントは文

var x int = i++ // エラー
fmt.Println(i--) // エラー

同時に複数の変数に代入可能

c, d = 3.14, "abcdefg"

e, f = fn() // 2つの値を返す関数fnの戻り値を代入できる

ブランク識別子

代入はできるが取得はできない

a, _ = fn() // 1つ目の戻り値しかいらない場合2番目の戻り値をブランク識別子に代入する

変数宣言

var x int

var a, b, c int

var (
    i int
    s1, s2 string
)

i := 123

ii, s := i, "hoge"

ルーンリテラル

a := 'a' // 値は97(U+0061)
A := 'A' // 値は64(U+0041)

文字列リテラル

a := "ダブルクオートではエスケープが解釈される"
b := `バッククオートではエスケープは解釈されない`
c := `バッククオートを使うと
改行も含められる`

iota列挙子

const (
    ZERO = iota
    ONE = iota
    TWO = iota
    THREE = iota
    FOUR = iota
)

2回目以降は省略できる

const (
    ZERO = iota
    ONE
    TWO
    THREE
    FOUR
)

識別子をエクスポートする

static的な?

const Export = true

for

一般的な例

for i := 0; i < 5; i++ {
    fmt.Println(i)
}

初期化文と後処理文が不要ならセミコロンだけでOK

for ; i < 5; {
    // do something
}

range式を使用する(Javaでいう拡張for文)

arr := [...]int{0, 1, 2, 3, 4}

for i := range arr {
    fmt.Println(i)
}

while

for i < 5 {
    // do something
}

無限ループ

for {
    // do something
}

ifの条件式の前に文を記述可能

if x, y := hoge(i); x < y {
  // do something
}

switch節内のcase節に条件式が指定できる

switch {
case i > 0:
    fmt.Println("+")
case i < 0:
    fmt.Println("+")
default:
    fmt.Println("0")
}

構造体

type MyData struct {
    s string
    b byte
}

var m MyData
m.s = "hoge"