1、什么是结构体?
Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型。结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。
2、定义格式
type struct_var_type struct {
member definition
member definition
......
member definition
}
3、使用案例
// 定义一个结构体
type Person struct {
name string
age int
sex string
score float32
}
// 方式一
var p1 Person
fmt.Println(p1)
p1.name = "张三"
p1.age = 19
p1.sex = "男"
p1.score = 98.1
fmt.Printf("姓名:%s,年龄:%d,性别:%s,分数:%f \n", p1.name, p1.age, p1.sex, p1.score)
// 方式二
p2 := Person{}
p2.name = "李四"
p2.age = 22
p2.sex = "女"
p2.score = 99.2
fmt.Printf("姓名:%s,年龄:%d,性别:%s,分数:%f \n", p2.name, p2.age, p2.sex, p2.score)
// 方式三
p3 := Person{name: "王五", age: 26, sex: "男", score: 60.9}
fmt.Printf("姓名:%s,年龄:%d,性别:%s,分数:%f \n", p3.name, p3.age, p3.sex, p3.score)
// 方式四
p4 := Person{"赵六", 22, "女", 88.9}
fmt.Printf("姓名:%s,年龄:%d,性别:%s,分数:%f \n", p4.name, p4.age, p4.sex, p4.score)
4、结构体指针
// 结构体是一个值类型
p5 := Person{"指针", 21, "男", 78.9}
fmt.Println(p5)
fmt.Printf("%p,%T \n", &p5, p5)
p6 := p5
fmt.Println(p6)
fmt.Printf("%p,%T\n", &p6, p6)
p6.name = "ly"
fmt.Println(p5)
fmt.Println(p6)
// 结构体指针,通过指针改变结构体的属性
var pp1 *Person
pp1 = &p5
fmt.Println(pp1)
fmt.Printf("%p,%T", pp1, pp1)
fmt.Println(pp1)
(*pp1).name = "结构体指针"
fmt.Println(pp1)
fmt.Println(p5)
5、内置函数new()
go语言中专门用于创建某种类型的指针的函数
pp2 := new(Person)
fmt.Printf("%p,%T\n", pp2, pp2)
fmt.Println(pp2)
fmt.Println(*pp2)
(*pp2).name = "hello go"
(*pp2).age = 20
(*pp2).sex = "女"
(*pp2).score = 22.9
fmt.Println(*pp2)
当然new()函数不止能创建结构体指针,还能创建其他的
// 使用new()函数创建其他类型的指针
pp3 := new(int) // 值类型
fmt.Printf("%p,%T \n", pp3, pp3)
pp4 := new([1]int) // 数组
fmt.Printf("%p,%T \n", pp4, pp4)
pp5 := new([]string) // 切片
fmt.Printf("%p,%T \n", pp5, pp5)
pp6 := new(map[int]string) // map
fmt.Printf("%p,%T \n", pp6, pp6)
pp7 := new(*int) // 指针的指针 // 指针类型
fmt.Printf("%p,%T \n", pp7, pp7)
注意:使用new()创建的指针不是nil,创建完成即具备只想内存地址的零值
6、匿名结构体
/*
匿名结构体:没有名字的结构体
创建结构体同时创建对象
变量名 := struct{
定义字段的Field
}{
对字段赋值
}
*/
s1 := struct {
name string
age int
}{
name: "张三",
age: 20,
}
fmt.Printf("类型为:%T,值为:%v \n", s1, s1)
fmt.Printf("name:%s,age:%d", s1.name, s1.age)
7、结构体中的匿名字段
type Worker struct {
// name string
// age int
string // 匿名字段
int // 匿名字段
// string // 匿名字段冲突
}
w2 := Worker{"李四", 22}
fmt.Println(w2.string, w2.int) // 默认使用数据类型作为名字
8、匿名结构体
/**
* @author ly (个人博客:https://www.cnblogs.com/ybbit)
* @date 2023/9/24 22:44
* @tags 喜欢就去努力的争取
*/
package main
import "fmt"
func main() {
// 结构体嵌套
u1 := User{
name: "ly",
age: 20,
address: Address{
city: "武汉",
state: "China",
},
}
fmt.Printf("类型为:%T,数据为:%v \n", u1, u1)
fmt.Printf("name:%s,age:%d,address:%v,city:%s,state:%s \n", u1.name, u1.age,
u1.address, u1.address.city, u1.address.state)
fmt.Println("=========================")
b1 := Book{"朝花夕拾", 99.9}
s1 := Student{name: "小明", age: 20, book: b1}
fmt.Println(s1)
fmt.Println("修改前", b1.bookName, b1.price)
fmt.Printf("%s ,拥有一本价格为 %.1f 的 %s 书籍 \n", s1.name, s1.book.price, s1.book.bookName)
// 值传递类型
s1.book.bookName = "西游记"
fmt.Println(s1)
fmt.Println("修改后", b1.bookName, b1.price)
fmt.Printf("%s ,拥有一本价格为 %.1f 的 %s 书籍 \n", s1.name, s1.book.price, s1.book.bookName)
fmt.Println("=============================")
b2 := Book{bookName: "水浒传", price: 29.9}
s2 := Student2{name: "ly", age: 23, book: &b2}
fmt.Println("修改前", b2.bookName, b2.price)
fmt.Println("修改前", s2.name, s2.age, *s2.book)
s2.book.bookName = "红楼梦"
fmt.Println("修改后", b2.bookName, b2.price)
fmt.Println("修改后", s2.name, s2.age, *s2.book)
}
// 地址
type Address struct {
city, state string
}
// 定义Person结构体
type User struct {
name string
age int
address Address
}
// 书
type Book struct {
bookName string
price float64
}
// 学生
type Student struct {
name string
age int
book Book
}
type Student2 struct {
name string
age int
book *Book
}
标签:name,23,age,Printf,Println,fmt,s1,结构
From: https://www.cnblogs.com/ybbit/p/17724294.html