理解するメリット 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
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
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
型 型 T T のメソッドセットは、レシーバ型 のメソッドセットは、レシーバ型 T T で宣⾔された全てのメソッドの集合 で宣⾔された全てのメソッドの集合 型 型 *T *T のメソッドセットは、レシーバ型 のメソッドセットは、レシーバ型 T T または または *T *T で宣⾔された全てのメソッドの集合 で宣⾔された全てのメソッドの集合 埋め込みフィールドを持つ構造体については、更なる規則が適⽤される 埋め込みフィールドを持つ構造体については、更なる規則が適⽤される それ以外の型は、空のメソッドセットを持つ それ以外の型は、空のメソッドセットを持つ 28 28