Type assertions
x.(T) 断言x不是空值,并且x中存储的值属于T类型。符号x.(T)称为类型断言。 如果T不是接口类型,x.(T)断言x的动态类型与T类型相同。在这种情况下,T必须实现x的(接口)类型;否则,类型断言是无效的,因为x不可能存储T类型的值。如果T是接口类型,则x.(T)断言x的动态类型实现了接口T
如果类型断言成立,则表达式的值就是存储在x中的值,其类型为t。如果类型断言为假,则会发生运行时恐慌。换句话说,即使x的动态类型只在运行时知道,x.(T)的类型在正确的程序中是已知的。
var x interface{} = 7 // x has dynamic type int and value 7
i := x.(int) // i has type int and value 7
type I interface { m() }
func f(y I) {
s := y.(string) // illegal: string does not implement I (missing method m)
r := y.(io.Reader) // r has type io.Reader and the dynamic type of y must implement both I and io.Reader
…
}
go语言的类型推断能带来哪些好处?
明显提示程序的灵活性,使得代码重构变得更加容易,同时又不会给代码的维护带来额外负担,更不会损失程序的运行效率
Alias declarations
type (
nodeList = []*Node // nodeList and []*Node are identical types
Polar = polar // Polar and polar denote identical types
)
别名类型主要是为了代码重构而存在的
Type definitions
type (
Point struct{ x, y float64 } // Point and struct{ x, y float64 } are different types
polar Point // polar and Point denote different types
)