type IZ = int
这种写法其实是定义了int类型的别名,类型别名在1.9中实现,可将别名类型和原类型这两个类型视为完全一致使用。type IZ int 其实是定义了新类型,这和类型别名完全不是一个含义。自定义类型不会拥有原类型附带的方法,而别名是拥有原类型附带的。下面举2个例子说明:
如果是类型别名,完整拥有其方法:
package main
import (
"fmt"
)
type A struct {
Face int
}
type Aa=A // 类型别名
func (a A) f() {
fmt.Println("hi ", a.Face)
}
func main() {
var s A = A{Face: 9}
s.f()
var sa Aa = Aa{Face: 9}
sa.f()
}
程序输出:
hi 9
hi 9
结构化的类型没有真正的值,它使用 nil 作为默认值(在 Objective-C 中是 nil,在 Java 中是 null,在 C 和 C++ 中是NULL或 0)。值得注意的是,Go 语言中不存在类型继承。
函数也是一个确定的类型,就是以函数签名作为类型。这种类型的定义例如:
type typeFunc func ( int, int) int
我们可以在函数体中的某处返回使用类型为 typeFunc 的变量 varfunc:
return varfunc
自定义类型不会继承原有类型的方法,但接口方法或组合类型的内嵌元素则保留原有的方法。
// Mutex 用两种方法,Lock and Unlock。
type Mutex struct { /* Mutex fields */ }
func (m *Mutex) Lock() { /* Lock implementation */ }
func (m *Mutex) Unlock() { /* Unlock implementation */ }
// NewMutex和 Mutex 一样的数据结构,但是其方法是空的。
type NewMutex Mutex
// PtrMutex 的方法也是空的
type PtrMutex *Mutex
// *PrintableMutex 拥有Lock and Unlock 方法
type PrintableMutex struct {
Mutex
}
下一节:Go 通过结构体的形式支持用户自定义类型,或者叫定制类型。