Go1.14の環境でコードを書いてて、GCP等のgo1.13環境向けデプロイする際に気づいたのですが、Go1.14より重複するメソッドを持つインターフェスの複数埋め込みが可能になっていました。これについては、Go1.14リリースノートにも記載があり、言語に関する変更の内容についてです。
目次
インターフェスの埋め込みとは
すでに定義済みのインターフェスがあり、その機能を他のinterface定義で利用することです。下記に例を示します。下記例では、io
パケージがすでに定義しているio.ReadCloser
というインターフェスをCustomReadCloser
インターフェスでは、埋め込んで定義しています。
// on Package io : // type ReadCloser interface { // Reader // Closer // } import io type CustomReadCloser interface { io.ReadCloser isClosed() bool }
重複するメソッドを持つインターフェス埋め込みとは
下記の例があたります。SQLCloser
,MongoCloser
インターフェスともにSample
インターフェス、io.Closer
を通して2つの同一シグネチャーのClose
を埋め込んでいます。
// Closer is the interface that wraps the basic Close method. // // The behavior of Close after the first call is undefined. // Specific implementations may document their own behavior. type Closer interface { Close() error } ・・・ // Sample is Handle method type Sample interface { io.Closer } // SQLCloser is SQLCloser type SQLCloser interface { Sample io.Closer } // MongoCloser is mongo closer type MongoCloser interface { Sample io.Closer }
go1.13とgo1.14での実行結果
下記のようなサンプルでgo1.13での実行結果を確認します。
package main import ( "fmt" "io" "time" ) // Sample is Handle method type Sample interface { io.Closer } // SQLCloser is SQLCloser type SQLCloser interface { Sample io.Closer } // MongoCloser is mongo closer type MongoCloser interface { Sample io.Closer } func main() { fmt.Println("Wait") }
go1.13でビルドを実行した場合は、下記のようにClose
メソッド定義が重複しているとエラーが表示されます。
/usr/local/Cellar/go@1.13/1.13.15/bin/go build -o sample sample.go ./sample.go:17:5: duplicate method Close ./sample.go:23:5: duplicate method Close
おわりに
2020年9月8日時点では、一般提供は、GCP
のCloud functions等でサポートしているgolangのruntimeは、1.13
なので、1.14
で中〜大規模で開発したアプリケーションをcloud functions等
のサーバーレスフレームワークで動作させようとすると発生する可能性もあるかもしれないですね。今回は、go1.14のリリースノートにある言語変更について、まとめてみました。