分享

结构体

 Coder编程 2022-12-02 发布于北京

结构体定义和使用

#pargram mark 结构体定义 
/*
 type 结构体名称 struct {
//结构体成员
成员 + 数据类型
}
*/

#pargram mark 定义结构体
type Student struct{
name  string
age int
sex string
}

// var 结构体变量名 结构体数据类型 = {姓名,年龄 ....}

//自动推导类型 stu := Student{"曹操", 65, "男", 80, "河南许昌"}

var stu Student = Student{"sobot", 18, "man"}

#pargram mark 声明结构体变量
var stu Student
stu.name = "sobot"
stu.age = 28
stu.sex = "man"

//获取结构体成员   通过点语法
fmt.Println(stu.name)

结构体的赋值和比较

type Stud struct {
name  string
age   int
sex   string
}
//MARK: 创建结构体变量
stu := Stud{"刘备", 58, "男"}
//MARK:将一个结构体变量赋值给另外一个结构体变量 前提是 具有相同的结构体类型
var s Stud = stu
//修改结构体变量
fmt.Println(stu)
fmt.Println(s)

fmt.Printf("%p\n", &s)
fmt.Printf("%p\n", &stu)

/********* 结构体比较 ***********/
stu := Stud{"关羽", 54, "男"}

s := Stud{"张飞", 50, "男"}

//比较两个结构体变量 比较结构体成员内容

if stu == s {
fmt.Println("相同")
} else {
fmt.Println("不同")
}

 

结构体切片

type Student struct{
name string
age int
}

//var slice []结构体数据类型

//var slice []Student=make([]Student,5)
//slice[0] = Student{"刘备", 50, "男", 60, "巴蜀"}

var slice []Student
slice = append(slice, Student{"刘备", 50},
Student{"孙尚香", 20, "女"},
Student{"甄宓", 28, "女"})

//在内存中存储两个相同内容 独立内存地址的数据
//修改一个不影响另外一个
s := make([]Student, 3)
copy(s, slice)

结构体作为map的值

m:=make(map[int]Student)

//赋值
m[1001] = Student{"a",20}
m[1002] = Student{"b",30}
m[1003] = Student{"c",20}
m[1004] = Student{"f",18}

//注意:将结构体作为map的value时 在修改数据时 必须整体修改
m[1003] = Student{"修改",17}

//可以获取 ,不能修改
fmt.Println(m[1001].name)

//遍历map中的数据
for k,v:=range m {
fmt.Println(k,v)
}

delete(m,1003)
delete(m,1001)
fmt.Println(m)

/************** 结构体map值为切片 **********/
m:=make(map[int][]Student)

m[1001] = []Student{
{"A",20},
{"B",18},
}

m[1002] = []Student{
{"C",17},
{"F",20},
}

fmt.Println(m)

结构体嵌套结构体

type Person struct {
name string
age int
sex string

//结构体不能嵌套本结构体 在创建结构体时 无法预知内存大小 (不要相互引用 A引用A,或是A引用B,B引用A)
//Person//err
}

//结构体嵌套写法1
type Teacher1 struct{
p Person
subject string
worktime int
}
//结构体嵌套写法2
type Teacher2 struct{
//如果结构体嵌套结构体 通过匿名字段使用结构体
Person   //匿名字段
subject string
worktime int
}

//结构体初始化
var tea Teacher1 = Teacher1{Person{"法师", 32, "男"}, "go语言开发", 10}
//修改成员变量
tea.p.name = "大帅哥"
fmt.Println(tea.p.name)

//结构体初始化
var tea Teacher2 = Teacher2{Person{"法师 ", 32, "男"}, "go语言开发", 10}
//修改数据
tea.name = "大帅哥"
fmt.Println(tea.name)

结构体作为函数参数

/********************  值传递 形参不能修改实参的值 ********************/
//结构体变量作为函数参数
func test (s students){
fmt.Println(s)
}

//结构体数组作为函数参数  
func test1(arr [3]int){
fmt.Println(arr)
}
//结构体数组作为函数参数是值传递 形参不能修改实参的值
arr:=[3]Student{"法师",32,男"},{"玉姐",18,"女"},{"丁丁",26,"男"}}
test1(arr)

/******************** 地址传递(引用传递) 形参可以修改实参的值 map,slice ********************/
//结构体切片作为函数参数
func test2(slice []Students) {
fmt.Printf("%p\n", slice)
slice[0].name = "大帅哥"
}
//结构体map作为函数参数
func test3(m map[int]Students) {
//修改
//m[1001]=Students{"大帅哥",32,"男"}
//删除
//delete(m,1001)
//添加数据
m[1111]=Students{"大光头",40,"男"}
}
slice := [] Student{{"法师", 32, "男"}, {"玉姐", 18, "女"}, {"丁丁", 26, "男"}}
test2(slice)

m := map[int] Student{1001: {"法师", 32, "男"}, 1003: {"玉姐", 18, "女"}, 1008: {"丁丁", 26, "男"}}
test3(m)

指针

指针:
指针是一种数据类型,存储的是变量地址

指针类型定义:
var 指针变量名 指针类型 = &变量

可以通过指针间接修改变量的值
*指针变量 = 值

*取值运算符
&取地址运算符

new创建空间

```
//声明指针 默认值为nil nil是一个内存地址编号为0的空间
var p *int

//创建内存空间 赋值给质变量
//new(数据类型)
p = new(int)
*p=123
```

 

 

 

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多