Go Go The Go Programming Language Specification The Go Programming Language Specification (https://yyh-gl.github.io/tech-blog/blog/uncredible-codes-from-go-spec/) (https://yyh-gl.github.io/tech-blog/blog/uncredible-codes-from-go-spec/) Twitter: @yyh_gl Twitter: @yyh_gl (https://twitter.com/yyh_gl) (https://twitter.com/yyh_gl) 3 3
identical syumai (hoge) (hoge) package main package main import "fmt" import "fmt" func main() { func main() { var x int = 1 var x int = 1 var t1 int = x // t1およびxの型はint var t1 int = x // t1およびxの型はint fmt.Println(t1) // 1 fmt.Println(t1) // 1 var y string = "yyy" var y string = "yyy" var t2 int = y // t2とyの型が異なるのでエラー var t2 int = y // t2とyの型が異なるのでエラー } } Run 9 9
underlying type && T V defined type && T V defined type package main package main import "fmt" import "fmt" const one int = 1 const one int = 1 type ( type ( T1 struct{ number int } // T1のunderlying typeはstruct{ number int } T1 struct{ number int } // T1のunderlying typeはstruct{ number int } T2 int // T2のunderlying typeはint T2 int // T2のunderlying typeはint ) ) func main() { func main() { // underlying typeが同じ(struct{ number int })であり、 // underlying typeが同じ(struct{ number int })であり、 // なおかつ、一方(struct{ number int }{number: 1})がdefined typeではないため代入可能である // なおかつ、一方(struct{ number int }{number: 1})がdefined typeではないため代入可能である var t1 T1 = struct{ number int }{number: 1} var t1 T1 = struct{ number int }{number: 1} fmt.Println(t1) // {1} fmt.Println(t1) // {1} // underlying typeは同じ(int)だが、T2およびintがともにdefined typeであるため代入不可能である // underlying typeは同じ(int)だが、T2およびintがともにdefined typeであるため代入不可能である var t2 T2 = one var t2 T2 = one } } Run 10 10
DQNEO Nobishii DQNEO Nobishii underlying type by. DQNEO underlying type by. DQNEO (https://docs.google.com/presentation/d/1JUiZ-SdXbFvi8_hJZ-ouJbDdEJGT- (https://docs.google.com/presentation/d/1JUiZ-SdXbFvi8_hJZ-ouJbDdEJGT- op827O7V7HUAWU/edit#slide=id.p) op827O7V7HUAWU/edit#slide=id.p) defined type by. Nobishii defined type by. Nobishii (https://docs.google.com/presentation/d/1JSsrv404ZDJSnxp4UcJ3iVYDJAiT3RyETMe9AvbkxuY/edit#slide=id.gbb52947b14_0_62) (https://docs.google.com/presentation/d/1JSsrv404ZDJSnxp4UcJ3iVYDJAiT3RyETMe9AvbkxuY/edit#slide=id.gbb52947b14_0_62) 11 11
&& T x V && T x V && T V defined type && T V defined type package main package main import "fmt" import "fmt" type T <-chan int // Tはchannel type type T <-chan int // Tはchannel type func main() { func main() { x1 := make(chan int, 1) // x1は要素の型がintの双方向チャネル x1 := make(chan int, 1) // x1は要素の型がintの双方向チャネル var t1 T = x1 // t1およびx1の要素の型は同じ(int) var t1 T = x1 // t1およびx1の要素の型は同じ(int) fmt.Println(t1) // アドレス情報 fmt.Println(t1) // アドレス情報 x2 := make(chan string, 1) // x2は要素の型がstringの双方向チャネル x2 := make(chan string, 1) // x2は要素の型がstringの双方向チャネル var t2 T = x2 // t2およびx2の要素の型が異なるので代入不可能である var t2 T = x2 // t2およびx2の要素の型が異なるので代入不可能である } } Run 13 13
import "fmt" import "fmt" type T *int type T *int func main() { func main() { var x func() // 関数型のゼロ値はnil var x func() // 関数型のゼロ値はnil fmt.Println(x) // <nil> fmt.Println(x) // <nil> var t T = x // xはnilだが事前宣言された識別子としてのnilではないため代入不可能である var t T = x // xはnilだが事前宣言された識別子としてのnilではないため代入不可能である } } Run 15 15
(https://golang.org/ref/spec#Constants) (https://golang.org/ref/spec#Constants) package main package main import "fmt" import "fmt" const num = 1 // 型が宣言されていない=型無し定数 const num = 1 // 型が宣言されていない=型無し定数 func main() { func main() { var i int = num // 暗黙的な変換により定数numはint型として扱われる var i int = num // 暗黙的な変換により定数numはint型として扱われる fmt.Printf("%T", i) // int fmt.Printf("%T", i) // int } } Run 17 17
package main package main import "fmt" import "fmt" // 型が宣言されていない=型無し定数 // 型が宣言されていない=型無し定数 const x = 1000 const x = 1000 func main() { func main() { var t1 int = x // x=1000はintで表現可能である var t1 int = x // x=1000はintで表現可能である fmt.Println(t1) // 1000 fmt.Println(t1) // 1000 var t2 int8 = x // x=1000はint8(-128~127)で表現できないため代入不可能である var t2 int8 = x // x=1000はint8(-128~127)で表現できないため代入不可能である } } Run 18 18