结构体是由一些列属性组成的复合数据类型,每个数据都具有名称,结构体将属性组合在一起进行由程序进行处理

1、自定义类型

在Go语言中使用type声明一种新的类型,语法格式:

type TypeName Formatter

  1. package main
  2. import "fmt"
  3. // Counter 见类型知含义 & 可以添加方法
  4. // Counter 现有数据类型
  5. type Counter int
  6. type User map[string]string
  7. type Callback func() error
  8. func main() {
  9. var counter Counter
  10. fmt.Printf("%T,%v\n", counter, counter) // main.Counter,0
  11. counter += 10
  12. fmt.Printf("%T,%v\n", counter, counter) // main.Counter,10
  13. s2 := Counter(20) + counter //类型转换
  14. fmt.Printf("%T,%v\n", s2, s2) // main.Counter,30
  15. var user User = make(User)
  16. fmt.Printf("%T,%v\n", user, user) // main.User,map[]
  17. user["id"] = "1"
  18. fmt.Println(user) // map[id:1]
  19. callback := map[string]Callback{}
  20. callback["add"] = func() error {
  21. fmt.Println("add")
  22. return nil
  23. }
  24. callback["add"]() // add
  25. }

2、别名

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. type Counter = int // 别名
  6. func main() {
  7. var counter Counter
  8. fmt.Printf("%T,%v\n", counter, counter) // int,0
  9. var num int = 10
  10. fmt.Println(num + counter) // 10
  11. }

3、结构体

  1. package main
  2. import (
  3. "fmt"
  4. "time"
  5. )
  6. // User 定义结构体
  7. type User struct {
  8. id int
  9. name string
  10. addr string
  11. tel string
  12. birthday time.Time
  13. }
  14. func main() {
  15. var user User
  16. // 零值是由个元素的零组成的一个结构体的变量
  17. fmt.Printf("%T,%v\n", user, user) // main.User,{0 {0 0 <nil>}}
  18. // 字面量(按照属性顺序定义的字面量)
  19. // 必须严格按照结构体属性定义顺序
  20. // 每个属性都必须指定
  21. user = User{10, "dadong", "北京", "123456789", time.Now()}
  22. fmt.Printf("%#v\n", user) // main.User{id:10, name:"dadong", addr:"北京", tel:"123456789", birthday:time.Time{wall:0xc038093d10d8df50, ext:4793801, loc:(*time.Location)(0x1eb560)}}
  23. //按照属性名定义的字面量
  24. user = User{id: 20, name: "xxd"}
  25. fmt.Printf("%#v\n", user) // main.User{id:20, name:"xxd", addr:"", tel:"", birthday:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}}
  26. // 属性访问和修改
  27. fmt.Println(user.id)
  28. user.id = 100
  29. user.name = "xisuo"
  30. fmt.Printf("%#v\n", user) // main.User{id:100, name:"xisuo", addr:"", tel:"", birthday:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}}
  31. }

4、结构体指针类型

  1. package main
  2. import (
  3. "fmt"
  4. "time"
  5. )
  6. // User 定义结构体
  7. type User struct {
  8. id int
  9. name string
  10. addr string
  11. tel string
  12. birthday time.Time
  13. }
  14. func main() {
  15. var user = &User{name: "dadong", id: 10}
  16. fmt.Printf("%T,%#v\n", user, user) // *main.User,&main.User{id:10, name:"dadong", addr:"", tel:"", birthday:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}}
  17. // new函数初始化
  18. // 初始化结构体指针
  19. user = new(User)
  20. fmt.Printf("%T,%#v\n", user, user) // *main.User,&main.User{id:0, name:"", addr:"", tel:"", birthday:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}}
  21. u2 := new(User)
  22. fmt.Printf("%T,%#v\n", u2, u2) // *main.User,&main.User{id:0, name:"", addr:"", tel:"", birthday:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}}
  23. }

5、匿名结构体

  1. package main
  2. import (
  3. "fmt"
  4. "time"
  5. )
  6. func main() {
  7. // 匿名结构体
  8. var user struct {
  9. id int
  10. name string
  11. tel string
  12. addr string
  13. birthday time.Time
  14. }
  15. fmt.Printf("%T,\n%#v\n", user, user)
  16. //struct { id int; name string; tel string; addr string; birthday time.Time },
  17. //struct { id int; name string; tel string; addr string; birthday time.Time }{id:0, name:"", tel:"", addr:"", birthday:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}}
  18. user = struct {
  19. id int
  20. name string
  21. tel string
  22. addr string
  23. birthday time.Time
  24. }{10, "dadong", "13500000", "xxxxxxx", time.Now()} // 结构体类型
  25. fmt.Printf("%T,\n%#v\n", user, user)
  26. //struct { id int; name string; tel string; addr string; birthday time.Time },
  27. //struct { id int; name string; tel string; addr string; birthday time.Time }{id:10, name:"dadong", tel:"13500000", addr:"xxxxxxx", birthday:time.Time{wall:0xc0380e4e4475cc00, ext:4365301, loc:(*time.Location)(0xb3b560)}}
  28. user = struct {
  29. id int
  30. name string
  31. tel string
  32. addr string
  33. birthday time.Time
  34. }{name: "dadong", id: 10} // 结构体类型
  35. fmt.Printf("%T,\n%#v\n", user, user)
  36. //struct { id int; name string; tel string; addr string; birthday time.Time },
  37. //struct { id int; name string; tel string; addr string; birthday time.Time }{id:10, name:"dadong", tel:"", addr:"", birthday:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}}
  38. var u2 = struct {
  39. id int
  40. name string
  41. }{id: 10, name: "dadong"}
  42. fmt.Printf("%T,\n%#v\n", u2, u2)
  43. //struct { id int; name string },
  44. //struct { id int; name string }{id:10, name:"dadong"}
  45. }

5.1 多层及使用

  1. package main
  2. import (
  3. "fmt"
  4. "time"
  5. )
  6. type Addr struct {
  7. province string
  8. street string
  9. numbe string
  10. }
  11. type Tel struct {
  12. prefix string
  13. number string
  14. }
  15. // User 组合
  16. type User struct {
  17. id int
  18. name string
  19. tel Tel
  20. addr Addr
  21. birthday time.Time
  22. }
  23. func main() {
  24. var user User = User{
  25. id: 0,
  26. name: "",
  27. tel: Tel{
  28. prefix: "",
  29. number: "",
  30. },
  31. addr: Addr{
  32. province: "北京市",
  33. street: "",
  34. numbe: "",
  35. },
  36. birthday: time.Now(),
  37. }
  38. fmt.Println(user.addr.province) // 北京市
  39. }