结构体 #
数组用来存储相同类型的数据
结构体用来存储不同类型的数据、结构体名在同一包内不能重复
结构体语法定义格式 #
type 结构体名 struct {
成员变量名1 变量类型
成员变量名2 变量类型
成员变量名3 ,成员变量名4 变量类型 //相同类型的成员可以写在同一行并用逗号分隔
成员变量名4 包名.接口名
成员变量名5 结构体名
成员变量名6 *变量类型 //指针类型
结构体名N //类似继承的意思
数据类型名 //匿名成员,且不能有重复的数据类型名,如 int、float、string等
}
定义结构体变量:
1.仅声明结构体变量
var 结构体变量名 结构体名
2.实例化结构体变量返回指针类型
结构体变量名 := new(结构体名) 等价语法 结构体变量名 := &结构体名{}
3.普通方式实例化(即实例化结构体变量返回非指针类型)
//按定义结构体成员顺序进行赋值且必须初始化所有成员
结构体变量名 := 结构体名{值1, 值N}
4.按键值对的方式实例化结构体并初始化值
//按成员名赋值,但可以不初始化所有成员,未初始化的成员值为成员变量类型的默认值
//非指针类型方式
结构体变量名 := 结构体名{成员名1: 值1, 成员名N:值N }
//指针类型方式
结构体变量名 := &结构体名{成员名1:值1, 成员名N:值N}
设置成员变量值: 结构体变量名.成员名 = 值
结构体变量名1.组合结构体名.成员名 = 值
获取成员变量值: abc :=结构体变量名.成员名
abc2 :=结构体变量名.组合结构体名.成员名
为结构体增加方法(注意带*号和不带*号的区别):
//方式1: 没有*号,即非引用方式
func (变量名 结构体名) 方法名1(参数列表) 返回值列表 {
}
//方式2: 用*号,即引用方式,指针方式
func (变量名 *结构体名) 方法名1(参数列表) 返回值列表 {
}
匿名结构体:
//1.声明普通匿名结构体变量:返回非指针类型,普通变量
变量名 := struct {
成员变量名1 变量类型
}{初始化值可选}
//2.声明指针类型的匿名结构体变量:这种方式返回指针类型
变量名 := &struct {
成员变量1 变量类型
}{初始化值可选}
定义空结构体示例 #
//1.匿名方式
empty01 := struct {
}{}
//2.非匿名方式
type empty02 struct {
}
fmt.Println(empty01, empty02{}) // {} {}
结构体定义与使用示例 #
package main
import "fmt"
type person struct {
name string
age int
}
//返回结构体指针类型变量
func NewPerson(name string) *person {
p := person{name: name}
p.age = 42
return &p
}
func main() {
fmt.Println(person{"张三", 20}) //{张三 20}
fmt.Println(person{name: "李四", age: 30}) //{李四 30}
fmt.Println(&person{name: "引用类型", age: 40}) //&{引用类型 40}
fmt.Println(NewPerson("42岁的程咬金")) //&{42岁的程咬金 42}
abc := NewPerson("孙尚香")
fmt.Println(abc.name) //孙尚香
var xyz person
xyz.name = "亚瑟"
fmt.Println(xyz) //{亚瑟 0}
fmt.Printf("%#v\n", xyz) //main.person{name:"亚瑟", age:0}
fmt.Printf("%T\n", xyz) //main.person
//匿名结构体
var user struct{Name string; Age int}
user.Name = "后裔"
user.Age = 18
fmt.Printf("%#v\n", user) //struct { Name string; Age int }{Name:"后裔", Age:18}
}
方法和接收者 #
func (接收者变量 接收者类型) 方法名(参数列表) (返回参数) {
函数体
}
其中:接收者类型:可以是指针类型和非指针类型
方法名、参数列表、返回参数:具体格式与函数定义相同
示例:
package main
import "fmt"
type person struct {
name string
age int
}
//返回结构体指针类型变量
func NewPerson2(name string, age int) *person {
return &person{
name: name,
age: age,
}
}
//为结构体添加方法
func (p person) Hi() {
fmt.Printf("hi,%s\n", p.name)
}
func (p *person) SetAge(newAge int) {
p.age = newAge
}
func main() {
var xyz person
xyz.name = "亚瑟123"
xyz.Hi() //hi,亚瑟123
abc := NewPerson2("程咬金", 18)
//abc.age = 27
abc.SetAge(27)
abc.Hi() //hi,程咬金
fmt.Println(abc.age) //27
}
批量定义结构体 #
格式:
type (
结构体名1 struct {
结构体成员定义1
}
结构体名2 struct {
结构体成员定义2
}
结构体名N struct {
结构体成员定义N
}
)
示例:
package main
import "fmt"
func main() {
type (
cat struct {
Name string
Age int `json:"age" id:"100"`
}
color struct {
Red string
Blank string
}
)
catStruct := cat{Name:"黑猫"}
fmt.Println(catStruct)
colorStruct := color{Blank:"黑色"}
fmt.Println(colorStruct)
}
输出如下:
{黑猫 0}
{ 黑色}