这是我参与更文挑战的第1天,活动详情查看: 更文挑战
一、结构体定义格式如下:
type 类型名 struct{
字段1 字段1类型
字段2 字段2类型
.....
}
复制代码
二、结构体实例化的三种方式
1. 基本实例化
因为结构体本身也是一种类型,可以像整形、布尔、字符串等类型一样,用var的方式完成实例化,格式如下:
var t T
//t:结构体实例化名字
//T:结构体类型
复制代码
2. new的方式
当用new关键字对结构体进行实例化时,得到的是结构体的地址,格式如下:
t := new(T)
//t:结构体实例化名字
//T:结构体类型
复制代码
t现在是一个结构体指针。
3. &取结构体地址实例化
使用&对结构体进行取地址操作相当于对该结构体类型进行了一次new实例化操作,格式如下:
t := T{a,b}
t := &T{} //等效于new(T)
//t:结构体实例化名字
//T:结构体类型
复制代码
实例代码1:
package main
import "fmt"
//定义一个结构体
type dog struct{
name string
age int
}
func main(){
//1.用var关键字声明结构体类型
var d1 dog
//输出结构体的类型
fmt.Printf("%T\n",d1)
//2.通过new来创建一个结构体指针
d3 := new(dog)
fmt.Printf("%T\n",d3)
//3.通过&取结构体的地址实例化
d4 := &dog{}
fmt.Printf("%T\n",d4)
}
复制代码
输出结果1:
main.dog
*main.dog
*main.dog
复制代码
三、结构体初始化的三种方式
-
通过 .来访问结构体字段进行初始化,例如dog.name以及dog.age;
-
通过键值对对结构体进行初始化;
-
使用值的列表初始化。
初始化结构体的时候可以不写健,直接写值,但注意:
- 必须初始化结构体的所有字段;
- 值的顺序必须与字段在结构体中声明顺序一致;
- 不能与键值对初始化方式混用
实例代码2:
package main
import "fmt"
//定义一个结构体
type dog struct{
name string
age int
}
func main(){
//用var关键字声明结构体类型
var d1 dog
//1.通过.来访问结构体字段,进行结构体的初始化
d1.name = "小华"
d1.age = 1
fmt.Println(d1)
//2.通过键值对结构体,进行结构体的初始化
d2 := dog{
name : "小白",
age : 12,
}
fmt.Println(d2)
//通过new来创建一个结构体指针
d3 := new(dog)
//Go中允许对结构体指针直接通过 .来访问结构体成员
d3.name = "小白菜"
d3.age = 12
fmt.Println(d3)
//通过&取结构体的地址实例化
d4 := &dog{}
d4.name = "小包"
d4.age = 13
fmt.Println(d4)
//3.使用值的列表初始化
d5 := dog{
"莎莎",
10,
}
fmt.Println(d5)
}
复制代码
输出结果2:
{小华 1}
{小白 12}
&{小白菜 12}
&{小包 13}
{莎莎 10}
复制代码
注意:
实例代码2中第35,第36行中d4.name = “小包”,d4.age = 13,
这是Go语言的语法糖,实际在底层上是(*d4).name = “小包”,
(*d4).age = 13。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END