23、结构体

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)

image

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) // 默认使用数据类型作为名字

image

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
}

image

posted @   我也有梦想呀  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示