今回は、Goのメソッドセットという概念を扱います 今回は、Goのメソッドセットという概念を扱います ゴール ゴール インタフェースを「実装する」という概念を通して、 インタフェースを「実装する」という概念を通して、メソッドセットとは何なのか メソッドセットとは何なのか 理解すること 理解すること 理解するメリット 理解するメリット Goの他の仕様を理解する助けになる Goの他の仕様を理解する助けになる Method calls - The Go Programming Language Specification Method calls - The Go Programming Language Specification (https://golang.org/ref/spec#Calls) (https://golang.org/ref/spec#Calls) Interface types - The Go Programming Language Specification Interface types - The Go Programming Language Specification (https://golang.org/ref/spec#Interface_types) (https://golang.org/ref/spec#Interface_types) 3 3
解答と解説︓空のインタフェース 解答と解説︓空のインタフェース インタフェース以外の全ての型は、デフォルトで空のメソッドセットを持つ インタフェース以外の全ての型は、デフォルトで空のメソッドセットを持つ 空のインタフェースは空のメソッドセットを持つので、全ての型の値を代⼊可能 空のインタフェースは空のメソッドセットを持つので、全ての型の値を代⼊可能 package main package main type Empty interface{} type Empty interface{} func main() { func main() { // 全ての値を代入可能 // 全ての値を代入可能 var _ Empty = nil var _ Empty = nil var _ Empty = 57 var _ Empty = 57 var _ Empty = "hoge" var _ Empty = "hoge" type Person struct { type Person struct { Name string Name string } } var _ Empty = Person{} var _ Empty = Person{} } } Run 26 26
コラム︓interfaceの値を利⽤するためには型アサーションが必要 コラム︓interfaceの値を利⽤するためには型アサーションが必要 package main package main func main() { func main() { var _ interface{} = nil var _ interface{} = nil var Num interface{} = -1 var Num interface{} = -1 // Numと1の型が異なるので、invalidな式の演算が原因でcompile errorになる // Numと1の型が異なるので、invalidな式の演算が原因でcompile errorになる // var _ int = Num + 1 // var _ int = Num + 1 // intとNumのUnderlying typeが異なるので、Coversionできないことが原因でcompile errorになる // intとNumのUnderlying typeが異なるので、Coversionできないことが原因でcompile errorになる // var _ int = int(Num) + 1 // var _ int = int(Num) + 1 // type assertionすればOK // type assertionすればOK var _ int = Num.(int) + 1 var _ int = Num.(int) + 1 } } Run 27 27