美文网首页
go结构体

go结构体

作者: 一如既往wfqwfq | 来源:发表于2020-04-30 12:24 被阅读0次

1、 什么是结构体

一个事物会有许多种属性,我们用单一的数据类型已经无法描述事物了。go语言中提供了一种自定义数据类型,它可以封装事物的多个属性,这种数据类型就叫做结构体。它和java中的类是非常相似的。

2、 结构体的定义

定义结构体要使用关键字typestruct,具体格式如下:

// 格式
type 类型名 struct {
    字段名 数据类型
    字段名 数据类型
}
// 示例
type person struct {
    name string
    sex string
    age int
}
  • 类型名:表示自定义结构的名称,在同一个包内不能重复
  • 字段名:表示结构体中字段的名称,字段名在结构体中是唯一的
  • 数据类型:表示结构体字段的数据类型。数据类型可以是:基本数据类型、数组、引用类型

3、 结构体实例化

结构体只有实例化后才会分配内存,只有实例化后才能访问结构体中的字段。因为结构体也是一种数据类型,所以可以使用var关键字来实例化结构体。在实例化后,会自动对结构体中的字段赋予零值。

3.1 基本格式

// 实例化结构体
var 结构体实例名 结构体类型
// 示例
var p person

3.2 匿名结构体

在一些场景下,我们可能需要用到临时的自定义结构体,这时候就可以用匿名结构体来实现

func main() {
  // 匿名结构体
  var user struct{name string; age int}
}

3.3 实例化指针类型结构体

结构体是值类型的数据类型,所以用new关键字或者&取地址操作来实例化一个结构体指针

    // new实例化结构体指针格式
    var 结构体指针名 = new(结构体类型名)
    // 示例
    var p1 = new(person)
    fmt.Printf("类型:%T\n", p1)   // *main.person
    fmt.Printf("值:%#v\n", p1)       // &main.person{name:"", sex:"", age:0}

    //  & 取地址符实例化结构体指针格式
    var 结构体指针名 = &结构体类型名{初始化参数列表}
    // 示例
    var p2 = &person{}
    fmt.Printf("类型:%T\n", p2)   // *main.person
    fmt.Printf("值:%#v\n", p2)       // &main.person{name:"", sex:"", age:0}

4、结构体初始化

结构体实例化后字段就会有默认值了,基本数据类型为零值,引用类型为nil。当然我们也可以手动对结构体作初始化,一种是使用键值对的方式,一种是值列表。
没有初始化时,字段默认为零值:

type person struct {
    name string
    city string
    age  int8
}

func main() {
    var p4 person
    fmt.Printf("p4=%#v\n", p4) //p4=main.person{name:"", city:"", age:0}
}

4.1 键值对方式初始化

格式:

结构体变量名 := 结构体类型 {
    字段名: 字段值,
    字段名: 字段值,
}

使用键值对对结构体初始化:

p1 := person {
    name: "孙悟空",
    sex: "男",
    age: 500,
}
fmt.Printf("类型:%T\n", p1)   // main.person
fmt.Printf("值:%#v\n", p1)   // main.person{name:"孙悟空", sex:"男", age:500}

使用键值对对结构体指针初始化:

p2 := &person {
    name: "观音菩萨",
    sex: "女",
    age: 500000,
}
fmt.Printf("类型:%T\n", p2)   // *main.person
fmt.Printf("值:%#v\n", p2)    // &main.person{name:"观音菩萨", sex:"女", age:500000}

4.2 值列表方式初始化结构体

p3 := person {
    "唐僧",
    "男",
    10000,
}
fmt.Printf("类型:%T\n", p3)   // main.person
fmt.Printf("值:%#v\n", p3)   // main.person{name:"唐僧", sex:"男", age:10000}

注意点:

  • 不管是键值对方式还是值列表方式,最后一个值后面都要加上,(逗号)
  • 值列表方式需要按顺序对每个字段的值初始化(按顺序、每个字段都要)

相关文章

网友评论

      本文标题:go结构体

      本文链接:https://www.haomeiwen.com/subject/cokzwhtx.html