自定义类型
// 自定义一个名为xiaofeng的类型,其底层类型为int
type xiaofeng int
// 定义xiaofeng这个类型的变量
var x xiaofeng
fmt.Printf("%T\n", x) // main.xiaofeng
x = 99
fmt.Println(x) // 99
结构体
定义结构体
type 类型名 struct {
字段名 字段类型
字段名 字段类型
...
}
其中:
- 类型名:表示结构体的名称,在同一个包内不能重复。
- 字段名:表示结构体成员的字段名,结构体中的字段名必须唯一。
- 字段类型:表示结构体字段的具体类型,如果相邻的成员类型如果相同的话可以被合并到一行。
如果结构体成员名字是以大写字母开头的,那么该成员就是可导出的,小写表示仅在定义当前结构体的包中可访问。
结构体实例化
结构体必须实例化后才能使用结构体的字段,只有实例化后才会分配内存。实例化方法有两种:
var 结构体实例 结构体类型
var 结构体实例 = new(结构体类型)
示例
// 1 定义
type Task struct {
taskId int
taskName string
}
// 2 实例化
// 2.1 实例化方法一
var task Task
// 2.1 实例化方法二
var task2 = new(Task)
// 3 赋值
// 3.1 按照属性顺序创建Task子面量进行赋值
task = Task{1, "睡觉"}
// 3.2 按照属性名进行赋值
task = Task{
taskId: 2,
taskName: "玩游戏", // 用这种换行方式来写,最后一个元素的 逗号就必须得写上,不能省略
}
// 属性的访问
fmt.Println(task.taskId, task.taskName)
// 属性的修改
task.taskId = 99
结构体嵌套
type Task struct {
taskId int
taskName string
}
type User struct {
age int
name string
task Task // 嵌入Task结构体
}
// 嵌套结构体赋值方式一
var u1 User
u1.age = 18
u1.name = "zhangsan"
u1.task.taskId = 1
u1.task.taskName = "加班"
fmt.Printf("%#v\n", u1) // main.User{age:18, name:"zhangsan", task:main.Task{taskId:1, taskName:"加班"}}
// 嵌套结构体赋值方式二
u2 := User{
age: 22,
name: "lisi",
task: Task{
taskId: 1,
taskName: "睡觉",
},
}
fmt.Printf("%#v\n", u2) // main.User{age:22, name:"lisi", task:main.Task{taskId:1, taskName:"睡觉"}}
嵌套方式二
type Task struct {
taskId int
taskName string
}
type User struct {
age int
name string
Task //
}
var u1 User
u1.age = 18
u1.name = "zhangsan"
u1.Task.taskId = 1 //
u1.Task.taskName = "加班" //
fmt.Printf("%#v\n", u1) // main.User{age:18, name:"zhangsan", task:main.Task{taskId:1, taskName:"加班"}}
匿名结构体
// 匿名结构体 ==> 始化一个变量
var user struct {
age int
name string
}
// 初始化、赋值
user = struct {
age int
name string
}{18, "zhangsan"}
fmt.Println(user.name) // zhangsan
// 匿名结构体声明 + 初始化
user2 := struct {
age int
name string
}{18, "zhangsan"}
fmt.Println(user2.name) // zhangsan