2010年11月12日金曜日

Goの仕様変更

Go一周年ということで久しぶりに最新版にしたところ、コンパイルエラーが発生したのでその原因を探してみた。結果、いくつか仕様に変更があったことが判明。自分に影響があったのは以下の2つ。

  • 2010-10-13のリリースでインターフェースへのポインタが自動的に参照されなくなった
  • 2010-10-20のリリースでlogパッケージのインターフェースが変更になった

インターフェースへのポインタの扱いが変更

リリースノートの該当箇所は以下。

The language change is that uses of pointers to interface values no longer
automatically dereference the pointer.  A pointer to an interface value is more
often a beginner’s bug than correct code.

ようするにインタフェースのポインタとか使うなよ!という変更点。自分のコードでは次のように変える必要があった。ちなみに変更前のコードではconn.Closeでコンパイルエラー(undefinedエラー)が起きてた。

変更前

func communicate(conn *net.Conn) {
    defer func() {
        conn.Close()
    }()
(以下略)

変更後

func communicate(conn net.Conn) {
    defer func() {
        conn.Close()
    }()
(以下略)

logパッケージのインタフェースが変更

個人的に結構影響のあった変更。関数名やらが変わったので色々置換する必要があった。

変更前

var logger *log.Logger = log.New(os.Stdout, nil , "", log.Lok)
logger.Log("Error")

変更後

var logger *log.Logger = log.New(os.Stdout, "", 0)
logger.Print("Error")

0 件のコメント:

コメントを投稿