一 结构体和结构体变量的区别和联系
1 结构体是自定义的数据类型,代表一类事物。
2 结构体变量(实例)是具体的,实际的,代表一个具体变量。
二 结构体变量在内存的布局
三 如何声明结构体
1 基本语法
type 结构体名称 struct {
field1 type
field2 type
}
2 举例
type Student struct {
Name string // 字段
Age int // 字段
Score float32 // 字段
}
四 字段/属性
1 基本介绍
a 从概念或叫法上看:结构体字段 = 属性 = field。
b 字段是结构体的一个组成部分,一般是基本数据类型、数组,也可是 引用类型。比如:猫结构体的 Name string 就是属性。
2 注意事项和细节说明
a 字段声明语法同变量。
示例
字段名 字段类型
b 字段的类型可以为:基本类型、数组或引用类型。
c 在创建一个结构体变量后,如果没有给字段赋值,都对应一个零值(默认值)。
布尔类型:false
数值是:0
字符串:""
数组类型的默认值和它的元素类型相关。比如 score [3]int 为[0, 0, 0]。
指针、slice 和 map:nil,即还没有分配空间。
3 实战
a 代码
package main
import (
"fmt"
)
// 如果结构体的字段类型是: 指针、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")
}
// 使用 slice,一定要 make
p1.slice = make([]int, 10)
p1.slice[0] = 100 // ok
// 使用 map, 一定要 make
p1.map1 = make(map[string]string)
p1.map1["key1"] = "tom~"
fmt.Println(p1)
}
b 测试
{ 0 [0 0 0 0 0] <nil> [] map[]}
ok1
ok2
ok3
{ 0 [0 0 0 0 0] <nil> [100 0 0 0 0 0 0 0 0 0] map[key1:tom~]}
4 不同结构体变量的字段是独立,互不影响,一个结构体变量字段的更改,不影响另外一个, 结构体是值类型。
a 代码
package main
import "fmt"
type Monster struct{
Name string
Age int
}
func main() {
// 不同结构体变量的字段是独立,互不影响,一个结构体变量字段的更改,不影响另外一个, 结构体是值类型
var monster1 Monster
monster1.Name = "牛魔王"
monster1.Age = 500
monster2 := monster1 // 结构体是值类型,默认为值拷贝
monster2.Name = "青牛精"
fmt.Println("monster1=", monster1) // monster1= {牛魔王 500}
fmt.Println("monster2=", monster2) // monster2= {青牛精 500}
}
b 测试
monster1= {牛魔王 500}
monster2= {青牛精 500}
c 图解