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}
}

创建指针类型结构体

内存地址起了个名字叫指针

结构体初始化

使用键值对初始化

使用值的列表初始化

使用这种格式初始化时,需要注意:

  1. 必须初始化结构体的所有字段。
  2. 初始值的填充顺序必须与字段在结构体中的声明顺序一致。
  3. 该方式不能和键值初始化方式混用。
    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
}
posted @ 2022-05-22 17:36  寻月隐君  阅读(75)  评论(0编辑  收藏  举报