2.5 结构体(struct)

Go的struct是字段的类型集合。

struct 主要应用两个方面:

  • 可以将不同类型的数据存放到struct,我们都知道数组只能存放单一的数据类型.

  • 由于在GO中没有class的关键字,也就是其它语言经常在面向对象中使用的方面,但GO是通过struct结构与method方法组合来实现的面向对象

示例:

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. type Person struct { //结构也是一种类型
  6. Name string //定义struct的属性
  7. Age int
  8. }
  9. func main() {
  10. a := Person{}
  11. a.Name = "jerry" //对struct的属性进行操作,类型与class的使用方法
  12. a.Age = 19
  13. fmt.Println(a)
  14. }

struct 作为一种类型和其他类型结合用

示例:

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. type Person struct {
  6. //结构也是一种类型
  7. Name string //定义struct的属性
  8. Age int
  9. }
  10. func main() {
  11. m := map[string]Person{}
  12. p := Person{Name: "jerry", Age: 12}
  13. m["ONE"] = p
  14. fmt.Println(m)
  15. }

struct 面向对象示例

  1. package main
  2. import "fmt"
  3. type Person struct {
  4. //结构也是一种类型
  5. Name string //定义struct的属性
  6. Age int
  7. }
  8. func main() {
  9. p := Person{Name: "jerry", Age: 12}
  10. p.list()
  11. }
  12. func (p *Person) list() {
  13. fmt.Println(p.Name)
  14. }

匿名字段

  1. package main
  2. import "fmt"
  3. type YellowPerson struct {
  4. Person //anonymous field(匿名自字段,名字就是Person)
  5. string //anonymous field(匿名自字段,名字就是string)
  6. }
  7. type Person struct {
  8. //结构也是一种类型
  9. Name string //定义struct的属性
  10. Age int
  11. }
  12. func main() {
  13. p := YellowPerson{Person: Person{Name: "jerry", Age: 12}, string: "jerry"}
  14. fmt.Println(p.Person)
  15. fmt.Println(p.Name)
  16. fmt.Println(p.Age)
  17. fmt.Println(p.string)
  18. }

YellowPerson直接包含依赖结构,可以直接使用Person中的字段,sting 也是匿名字段,字段名字是string,不过不推荐这么使用。同时需要注意

  1. type YellowPerson struct {
  2. Person //anonymous field(匿名自字段,名字就是Person)
  3. }

  1. type YellowPerson struct {
  2. Person Person
  3. }

两者是不同的

  1. package main
  2. import "fmt"
  3. type YellowPerson struct {
  4. Person Person
  5. string //anonymous field(匿名自字段,名字就是string)
  6. }
  7. type Person struct {
  8. //结构也是一种类型
  9. Name string //定义struct的属性
  10. Age int
  11. }
  12. func main() {
  13. p := YellowPerson{Person: Person{Name: "jerry", Age: 12}, string: "jerry"}
  14. fmt.Println(p.Name)
  15. fmt.Println(p.Age)
  16. }

这个会报

p.Name undefined (type YellowPerson has no field or method Name),

p.Age undefined (type YellowPerson has no field or method Age)

错误,应为YellowPerson下没有Name 和Age这连个字段的。

匿名结构体

  1. // 在函数外部定义匿名结构体并赋值给 config
  2. var config struct {
  3. APIKey string
  4. OAuthConfig oauth.Config
  5. }
  6. // 定义并初始化并赋值给 data
  7. data := struct {
  8. Title string
  9. Users []*User
  10. }{
  11. title,
  12. users
  13. }

links