天天看点

Go 结构体概念及使用细节

结构体概念及应用

  • 结构体和结构体变量(实例)的区别和联系
    • 结构体是自定义的数据类型,代表一类事物.
    • 结构体变量(实例)是具体的,实际的,代表一个具体变量
  • 基本语法
type 结构体名称 struct {
    field1 type
    field2 type
    ...
}
           
  • 举例:
type Student struct {
    Name string //字段
    Age int //字段
    Score float32
}
           

字段/属性

  • 基本介绍
    • 从概念或叫法上看:
      • 结构体字段 = 属性 = field 
    • 字段是结构体的一个组成部分,一般是基本数据类型、数组,也可是引用类型。
  • 注意事项和细节说明
    • 字段声明语法同变量
      • 示例:字段名 字段类型
    • 字段的类型可以为:
      • 基本类型、数组或引用类型
    •  在创建一个结构体变量后,如果没有给字段赋值,都对应一个零值(默认值)
      • 布尔类型是 false ,数值是 0 ,字符串是 ""。
      • 数组类型的默认值和它的元素类型相关,比如 score [3]int 则为[0, 0, 0]
      • 指针,slice,和 map 的零值都是 nil ,即还没有分配空间。
  • 演示案例
    • 如果结构体的字段类型是: 指针,slice,和map的零值都是 nil ,即还没有分配空间
    • 如果需要使用这样的字段,需要先make,才能使用.
type Person struct{
	Name string
	Age int
	Scores [5]float64
	ptr *int //指针 
	slice []int //切片
	map1 map[string]string //map
}

func main() {

	//定义结构体变量
	var p1 Person
	fmt.Println(p1)
}

if p1.ptr == nil {
	fmt.Println("ok1")
}

if p1.slice == nil {
	fmt.Println("ok2")
}

if p1.map1 == nil {
	fmt.Println("ok3")
}
           
  • 输出结果:
Go 结构体概念及使用细节
  • 使用slice, 再次说明,一定要make
p1.slice = make([]int, 10)
p1.slice[0] = 100 //ok
           
Go 结构体概念及使用细节
  • 使用map, 一定要先make
p1.map1 = make(map[string]string)
p1.map1["key1"] = "tom~" 
fmt.Println(p1)
           
Go 结构体概念及使用细节
  • 不同结构体变量的字段是独立,互不影响,一个结构体变量字段的更改,不影响另外一个, 结构体是值类型。
var monster1 Monster
monster1.Name = "牛魔王"
monster1.Age = 500

monster2 := monster1     -- 结构体是值类型,默认为值拷贝
monster2.Name = "青牛精"

fmt.Println("monster1=", monster1) //monster1= {牛魔王 500}
fmt.Println("monster2=", monster2) //monster2= {青牛精 500}
           
Go 结构体概念及使用细节