结构体
Go语言中的基本数据类型可以表示一些事物的基本属性,但是当我们想表达一个事物的全部或部分属性时,这时候基本数据类型就无法满足需求了。
Go语言提供了一种自定义数据类型,可以封装多个基本数据类型,这种数据类型叫结构体(struct)。
我们可以通过struct来定义自己的类型了。
Go语言中通过struct来实现面向对象。
2.1结构体的定义
使用type和struct关键字来定义结构体,具体代码格式如下:
type 类型名 struct {
字段名 字段类型
字段名 字段类型
…
}
其中:
类型名:标识自定义结构体的名称,在同一个包内不能重复。
字段名:表示结构体字段名。结构体中的字段名必须唯一。
字段类型:表示结构体字段的具体类型。
举个例子,我们定义一个Person结构体,代码如下:
type Person struct {
name string
city string
age int8
}
同样类型的字段可以卸载一行
type Person struct {
name,city string
age int8
}
这样我们就拥有了一个Person的自定义类型,它有name,city,age三个字段,分别表示姓名,城市和年龄。
这样我们就能使用Person结构体存储人的信息了。
语言内置的数据类型是用来描述一个值得,结构体是用来描述一组值的。
比如一个人有名字,年龄和居住城市等,本质上是一种聚合型的数据类型。
2.2结构体实例化
只有当结构体实例化时,才会真正的分配内存。即必须实例化后才能使用结构体的字段。
结构体本身也是一种类型,我们可以像声明内置类型一样使用var关键字声明结构体类型。
var 结构体实例 结构体类型
2.2.1结构体基本实例化
通过"."来访问结构体的字段,例如person1.name和person1.age
2.2.2匿名结构体
在定义一些临时数据结构时,可以使用匿名结构体。
2.2.3创建指针类型结构体
我们还可以通过new关键字对结构体进行实例化,得到的是结构体的地址。
package main
import "fmt"
type Person struct {
name string
city string
age int
}
func main() {
var person3 = new(Person)
fmt.Printf("%T\n",person3)
fmt.Printf("p3=%#v\n",person3)
person3.name="vita"
person3.age=27
fmt.Printf("p3=%v\n",person3)
fmt.Printf("p3=%#v\n",person3)
}
结果:
*main.Person
p3=&main.Person{name:"", city:"", age:0}
p3=&{vita 27}
p3=&main.Person{name:"vita", city:"", age:27}
Process finished with exit code 0
从打印结果可以看到,p3是一个结构体指针。
Go语言中支持对结构体指针直接使用"."访问结构体成员。
2.2.4取结构体的地址实例化
使用&对结构体进行取地址操作相当于对该结构体进行了一次new实例化操作。
person4.name="vita"其实在底层是(* person4).name="vita",这是Go语言帮我们实现的语法糖。
Go语言中的基本数据类型可以表示一些事物的基本属性,但是当我们想表达一个事物的全部或部分属性时,这时候基本数据类型就无法满足需求了。
Go语言提供了一种自定义数据类型,可以封装多个基本数据类型,这种数据类型叫结构体(struct)。
我们可以通过struct来定义自己的类型了。
Go语言中通过struct来实现面向对象。
2.1结构体的定义
使用type和struct关键字来定义结构体,具体代码格式如下:
type 类型名 struct {
字段名 字段类型
字段名 字段类型
…
}
其中:
类型名:标识自定义结构体的名称,在同一个包内不能重复。
字段名:表示结构体字段名。结构体中的字段名必须唯一。
字段类型:表示结构体字段的具体类型。
举个例子,我们定义一个Person结构体,代码如下:
type Person struct {
name string
city string
age int8
}
同样类型的字段可以卸载一行
type Person struct {
name,city string
age int8
}
这样我们就拥有了一个Person的自定义类型,它有name,city,age三个字段,分别表示姓名,城市和年龄。
这样我们就能使用Person结构体存储人的信息了。
语言内置的数据类型是用来描述一个值得,结构体是用来描述一组值的。
比如一个人有名字,年龄和居住城市等,本质上是一种聚合型的数据类型。
2.2结构体实例化
只有当结构体实例化时,才会真正的分配内存。即必须实例化后才能使用结构体的字段。
结构体本身也是一种类型,我们可以像声明内置类型一样使用var关键字声明结构体类型。
var 结构体实例 结构体类型
2.2.1结构体基本实例化
通过"."来访问结构体的字段,例如person1.name和person1.age
package main import "fmt" type Person struct { name,city string age int8 } func main() { var person1 Person person1.name="vita" person1.city="ShangHai" person1.age=27 fmt.Printf("p1=%v\n",person1) fmt.Printf("p1=%#v\n",person1) } 结果: p1={vita ShangHai 27} p1=main.Person{name:"vita", city:"ShangHai", age:27} Process finished with exit code 0
2.2.2匿名结构体
在定义一些临时数据结构时,可以使用匿名结构体。
package main import "fmt" func main() { var person2 struct{name string;age int} person2.name="vita" person2.age=27 fmt.Printf("p1=%v\n",person2) fmt.Printf("p1=%#v\n",person2) } 结果: p1={vita 27} p1=struct { name string; age int }{name:"vita", age:27} Process finished with exit code 0
2.2.3创建指针类型结构体
我们还可以通过new关键字对结构体进行实例化,得到的是结构体的地址。
package main
import "fmt"
type Person struct {
name string
city string
age int
}
func main() {
var person3 = new(Person)
fmt.Printf("%T\n",person3)
fmt.Printf("p3=%#v\n",person3)
person3.name="vita"
person3.age=27
fmt.Printf("p3=%v\n",person3)
fmt.Printf("p3=%#v\n",person3)
}
结果:
*main.Person
p3=&main.Person{name:"", city:"", age:0}
p3=&{vita 27}
p3=&main.Person{name:"vita", city:"", age:27}
Process finished with exit code 0
从打印结果可以看到,p3是一个结构体指针。
Go语言中支持对结构体指针直接使用"."访问结构体成员。
2.2.4取结构体的地址实例化
使用&对结构体进行取地址操作相当于对该结构体进行了一次new实例化操作。
package main import "fmt" type Person struct { name string city string age int } func main() { var person4 = &Person{} fmt.Printf("%T\n",person4) fmt.Printf("p4=%#v\n",person4) person4.name="vita" person4.age=27 fmt.Printf("p4=%v\n",person4) fmt.Printf("p4=%#v\n",person4) } 结果: *main.Person p4=&main.Person{name:"", city:"", age:0} p4=&{vita 27} p4=&main.Person{name:"vita", city:"", age:27} Process finished with exit code 0
person4.name="vita"其实在底层是(* person4).name="vita",这是Go语言帮我们实现的语法糖。
扫码二维码 获取免费视频学习资料
- 本文固定链接: http://phpxs.com/post/6976/
- 转载请注明:转载必须在正文中标注并保留原文链接
- 扫码: 扫上方二维码获取免费视频资料
查 看2022高级编程视频教程免费获取