Golang | 结构体的定义和使用

Struct

struct(结构体)就是用户自己定义的类型,一个结构体对应现实中的一个类型,和Java中的Class类相似,但是没有Class类那么复杂,没有多态,继承,封装。只保留了最基础的特性:组合。组合也只是形成最基本的复合类型。

初始化

自定义一个User类型,并且对这个User类型进行初始化。

  type User struct {
    Id int
    Name string
    age int
  }

  func initStruct() {
    u1 := new(User)							// 使用内置函数进行初始化
    u2 := User{}							// 直接初始化
    u3 := &User{1,"张三",10}	// 所有字段顺序初始化 不显示指定字段初始化的话,必须按顺序对所有字段进行赋值
    u4 := &User{Id: 1,age: 10}				// 指定字段初始化
    fmt.Println(u1)	// &{0  0}
    fmt.Println(u2)	// {0  0}
    fmt.Println(u3)	// &{1 张三 10}
    fmt.Println(u4)	// &{1  10}
  }

类型初始化之后,如果结构体中的字段没有被赋值,就会被初始化该类型的零值。

我们在实际使用中,通常不使用以上的方式进行初始化结构体,一般使用一个构造函数来进行初始化:

func NewUser(id int,name string) *User {
	return &User{Id: id,Name: name}
}

fmt.Println(NewUser(2,"张三"))	// &{2 张三 0}

自定义的构体函数一般使用 New开头,以结构体名称结尾,初始化时,使用几个参数传入几个参数,并且返回

可见性

结构体的可见性和包内变量是相同的,结构体名称为首字母为大写开头,别的包可以引用,字段的话,首字母为小写只能包内可见,首字母大写的话, 别的包也可见。

函名组合

  type User struct {
    Info
    Id   int
    Name string
    age  int
  }

  type Info struct {
    Introduction string
    Name         string
  }
  // 结构体组合
  func combination() {
    user := &User{Info{"组合类","李四"},1, "张三", 10}
    fmt.Println(user.Name)			// 组合中的同名字段,不指定的话,取外部结构体的字段
    fmt.Println(user.Info.Name)		// 组合中的同字段,如果想取内部结构体的字段,必须要指定内部结构体的名称进行取值
    fmt.Println(user.Introduction)	// 如果内部组合中字段名和外部没有重复,可以直接取这个字段输出
  }

有接口的情况下,外部的结构体可以使用内部结构体的方法

如果这个结构体只使用一次,可以使用以下方法进行结构体的构造:

  type User struct {
    Info
    TInfo  struct{
      Name string	
    }
    Id   int
    Name string
    age  int
  }

带标签的结构休

我们在网络传输中,需要把一个结构体转换为一个JSON字符串进行传输,我们看一下,不加标签的结构体转换为JSON字符串后的情况:

	user := &User{Id: 1, age: 10} // 指定字段初始化
	
	fmt.Println(user)             // &{1  10}

	jsonUser, _ := json.Marshal(user)

	fmt.Println(string(jsonUser))	// {"Introduction":"","Id":1,"Name":""}

这样也可以转为JSON字符串,但是不符合我们在不同应用中传递的规范,在Go中字段名首字母为在写,转换后也是按照结构体的字段进行输出的。

如果我们想要符合规范,首字母小写,并且两个单词之间使用 _连接,我们可以使用标签对结构体进行修改:

type User struct {
	Info			`json:"info"`
	Id   int		`json:"id"`
	Name string		`json:"name"`
	age  int		`json:"age"`
}

type Info struct {
	Introduction string	`json:"introduction"`
	Name         string	`json:"name"`
}

{"info":{"introduction":"","name":""},"id":1,"name":""}

对结构体添加标签后,我们输出的JSON字符串就标准了。



关注公众号,随时获取最新资讯

细节决定成败!
个人愚见,如有不对,恳请斧正!

posted @ 2022-03-29 15:35  一点浩然气~  阅读(1011)  评论(0编辑  收藏  举报