自定义类型

  1. // 自定义一个名为xiaofeng的类型,其底层类型为int
  2. type xiaofeng int
  3. // 定义xiaofeng这个类型的变量
  4. var x xiaofeng
  5. fmt.Printf("%T\n", x) // main.xiaofeng
  6. x = 99
  7. fmt.Println(x) // 99

结构体

定义结构体

  1. type 类型名 struct {
  2. 字段名 字段类型
  3. 字段名 字段类型
  4. ...
  5. }

其中:

  • 类型名:表示结构体的名称,在同一个包内不能重复。
  • 字段名:表示结构体成员的字段名,结构体中的字段名必须唯一。
  • 字段类型:表示结构体字段的具体类型,如果相邻的成员类型如果相同的话可以被合并到一行。

如果结构体成员名字是以大写字母开头的,那么该成员就是可导出的,小写表示仅在定义当前结构体的包中可访问。

结构体实例化
结构体必须实例化后才能使用结构体的字段,只有实例化后才会分配内存。实例化方法有两种:

  1. var 结构体实例 结构体类型
  2. var 结构体实例 = new(结构体类型)

示例

  1. // 1 定义
  2. type Task struct {
  3. taskId int
  4. taskName string
  5. }
  6. // 2 实例化
  7. // 2.1 实例化方法一
  8. var task Task
  9. // 2.1 实例化方法二
  10. var task2 = new(Task)
  11. // 3 赋值
  12. // 3.1 按照属性顺序创建Task子面量进行赋值
  13. task = Task{1, "睡觉"}
  14. // 3.2 按照属性名进行赋值
  15. task = Task{
  16. taskId: 2,
  17. taskName: "玩游戏", // 用这种换行方式来写,最后一个元素的 逗号就必须得写上,不能省略
  18. }
  19. // 属性的访问
  20. fmt.Println(task.taskId, task.taskName)
  21. // 属性的修改
  22. task.taskId = 99

结构体嵌套

  1. type Task struct {
  2. taskId int
  3. taskName string
  4. }
  5. type User struct {
  6. age int
  7. name string
  8. task Task // 嵌入Task结构体
  9. }
  10. // 嵌套结构体赋值方式一
  11. var u1 User
  12. u1.age = 18
  13. u1.name = "zhangsan"
  14. u1.task.taskId = 1
  15. u1.task.taskName = "加班"
  16. fmt.Printf("%#v\n", u1) // main.User{age:18, name:"zhangsan", task:main.Task{taskId:1, taskName:"加班"}}
  17. // 嵌套结构体赋值方式二
  18. u2 := User{
  19. age: 22,
  20. name: "lisi",
  21. task: Task{
  22. taskId: 1,
  23. taskName: "睡觉",
  24. },
  25. }
  26. fmt.Printf("%#v\n", u2) // main.User{age:22, name:"lisi", task:main.Task{taskId:1, taskName:"睡觉"}}

嵌套方式二

  1. type Task struct {
  2. taskId int
  3. taskName string
  4. }
  5. type User struct {
  6. age int
  7. name string
  8. Task //
  9. }
  10. var u1 User
  11. u1.age = 18
  12. u1.name = "zhangsan"
  13. u1.Task.taskId = 1 //
  14. u1.Task.taskName = "加班" //
  15. fmt.Printf("%#v\n", u1) // main.User{age:18, name:"zhangsan", task:main.Task{taskId:1, taskName:"加班"}}

匿名结构体

  1. // 匿名结构体 ==> 始化一个变量
  2. var user struct {
  3. age int
  4. name string
  5. }
  6. // 初始化、赋值
  7. user = struct {
  8. age int
  9. name string
  10. }{18, "zhangsan"}
  11. fmt.Println(user.name) // zhangsan
  12. // 匿名结构体声明 + 初始化
  13. user2 := struct {
  14. age int
  15. name string
  16. }{18, "zhangsan"}
  17. fmt.Println(user2.name) // zhangsan