web-dev-qa-db-ja.com

Golangで構造体ポインターをインターフェイスポインターにキャストします

機能があります

func doStuff(inout *interface{}) {
   ...
}

この関数の目的は、任意のタイプのポインターを入力として扱うことができるようにすることです。しかし、構造体のポインターを使用して呼び出したい場合、エラーが発生します。

type MyStruct struct {
    f1 int
}

doStuffを呼び出すとき

ms := MyStruct{1}
doStuff(&ms)

私が持っています

test.go:38: cannot use &ms (type *MyStruct) as type **interface {} in argument to doStuff

&msをキャストして*interface{}と互換性を持たせるにはどうすればよいですか?

25
taharqa

「インターフェイスへのポインタ」などはありません(技術的には使用できますが、通常は必要ありません)。

golangのinterface {}の意味は何ですか? 」で見られるように、interfaceは2ワードのデータを持つコンテナです。

  • 1つのWordは、値の基になる型のメソッドテーブルを指すために使用されます。
  • もう1つのWordは、その値によって保持されている実際のデータをポイントするpointに使用されます。

interface

そのため、ポインターを削除すると、doStuffは正常に機能します。インターフェースのデータは&ms、ポインタ:

func doStuff(inout interface{}) {
   ...
}

この例 を参照してください:

ms := MyStruct{1}
doStuff(&ms)
fmt.Printf("Hello, playground: %v\n", ms)

出力:

Hello, playground: {1}

newacct 言及 コメント内

MyStructがプロトコルに準拠している場合、*MyStructもプロトコルに準拠しています(型のメソッドセットがそのポインタ型のメソッドセットに含まれているため)。

この場合、インターフェースは空のインターフェースなので、とにかくすべてのタイプを受け入れますが、それでも受け入れます。

51
VonC