Golangでのつまずき

Go言語を覚えるために試してひっかかったポイントをまとめた。

Goのバージョンはgo version go1.10.3 darwin/amd64

  • :=を使った暗黙の変数定義を使えるのは関数の中だけ
    • aの定義をmain関数の中でするか,aの宣言にvarを使えばいい
    • :=のスコープが関数の中にしかないのはGoの仕様
package main
package main
import "fmt"
      
a:=5
func main() {
  if a > 2 {
    fmt.Println("a > 2")
  } else {
    fmt.Println("a <= 2")
   }
}

//コンパイル結果: ./main.go:5:1: syntax error: non-declaration statement outside function body   
  • 同じパッケージにある別のファイルで定義した関数の呼び出しでエラー

    • VSCodeではapp1.goのHoge()に定義ジャンプできるが、app1.goをビルドするとHogeは未定義だと言われる
    • go run app1.goで実行していたが、go runは指定したファイルのみがコンパイル対象になり、自動的に他のファイルを見てくれるわけではないとのこと
    • go run app1.go app2.goと実行すれば正しく動作する
  • app2.go

package main

// Compare compares byte arrays.
func Compare(a, b []byte) int {
    for i := 0; i < len(a) && i < len(b); i++ {
        switch {
        case a[i] > b[i]:
            return 1
        case a[i] > b[i]:
            return -1
        }
    }
    switch {
    case len(a) < len(b):
        return -1
    case len(a) > len(b):
        return 1
    }
    return 0
}

// Hoge is snipet for Compare function
func Hoge() int {
    b1 := []byte{1, 2, 3}
    b2 := []byte{1, 2, 3}
    return Compare(b1, b2)
}
package main

import (
    "fmt"
)

func main() {
    a := Hoge()
    fmt.Print(a)
}

// 実行結果: ./app1.go:8:7: undefined: Hoge
マップのエントリを削除するには、並列代入をひっくり返して、追加の論理値を右に書きます。論理値がfalseならエントリは削除されます。キーが既にマップから削除済みであっても安全に行う事ができます。

timeZone["PDT"] = 0, false;  // Now on Standard Time
  • 書いたコード
package main

import (
    "fmt"
)

var timeZone = map[string]int{
    "UTC": 0 * 60 * 60,
    "EST": -5 * 60 * 60,
    "CST": -6 * 60 * 60,
    "MST": -7 * 60 * 60,
    "PST": -8 * 60 * 60,
}

var tz string
var seconds int
var ok bool

func main() {
    tz = "EST"
    timeZone[tz] = 10, false
    fmt.Println(timeZone[tz])
}

 // assignment mismatch: 1 variables but 2 values