Go 语言允许用户自定义类型。
当用户声明一个新类型时,这个声明就给编译器提供了一个框架,告知必要的内存大小和表示信息。
声明后的类型和内置类型的运作方式类似。
Go 语言里声明用户自定义类型有两种方法:
struct 关键字
使用 struct 关键字是最常用的方法,它可以让用户创建一个结构体类型。
1、 声明一个结构体类型
type User struct {
Name string
Age int64
Email string
Score int64
}复制
结构体类型的声明以关键字 type 开始,之后是新类型的名字,最后是关键字 struct。
这个结构体类型有 4 个字段,每个字段都是基于一个内置类型。
一旦声明了类型,就可以使用这个类型创建值。
2、使用自定义结构体类型声明变量,并初始化其为零值
// 声明 User 类型的变量
var user User复制
关键字 var 创建了类型为 User 且名为 user 的变量。当声明变量时,这个变量对应的值总是会被初始化。 这个值要么用指定的值初始化,要么用零值(即变量类型的默认值)做初始化。对数值类型来说,零值是 0;对字符串来说,零值是空字符串;对 布尔类型,零值是 false.
任何时候,创建一个变量并初始化其为零值,习惯使用关键字 var。这种用法是为了更明确地表示一个变量被设置为零值。
如果变量被初始化为某个非零值,就配合结构体字面量和短变量声明操作符来创建变量,如下所示。
type User struct {
Name string
Age int64
Email string
Score int64
}
func main() {
// 声明 User 类型的变量,并初始化所有字段
oscar := User{
Name: "Oscar",
Age: 20,
Email: "5834838@qq.com",
Score: 90,
}
}复制
如何声明一个 User 类型的变量,并使用某个非零值作为初始值?
首先定义一个变量名(oscar),之后是短变量声明操作符。这个操作符是冒号加一个等号(:=)。
一个短变量声明操作符在一次操作中完成两件事:声明一个变量,并初始化。
短变量操作符会使用右侧给出的类型信息作为声明变量的类型。
既然要创建并初始化一个数据类型,就要使用结构体字面量来完成这个初始化。结构体字面量使用一对大括号括住内部字段的初始值。
结构体字面量可以对结构体类型采用两种形式:
1、使用结构体字面量创建结构体类型的值
User{
Name: "Oscar",
Age: 20,
Email: "5834838@qq.com",
Score: 90,
}复制
这种形式对字段的声明顺序没有要求。
2、不使用字段名创建结构体类型的值
lisa := User{"Oscar", 22, "343664563@qq.com", 88}
复制
这种形式值的顺序很重要,必须要和结构体中声明的字段顺序一致。
当声明结构体类型时,字段类型并仅限于内置类型,也可以使用其他用户定义的类型。
// 声明Admin 类型的变量
admin := Admin{
// User 类型的字段
person: User{
Name: "Oscar",
Age: 18,
Email: "456776@qq.com",
Score: 70,
},
level: "super",
}复制
另外一种声明用户定义的类型的方法是基于一个已有的类型,将其作为新类型的类型说明。当需要一个可以用已有类型表示的新类型的时候,这种方法会非常好用。
基于 int64 声明一个新类型
type Duration int64
复制
这是标准库 time 包里的一个类型声明。Duration 是一种描述时间间隔的类型,单位是纳秒(ns)。这个类型使用内置的 int64 类型作为其代表。在 Duration 类型声明中,把 int64 类型叫做 Duration 的基础类型,虽然 int64 是基础类型,Go 并不认为 Duration 和 int64 是同一种类型,Duration 类型依然是一个独立的类型,两种不同类型的值即便相互兼容,也不能相互赋值,编译器不会对不同类型的值做隐式转换。