结构体的实例化
结构体的定义只是一种内存布局的描述,只有当结构体实例化时,才会真正地分配内存,因此必须在定义结构体并实例化后才能使用结构体的字段。实例化就是根据结构体定义的格式创建一份与格式一致的内存区域,结构体实例与实例间的内存是完全独立的。
实例化方 式包括如下几种。
2.1、声明结构体变量再赋值
结构体本身是一种类型,可以像整型、字符串等类型一样,以 var 的方式声明结构体即可完成实例化。
package main
import "fmt"
type Student struct {
sid int
name string
age int8
course []string // 选秀课程
}
func main() {
// 声明一个结构体对象 ,值类型,默认开辟空间,字段赋予零值
var s Student
fmt.Println("s:", s)
// 要访问结构体成员,需要使用点号 . 操作符
fmt.Println(s.name)
// 更改成员变量的值
s.name = "yuan"
fmt.Println(s.name)
// s.course[0] = "chinese" // 结果,如何调整
}
提示
1、结构体属于值类型,即var声明后会像整形字符串一样创建内存空间。
提示
2、创建结构体对象如果没有给字段赋值,则默认零值(字符串默认 "",数值默认0,布尔默认false,切片和map默认nil对象)
结构体的内存存储:
package main
import "fmt"
type Student struct {
sid int
name string
age int8
course []string // 选秀课程
}
func main() {
// 声明一个结构体对象 ,值类型,默认开辟空间,字段赋予零值
var s Student
fmt.Println("s:", s)
s.sid = 1001
s.name = "yuan"
s.age = 23
s.course = []string{"chinese", "math", "english"}
fmt.Printf("%p\n", &s)
fmt.Printf("%p\n", &(s.sid))
fmt.Printf("%p\n", &(s.name))
fmt.Printf("%p\n", &(s.age))
fmt.Printf("%p\n", &(s.course)) // 切片24个字节
}
之前我们学习过值类型和引用类型,知道值类型是变量对应的地址直接存储值,而引用类型是变量对应地址存储的是地址。因为结构体因为是值类型,所以p的地址与存储的第一个值的地址是相同的,而后面每一个成员变量的地址是连续的。