Golang中结构体struct定义,结构体指针,空结构体和nil区别学习
Golang中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型。
结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。
类似Java,Python中的class。
一.结构体的定义和初始化
1.语法
struct
type struct_variable_name struct {
member1 definition
member2 definition
...
member definition
}
我们定义一个Person结构体,包含name,age,hight三个成员变量:
type Person struct {
name string
age int
hight float64
}
一旦定义了结构体类型,它就能用于变量的声明
2.初始化
结构体初始化有多种方式,根据应用场景自由选择
(1).方式一,简短声明初始化:
bob := Person{"Bob", 19, 1.85}
fmt.Printf("Bob 数据类型:%T,值为:%v\n", bob, bob)
输出为:
Bob 数据类型:main.Person,值为:{Bob 19 1.85}
mainmain
package main
main.
(2).方式二,var 定义:
var alan Person
fmt.Println("alan 结构体:", alan)
alan.name = "Alan"
alan.age = 20
alan.hight = 1.78
fmt.Println("Alan 结构体内容:", alan)
输出为:
alan 结构体: { 0 0} // { 0 0} 注意:第一个值是空字符串,控制台输出不明显,看不出来
Alan 结构体内容: {Alan 20 1.78}
var
我们可以试验一下:
var jerry Person
fmt.Printf(jerry == nil) // 这段代码编译会报错->无效操作:不匹配的类型Person和nil
// 报错内容:invalid operation: jerry == nil (mismatched types Person and nil)
nil
// nil is a predeclared identifier representing the zero value for a
// pointer, channel, func, interface, map, or slice type.
var nil Type // Type must be a pointer, channel, func, interface, map, or slice type
nil
struct
(3).方式三:Person{}
结构体后面加 {},表示声明结构体。
tom := Person{}
tom.name = "Tom"
tom.age = 21
tom.hight = 1.73
fmt.Println("Tom 结构体内容:", tom)
输出为:
Tom 结构体内容: {Tom 21 1.73}
(4).方式四:Person{}变体
(3)方式中是先创建一个结构体,然后初始化,分两步操作的。其实我们可以一步到位的:
jack := Person{
name: "Jack",
age: 19,
hight: 1.69,
}
fmt.Println("Jack 结构体内容:", jack)
输出:
Jack 结构体内容: {Jack 19 1.69}
二.结构体指针
它是一个指针,指向了一个结构体
1.结构体前面加’*’
*
var jerryPtr *Person // 定义一个结构体指针,指针指向Person
jerryPtr = &bob // 将bob的内存地址赋值给jerryPtr
fmt.Println("jerryPtr 结构体指针为:", jerryPtr)
fmt.Printf("jerryPtr 结构体指针地址为:%p,类型为:%T\n", &jerryPtr, jerryPtr)
输出:
jerryPtr 结构体指针为: &{Bob 19 1.85}
jerryPtr 结构体指针地址为:0xc000006030,类型为:*main.Person
new()
new()
alan := new(Person)
fmt.Println("alan 为:", alan) // 不是nill
fmt.Printf("alan 的地址为:%p,数据类型为;%T\n", alan, alan)
alan.name = "Alan"
alan.age = 19
alan.hight = 1.79
fmt.Println("alan 结构体的内容为:", alan)
输出:
alan 为: &{ 0 }
alan 的地址为:0xc00006e540,数据类型为;*main.Person
alan 结构体的内容为: &{Alan 19 男}
*main.Person
3.空结构体和nil区别
nil
查看了下new()函数返回的是指针类型,源码如下:
// The new built-in function allocates memory. The first argument is a type,
// not a value, and the value returned is a pointer to a newly
// allocated zero value of that type.
func new(Type) *Type
带着疑问,实际操作一下。
我们先定义一个空结构体:
type Student struct {
}
mainnill
student := new(Student)
fmt.Printf("student 的数据类型为:%T,值为:%v\n", student, student)
fmt.Println("student == nill :", student == nil)
输出:
student 的数据类型为:*main.Student,值为:&{}
student == nill : false
studentnil
nil
stuct*nilTypevar nil Type
sliceslicenil
Talk is cheap, show me code:
var s []int64
fmt.Println("s :", s)
fmt.Println("s == nil:", s == nil)
输出:
s : []
s == nil: true
nil
structnil
nilnilnilchannelfuncinterfacemapslice
struct*