原文
Go是靜態(tài)類型的編程語言,變量的類型由存儲的值決定,因為數(shù)據不能像Python一樣動態(tài)的分配。
有一個T類型的變量left,可以通過6種方式突照,把right的值賦值到left邊迂苛。
1.相同的類型
這是很顯然的,當right的類型也是T的時候念祭,這種復制是完全有效的,詳見 "Identical types in Go"
2.相同的底層類型
在Go中任何類型都有一個底層類型碍侦。像布爾粱坤,數(shù)字,字符串或者文字類型的基礎類型是一樣的瓷产。除此之外底層類型只能通過一種方式聲明:
type X map[string]int
var x X // underlying type is map[string]int
還有一種可以分配的情況是站玄,當有相同的底層類型時:
type X map[string]int
var x X
var y map[string]int
x = y
當有兩個聲明的類型有相同的底層是,是不能相互賦值的:
type X map[string]int
type Y map[string]int
var x X
var y Y
x = y // cannot use y (type Y) as type X in assignment
也就是說賦值的時候濒旦,至少有一個類型不是自己聲明的類型株旷。
在Go里面的類型是可命名的也可以是未命名的。未命名的類型可以通過字面指定:
var a [10]string
var b struct{ field string}
var c map[string]int
3.接口賦值給實現(xiàn)了該接口的值
如果變量實現(xiàn)了接口T疤估,那么我們可以把T接口賦值給該變量灾常。
type Callable interface {
f() int
}
type T int
func (t T) f() int {
return int(t)
}
var c Callable
var t T
c = t
更多關于接口類型可以看 language spec
4.當通道的類型相同時,可以相互賦值
type T chan<- map[string]int
var c1 T
var c2 chan map[string]int
c1 = c2
c2 = c1 // cannot use c1 (type T) as type chan map[string]int in assignment
第二種情況有相同的底層類型铃拇,但是必須有一個是未命名的類型:
type T chan<- map[string]int
type T2 chan map[string]int
var c1 T
var c2 T2
c1 = c2 // cannot use c2 (type T2) as type T in assignment
5.nil分配
允許將nil分配給指針钞瀑,函數(shù),切片慷荔,映射雕什,通道,接口。
var a *int
var b func(int) int
var c []int
var d map[string]int
var e chan int
var f interface{}
a, b, c, d, e, f = nil, nil, nil, nil, nil, nil
var g [10]int
g = nil // cannot use nil as type [10]int in assignment
6.沒有命名類型的常量
可以在Go官方博客里面找到關于Go常量的深度介紹
未分配類型的常量可以賦值給類型為T的變量當常量是T的值贷岸。
var a float32
var b float64
var c int32
var d int64
const untyped = 1
a = untyped
b = untyped
c = untyped
d = untyped