首页 > 其他分享 >23、结构体

23、结构体

时间:2023-09-24 23:33:56浏览次数:24  
标签:name 23 age Printf Println fmt s1 结构

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

标签:name,23,age,Printf,Println,fmt,s1,结构
From: https://www.cnblogs.com/ybbit/p/17724294.html

相关文章

  • 2023.9.24 lx2080 Serdes Config
    //sedesprotocolconfiguration:ubootnoprintinfo[lx2160a]bootfailwhenSRDS_PRTCL_S2=10-NXPCommunity //sys_clock与ref_clock:系统时钟内部提供;外部参考时钟可以根据外设的频率需求设计......
  • 洛谷P2341 [USACO03FALL] 受欢迎的牛 G
    P2341受欢迎的牛G题解这题我们需要了解强连通分量一、定义在有向图\(G\)中,如果两个顶点\(u\),\(v\)间有一条从\(u\)到\(v\)的有向路径,同时还有一条从\(v\)到\(u\)的有向路径,则称两个顶点强连通。如果有向图\(G\)的每两个顶点都强连通,称\(G\)是一个强连通......
  • 2023-9-24 #70 苦难与欢欣 破损后沉入往昔
    ——《碎镜》(不知道怎么标作者,放个链接吧)496ARC143FCountingSubsets注意到在背包的过程中,第一个产生\(2\)的数很特殊,假设此时左右侧均有\(k\)个\(1\)。归纳可证,背包左右侧\(1\)个数恒为\(k\),且转移形如“将中间部分复制一遍,并在两份中间插入长度\([a,2a]\)的段”......
  • Linux第二章文件管理 2023.9.24
    计算机科学与技术1班 学号:20218503姓名:曾庆玲一目录操作首先:cd/cd//切换到根目录1、创建目录mkdirswxy2、查看目录(1)pwd 显示当前所在目录(2)pwd-p显示实际工作目录(3)ls-a查看隐藏的目录与文件(4)ls-l 查看目录与文件的属性3、切换目录(1)cd不加任何路......
  • 2023 9.18~9.23 总结
    这周的比赛情况不是很好,很多题都犯了不应该犯的错误。其实很多替我都是有能力做出来的,但是不熟练或没有好好想。很多数据结构需要多打,如:ST表、dijkstra,这写数据结构虽然会写,但不能很灵活地运用。这周打了两场ZROJ的比赛,感觉都不好,以后做题还是要多多想想,把题意简化。第一场比......
  • crash —— 如何获取结构体成员指向的结构的内容?
    有时我们得到了某个结构体的地址,这个结构体内部有一个指向另外一个数据结构的指针,那么如何快速输出另外一个数据的内容。这里有两种方法,还是以task_struct为例,我想输出mm成员的内容:方法1根据结构体的地址输出指针成员的值,然后再进行二次引用crash>*task_struct.mmffff893e38......
  • 20230924
    //deposit,difficulty,intention,marine,materialize,oblige,party,pilferage,profit,quotation,steamship,gooverdeposit-存款Adepositreferstoasumofmoneythatisplacedintoabankaccountorheldbyaninstitutionforsafekeeping.Itcanal......
  • 20230924天七集训测试总结
    这场考试败在策略,节奏被T1完全打乱了,导致T3甚至把题读错了(竟然有分)。按理来说是应该先把题看完的,但可能是前几次考试比较能平推的原因,这次没有先看所有题。暴力拿稳其实有很多分的。吸取一个教训吧。感觉这一整套题的思维难度都并没有那么深,但带有迷惑性且细节巨多。T1卡空......
  • 20230924学习总结
    1、DataGrip连接hive数据库DataGrip是JetBrains旗下的一款数据库管理软件,通过它能更方便的操作虚拟机中的hive数据库 依次点击+ ->数据源->ApacheHive进入配置链接界面 主机处填虚拟地址,用户密码填虚拟机账号密码(配置无误情况下仍可能连接失败,等候几分钟重试即可)2......
  • crash —— 如果知道结构体内部某个成员的地址,如何输出结构体内容?
    以下面的task_struct为例:crash>*task_struct-oxffff893e3846e000structtask_struct{[ffff893e3846e000]structthread_infothread_info;[ffff893e3846e010]volatilelongstate;[ffff893e3846e018]void*stack;[ffff893e3846e020]atomic_tusage;[ff......