go从0到1项目实战体系八:struct结构体
2023-12-22 10:42:55
1. 概念:
①. 用来自定义复杂数据结构.
②. struct中可以包含多个字段(属性).
③. struct类型可以定义方法,注意和函数的区分:
(1). 可以将一些方法和结构体关联
④. struct类型是值类型,只有传指针,才能修改值.
⑤. struct类型可以嵌套.
⑥. Go语言没有class类型,只有struct类型.
2. 声明:
①. 定义:
type 标识符 struct {
field1 type
field2 type
}
3. 操作:
type Student struct {
Name string
Age int
}
①. 定义方式1(定义值类型):
var stu Student
// 赋值
stu.Name = "tony"
stu.Age = 18
// 访问字段
fmt.Printf("name=%s age=%d score=%d", stu.Name, stu.Age, stu.Score)
②. 定义方式2(定义值类型) - 创建一个结构体值类型:
var stu Student = Student{
Name: "david" // 只初始化部分变量
}
③. 定义方式2(new分配一个结构体):
var stu *Student = new(Student) // 返回指向结构体的指针,在c语言new声明内存空间,要自己释放
④. 定义方式3:
var stu *Student = &Student{ // 返回指向结构体的指针
Name: "david",
Age: 11,
}
(*stu).Name、(*stu).Age
(1). 内存布局:
①. struct中的所有字段在内存是连续的.
②. 两个指针是连续的.指针指向的内存地址不是连续的.
怎么证明是连续的?
(2). 单链表:
①. 数组定义几个元素,长度就是固定的,是连续的地址空间.这样就可以通过下标来访问.
②. 结构:
type Student struct {
Name string
Next* Student // 指向另外一个结构体
}
a. 相当于一根绳子,把所有结构体串起来.
b. 链表就是每个节点包含下一个节点的地址,把所有的节点串起来了.
c. 通常把链表中的第一个节点叫做链表头,最后一个节点指针是nil.
d. 链表地址是不连续的,next地址是分配的.大小也不是固定长度的.
e. 如果最后一个节点的指针指向第一个节点的地址,就是循环单链表.
③. 弊端:
a. 只能从头往后走.
b. 删除其中一个节点,只能将它上一个节点的指针指向它下一个节点的地址.
(3). 单链表代码(尾部插入法,都是在每个节点的尾部进行插入):
type Stu struct {
Name string
Next *Stu
}
func main() {
// 普通节点赋值
stu1 := &Stu{Name: "david"}
stu2 := &Stu{Name: "lily", Next: nil}
stu1.Next = stu2 // 将stu2加入stu1中的Next
var p *Stu = stu1 // 定义头节点
for p != nil {
fmt.Println(*p) // {david 0xc0000044a0} {lily <nil>}
p = (*p).Next
}
// 循环
}
文章来源:https://blog.csdn.net/m0_68635815/article/details/135146255
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!