自定义类型
// 自定义一个名为xiaofeng的类型,其底层类型为inttype xiaofeng int// 定义xiaofeng这个类型的变量var x xiaofengfmt.Printf("%T\n", x) // main.xiaofengx = 99fmt.Println(x) // 99
结构体
定义结构体
type 类型名 struct {字段名 字段类型字段名 字段类型...}
其中:
- 类型名:表示结构体的名称,在同一个包内不能重复。
- 字段名:表示结构体成员的字段名,结构体中的字段名必须唯一。
- 字段类型:表示结构体字段的具体类型,如果相邻的成员类型如果相同的话可以被合并到一行。
如果结构体成员名字是以大写字母开头的,那么该成员就是可导出的,小写表示仅在定义当前结构体的包中可访问。
结构体实例化
结构体必须实例化后才能使用结构体的字段,只有实例化后才会分配内存。实例化方法有两种:
var 结构体实例 结构体类型var 结构体实例 = new(结构体类型)
示例
// 1 定义type Task struct {taskId inttaskName 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 inttaskName string}type User struct {age intname stringtask Task // 嵌入Task结构体}// 嵌套结构体赋值方式一var u1 Useru1.age = 18u1.name = "zhangsan"u1.task.taskId = 1u1.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 inttaskName string}type User struct {age intname stringTask //}var u1 Useru1.age = 18u1.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 intname string}// 初始化、赋值user = struct {age intname string}{18, "zhangsan"}fmt.Println(user.name) // zhangsan// 匿名结构体声明 + 初始化user2 := struct {age intname string}{18, "zhangsan"}fmt.Println(user2.name) // zhangsan
