阅读 128

Go 结构体定义、实例化以及初始化

这是我参与更文挑战的第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
复制代码

三、结构体初始化的三种方式

  1. 通过 .来访问结构体字段进行初始化,例如dog.name以及dog.age;

  2. 通过键值对对结构体进行初始化;

  3. 使用值的列表初始化。

初始化结构体的时候可以不写健,直接写值,但注意

  • 必须初始化结构体的所有字段
  • 值的顺序必须与字段在结构体中声明顺序一致
  • 不能与键值对初始化方式混用

实例代码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。

文章分类
后端
文章标签