Golangでのつまずき その2

実践Go言語の説明を読んで実際にコードに書いて動作を確認したときにつまづいたポイントをまとめた。

埋め込みの動作確認でコンパイルエラー

また、埋込みを使うことで少し扱いやすくもなります。下の例では、通常の名前付きフィールドと並んで、埋込みフィールドを記述しています。

 type Job struct {
   Command string
    *log.Logger
 }

これでJob型は、*log.Logger型が持つLog、Logfといったメソッドを持つようになりました。もちろん、Loggerにフィールド名を与えることはできますが、それは必須ではありません。これで一度初期化すればJobのログが記録できるようになります。

  job.Log("starting now...")

この動作確認のため、以下のようなコードを書いた。

package main

import "log"

type Job struct {
    Command string
    *log.Logger
}

func main() {
    job := new(Job)
    job.Command = "aaa"
    job.Log("hoge")
}

コンパイル結果はjob.Log undefined (type *Job has no field or method Log)になった。

少なくとも、logの中でLog関数が定義されているらしき場所は見つからなかった。

説明の中で触れているlogが組み込みのlogではなかったのか、手元のGoのバージョンでlogの振る舞いが変わったのか。