Goの公式チュートリアルサイトに沿って勉強していきます。 気づいた点や理解があいまいな点をメモしています。

  • Packages, variables, and functions.(Go プログラムの基本的なコンポーネントを学びます。)
  • Flow control statements: for, if, else, switch and defer(条件文とループ、switch、defer を使ってコードの流れをコントロールする方法を学びます。) をやっていきます。

A Tour of Go_Packages, variables, and functions.

複数の戻り値

戻り値の型は、return より前で指定します。

func swap(x, y string) (string, string) {
    return x, y
}

named return

戻り値の変数に名前をつけると、関数の先頭で定義され、 return に何も書かずに返せるようになります。naked return と呼ぶそうです。

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

型推論と静的型付け

型を省略しても型推論します。

var i, j int = 1, 2
var c, python, java = true, false, "no!"

※型は実行時ではなくコンパイル時に確定します。

  • var x = 100 → xはint型
  • var s = "hello" → sはstring型

型と値の表示

型と値の両方を表示できます。

fmt.Printf("Type: %T Value: %v\\n", ToBe, ToBe)
  • %T:型(Type)を表示
  • %v:値(Value)を表示

ゼロ値(初期値)

変数を初期化せずに宣言すると、自動的にゼロ値が設定されます。

出力例: 0 0 false "" ゼロ値の種類: - 数値型:0 - bool型:false - string型:空文字列 ""

var i int
var f float64
var b bool
var s string
fmt.Printf("%v %v %v %q\\n", i, f, b, s)

型変換

var i int = 42
var f float64 = float64(i)
var u uint = uint(f)

このように省略して書くことができます。

i := 42
f := float64(i)
u := uint(f)

fmt.Println と fmt.Printf の違い

  • fmt.Println
    • 値をそのまま表示
    • 改行あり、自動で空白を挿入
  • fmt.Printf
    • フォーマット指定で出力
    • 改行なし、手動で書式を指定
    • 例:fmt.Printf("値は: %v", a)

for文の構造

  1. 初期化ステートメント
  2. 条件式
  3. 後処理ステートメント
sum := 0
for i := 0; i < 10; i++ {
    sum += i
}

文字列に変換

文字列変換関数: - fmt.Sprint(a, b):連結して文字列として返す - fmt.Sprintf("%s %d", a, b):フォーマットを使って文字列生成 - fmt.Println(a, b):標準出力(改行あり) - fmt.Print(a, b):標準出力(改行なし)

fmt.Sprint(math.Sqrt(x))

Goの while風ループ

Goには while がありません。 for を使って同様の記述ができます。

通常の for 文:

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

while風:

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

if文とスコープ

Goの if / else 文では、ブロック内に return 文がない場合、処理は後続のコードへ続きます。

実行の流れ: 1. pow(3, 2, 10)9 < 10 → return 9 2. pow(3, 3, 20)27 >= 20 → Print → return 20 → 出力:9 20

func pow(x, n, lim float64) float64 {
    if v := math.Pow(x, n); v < lim {
        return v
    } else {
        fmt.Printf("%g >= %g\\n", v, lim)
    }
    return lim
}

switch文

ifswtichの比較

  • 条件の評価
    • if:複雑な条件(論理式や比較)に対応
    • switch:値に対する分岐に向いている
  • 書き方
    • if:if 条件 { ... } else if ...
    • switch:switch 値 { case 値: ... }
  • 複数条件
    • if:if a == 1 || a == 2
    • switch:case 1, 2: で記述可能
  • 変数の定義
    • if:if x := ...; 条件 {}
    • switch:switch x := ...; x { case ... }
  • デフォルト分岐
    • if:else
    • switch:default
switch os := runtime.GOOS; os {
    case "darwin":
        fmt.Println("OS X.")
    case "linux":
        fmt.Println("Linux.")
    default:
        fmt.Printf("%s.\\n", os)
}

基本構文周りの章でした。

まだ基本構文が体に染みついてないので、LLMも使いながら頑張って復習します。

では、次はPart2で。