结构体

结构体 #

数组用来存储相同类型的数据
结构体用来存储不同类型的数据、结构体名在同一包内不能重复

结构体语法定义格式 #

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}
{ 黑色}
Build by Loppo 0.6.15