17.2 type 定义类型别名

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 通过结构体的形式支持用户自定义类型,或者叫定制类型。