Go语言学习——结构体定义、结构体实例化、匿名结构体、结构体初始化、结构体内存布局
结构体
结构体的定义
结构体实例化
匿名结构体
结构体是值类型
package main
import "fmt"
// 结构体
type person struct {
name string
age int
gender string
hobby []string
}
func main () {
// 声明一个person类型的变量 p
var p person
// 通过字段赋值
p.name = "diaochan"
p.age = 18
p.gender = "女"
p.hobby = []string{"古琴", "网球", "琵琶"}
fmt.Println(p)
fmt.Printf("%T\n", p) // main.person
// 访问变量p的字段
fmt.Println(p.name)
var p2 person
p2.name = "理想"
p2.age = 18
fmt.Printf("type:%T value:%v\n", p2, p2) // type:main.person value:{理想 18 []}
// 匿名结构体:多用于临时场景
var user struct {
name string
age int
}
user.name = "嫦娥"
user.age = 12
fmt.Printf("type:%T value:%v\n", user, user) // type:struct { name string; age int } value:{嫦娥 12}
}
创建指针类型结构体
内存地址起了个名字叫指针
结构体初始化
使用键值对初始化
使用值的列表初始化
使用这种格式初始化时,需要注意:
- 必须初始化结构体的所有字段。
- 初始值的填充顺序必须与字段在结构体中的声明顺序一致。
- 该方式不能和键值初始化方式混用。
package main
import "fmt"
// 结构体是值类型
type person struct {
name, gender string
}
// Go语言中函数传参数永远传的是拷贝
func f(x person){
x.gender = "雌性" // 修改的是副本的gender
}
func f2(x *person){
// (*x).gender = "雌性" // 根据内存地址找到那个原变量,修改的就是原来的变量
x.gender = "雌性" // 语法糖,自动根据指针找对应的变量
}
func main (){
var p person
p.name = "熊猫"
p.gender = "雄性"
f(p)
fmt.Println(p.gender) // 雄性
f2(&p) // 内存地址
fmt.Println(p.gender) // 雌性
// 1. 结构体指针1
var p2 = new(person)
(*p2).name = "理想"
p2.gender = "保密"
fmt.Printf("%T\n", p2) // *main.person
fmt.Println(p2) // &{ }
fmt.Printf("%p\n", p2) // 0xc0000a43c0 p2保存的值就是一个内存地址
fmt.Println(&p2) // 0xc0000ce020 P2的内存地址
// 2. 结构体指针2
// 2.1 key value 初始化
var p3 = person{
// var p3 = &person{
name: "杜鹃",
gender: "女",
}
fmt.Printf("%#v\n", p3) // main.person{name:"杜鹃", gender:"女"}
// 使用值列表的形式初始化 值的顺序要和结构体定义时字段的顺序一致
p4 := person{
"玫瑰",
"女",
}
fmt.Printf("%#v\n", p4) // main.person{name:"玫瑰", gender:"女"}
}
结构体内存布局
一个结构体里面的字段在内存是连到一起的
一个结构体占一块连续的内存
package main
import "fmt"
// 结构体占用一块连续的内存
type x struct{
a int8 // 8bit=1byte
b int8
c int8
}
func main(){
m := x{
a: int8(10),
b: int8(20),
c: int8(30),
}
fmt.Printf("%p\n", &(m.a)) // 0xc0000aa058
fmt.Printf("%p\n", &(m.b)) // 0xc0000aa059
fmt.Printf("%p\n", &(m.c)) // 0xc0000aa05a
}
本文来自博客园,作者:寻月隐君,转载请注明原文链接:https://www.cnblogs.com/QiaoPengjun/p/16298465.html