基礎からわかる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"