Golang通脉之结构体

Go语言中的基础数据类型可以表示一些事物的基本属性,但是要表达一个事物的全部或部分属性时,这时候再用单一的基本数据类型明显就无法满足需求了,Go语言提供了一种自定义数据类型,可以封装多个基本数据类型,这种数据类型叫结构体,英文名称struct。 也就是可以通过struct来定义自己的类型了。

Go语言中通过struct来实现面向对象。

结构体的定义

Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型。 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。

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

type struct_variable_type struct {
   
   
   member definition;
   member definition;
   ...
   member definition;
}

其中:

  • struct_variable_type:标识自定义结构体的名称,在同一个包内不能重复。
  • member:表示结构体字段名。结构体中的字段名必须唯一。
  • definition:表示结构体字段的具体类型。

定义一个Person结构体:

type person struct {
   
   
	name string
	city string
	age  int8
}

同样类型的字段可以写在一行,

type person1 struct {
   
   
	name, city string
	age        int8
}

这样就拥有了一个person的自定义类型,它有namecityage三个字段。使用这个person结构体就能够很方便的在程序中表示和存储人的信息了。

语言内置的基础数据类型是用来描述一个值的,而结构体是用来描述一组值的。比如一个人有名字、年龄和居住城市等,本质上是一种聚合型的数据类型

结构体实例化

只有当结构体实例化时,即结构体声明后,才会真正地分配内存。也就是必须实例化后才能使用结构体的字段。

结构体本身也是一种类型,可以像声明内置类型一样使用var关键字声明结构体类型。

var 结构体实例 结构体类型

基本实例化

type Books struct {
   
   
   title string
   author string
   subject string
   book_id int
}

func main() {
   
   
	var book1 Books        /* 声明 book1 为 Books 类型 */
	/* book 1 描述 */
   Book1.title = "Go 语言"
   Book1.author = "Go大佬"
   Book1.subject = "Go"
   Book1.book_id = 6495407
}

通过.来访问结构体的字段(成员变量)。

匿名结构体

在定义一些临时数据结构等场景下还可以使用匿名结构体。

func main() {
   
   
    var user struct{
   
   Name string; Age int}
    user.Name = "张三"
    user.Age = 20
    fmt.Printf("%#v\n", user)
}

创建指针类型结构体

还可以通过使用new关键字对结构体进行实例化,得到的是结构体的地址:

var p = new(person)
fmt.Printf("%T\n", p)     //*main.person
fmt.Printf("p=%#v\n", p) //p=&main.person{name:"", city:"", age:0}

可以看出p是一个结构体指针。

需要注意的是在Go语言中支持对结构体指针直接使用.来访问结构体的成员。

var p = new(person)
p.name = "张三"
p.age = 18
p.city = "深圳"
fmt.Printf("p=%#v\n", p) //p=&main.person{name:"张三", city:"深圳", age:18}

取结构体的地址实例化

使用&对结构体进行取地址操作相当于对该结构体类型进行了一次new实例化操作。

book := &Books{
   
   }
book.title = "Java"
book.author = "Java大佬"
book.subject = "Java 语言"
book.book_id = 6495700

book.title= "Java"其实在底层是(*book).title= "Java",这是Go语言实现的语法糖。

结构体初始化

没有初始化的结构体,其成员变量都是对应其类型的零值。

type person struct {
   
   
	name string
	city string
	age  int8
}

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

使用键值对初始化

使用键值对对结构体进行初始化时,键对应结构体的字段,值对应该字段的初始值。

p := person{
   
   
	name: "张三",
	city: "",
	age:  18,
}
fmt.Printf("p=%#v\n", p) //p=main.person{name:"张三", city:"深圳", age:18}

也可以对结构体指针进行键值对初始化,例如:

p := &person{
   
   
	name: "张三",
	city: "深圳",
	age:  18,
}
fmt.Printf("p=%#v\n", p) //p=&main.person{name:"张三", city:"深圳", age:18}

当某些字段没有初始值的时候,该字段可以不写。此时,没有指定初始值的字段的值就是该字段类型的零值。

p := &person{
   
   
	city: "深圳",
}
fmt.Printf("p=%#v\n", p) //p=&main.person{name:"", city:"深圳", age:0}

使用值的列表初始化

初始化结构体的时候可以简写,也就是初始化的时候不写键,直接写值:

p := &person{
   
   
	"张三",
	"深圳",
	18,
}
fmt.Printf("p=%#v\n", p) //p=&main.person{name:"张三", city:"深圳", age:18}

使用这种格式初始化时,需要注意:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值