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のリリースノートにある言語変更について、まとめてみました。