目录
概念:结构体是自定义复杂数据结构,struc里面可以包含多个字段(属性) , struct类型可以定义方法,和函数有区分,struct属于值类型,且可以做嵌套,Go中没有Class类型, 只有struct类型。 示例:结构体定义
package main
import "fmt"
//结构体定义
type student struct {
name string
age int
score float32
next *student //指向自己就是链表结构
}
// type student struct {
// name string
// age int
// score float32
// next person //嵌套机构体
// }
// type person struct {
// }
func main() {
//实体
//var head student //第一种定义方式
//var head *student = new(student) //第二种定义方式
var head *student = &student{} //第三种定义方式
head.name = "head"
head.age = 20
head.score = 80
//实体2
var stu1 student
stu1.name = "name"
stu1.age = 21
stu1.score = 50
//指针指向实体2
head.next = &stu1
//输出调用
fmt.Println(head)
fmt.Println((*head).name)
fmt.Println(head.name)
}
[Running] go run "f:\goProject\src\dev_code\day17\example1\amin\main.go"
&{head 20 80 0xc0001104b0}
head
head
[Done] exited with code=0 in 0.488 seconds
struc定义的三种形式:其中2和3都是返回结构体的指针。
1: var stu Student
2: var stu *Student = new (Stydent)
3: var stu *Student = &Student {}
调用:
stu. Name、stu.Age、 stu. Score
或者
(*stu) .Name、 (*stu).Age、 ( *stu).Score
1,存储方式
示例:值类型存储方式地址空间连续。
package main
import "fmt"
//结构体定义
type student struct {
name string
age int
score float32
next *student //指向自己就是链表结构
}
func main() {
//实体
//var head student //第一种定义方式
//var head *student = new(student) //第二种定义方式
var head *student = &student{} //第三种定义方式
head.name = "head"
head.age = 20
head.score = 80
fmt.Printf("name:%p\n", &head.name)
fmt.Printf("age:%p\n", &head.age)
fmt.Printf("score:%p\n", &head.score)
}
[Running] go run "f:\goProject\src\dev_code\day17\example2\main\main.go"
name:0xc0000c2450 //结构体内属性的存储地址都是连续的
age:0xc0000c2460
score:0xc0000c2468
[Done] exited with code=0 in 0.647 seconds
2,链表更新
示例:链表方式串联结构体。链表:大小不固定,地址不连续,长度不同定,链表中第一个元素称为头部, 最后一个元素指针指向nil. 链表分类为,单链表、双链表、循环单链表、循环双链表。
示例:
package main
import (
"fmt"
"math/rand"
)
//定义结构体
type student struct {
name string
age int
score float32
next *student //存放下一个结构体的地址,用*指就是下一个结构体
}
func main() {
//定义头部结构体
var head student
head.name = "head"
head.age = 20
head.score = 90
//定义第二个结构体
var stu1 student
stu1.name = "stu1"
stu1.age = 21
stu1.score = 91
//串联两个结构体
//head.next = &stu1
//第三个结构体
var stu2 student
stu2.name = "stu2"
stu2.age = 22
stu2.score = 95
//串联第三第二个结构体
stu1.next = &stu2
//第四个结构体
var stu3 student
stu3.name = "stu3"
stu3.age = 23
stu3.score = 96
//串联第四第三个结构体
stu2.next = &stu3
inserthead(&head)
//在头部插入
// var tmp3 = new(student)
// for i := 20; i < 25; i++ {
// var stu student = student{
// name: fmt.Sprin