【入门】Go语言结构体(struct)详解
一、结构体介绍
1.1 什么是结构体?
- 结构体是一种自定义的数据类型,用于表示一组相关的数据字段。
- 结构体可以包含任意数量和类型的字段,每个字段都有一个名称和一个类型。
- 结构体的定义使用关键字
type
和struct
。
二、结构体定义与初始化
2.1 结构体定义
语法:
type 结构体名 struct {
字段1 数据类型1
字段2 数据类型2
...
}
举个例子:
type Class struct{
id int
name string
age int
credit int
}
2.2 结构体初始化
package main
import (
"fmt"
)
type Class struct {
id int
name string
age int
credit int
}
func main() {
// 第一种:按照顺序初始化
var zhangsan Class = Class{1, "zhangsan", 18, 100}
// 第二种:部分初始化
var lisi Class = Class{name: "lisi", age: 20}
// 第三种: 结构体.成员 方式初始化
var wangwu Class
wangwu.id = 3
wangwu.name = "wangwu"
wangwu.age = 23
// 第四种:自动推导类型初始化
maliu := Class{4, "maliu", 18, 90}
fmt.Printf("%v\n%v\n%v\n%v\n", zhangsan, lisi, wangwu, maliu)
}
代码输出内容:
{1 zhangsan 18 100}
{0 lisi 20 0}
{3 wangwu 23 0}
{4 maliu 18 90}
三、拓展
3.1 结构体与数组
创建arr数组,引用Class结构体类型
package main
import "fmt"
type Class struct {
id int
name string
age int
credit int
}
func main() {
var arr [3]Class = [3]Class{
{1, "zhangsan", 18, 200},
{2, "lisi", 19, 100},
{3, "wagnwu", 22, 300},
}
// 修改结构体成员值
arr[0].age = 666
// 输出整个数组
fmt.Println(arr)
// 输出下标0的名称
fmt.Println(arr[0].name)
// 输出下标0的年龄
fmt.Println(arr[0].age)
}
代码输出内容:
[{1 zhangsan 666 200} {2 lisi 19 100} {3 wagnwu 22 300}]
zhangsan
666
遍历循环:
package main
import "fmt"
type Class struct {
id int
name string
age int
credit int
}
func main() {
var arr [3]Class = [3]Class{
{101, "zhangsan", 18, 100},
{102, "lisi", 20, 90},
{103, "wangwu", 21, 80},
}
// 传统for循环
for i := 0; i < len(arr); i++ {
fmt.Println(arr[i].name) // 遍历name成员
}
for i := range arr {
fmt.Println(arr[i].age) // 遍历age成员
}
}
代码输出内容:
zhangsan
lisi
wangwu
18
20
21
3.2 结构体与切片
package main
import "fmt"
type Class struct {
id int
name string
age int
credit int
}
func main() {
// 定义切片使用Class类型
var s []Class = []Class{
{101, "zhangsan", 10, 20},
{102, "lisi", 20, 30},
{103, "wangwu", 30, 100},
}
// 修改值
s[0].age = 666
// 末尾追加元素
s = append(s, Class{104, "maliu", 28, 100})
// 遍历切片
for i := 0; i < len(s); i++ {
fmt.Println(s[i])
}
}
代码输出内容:
{101 zhangsan 666 20}
{102 lisi 20 30}
{103 wangwu 30 100}
{104 maliu 28 100}
3.3 结构体与map
定义map value的类型使用结构体Class类型
package main
import "fmt"
type Class struct {
id int
name string
age int
credit int
}
func main() {
// 定义map value的类型使用结构体Class类型
m := make(map[int]Class)
// 初始化map
m[1] = Class{101, "zhangsna", 100, 100}
m[2] = Class{102, "lisi", 18, 100}
m[3] = Class{103, "wagnwu", 28, 10}
// 删除map中的值
delete(m, 2)
// 遍历map
for key, value := range m {
fmt.Printf("key:%v\tvalue:%v\n", key, value)
}
}
代码输出内容:
key:3 value:{103 wagnwu 28 10}
key:1 value:{101 zhangsna 100 100}
3.4 结构体作为函数参数
package main
import "fmt"
type Class struct {
id int
name string
age int
credit int
}
func main() {
// 初始化结构体
var zhangs Class = Class{10, "zhangsan", 100, 200}
// 调用函数传入 zhangs
PrintDemo(zhangs)
}
// 定义函数实现打印输入信息
func PrintDemo(str Class) {
fmt.Println(str)
}
代码输出内容:
{10 zhangsan 100 200}
注意:在函数内部修改结构体成员值,不会影响到结构体
package main
import "fmt"
type Class struct {
id int
name string
age int
credit int
}
func main() {
var zhangs Class = Class{10, "zhangsan", 100, 200}
EditStruct(zhangs)
fmt.Println(zhangs)
}
func EditStruct(str Class) {
// 修改结构体成员值
str.name = "lisi"
}
代码输出内容:
{10 zhangsan 100 200}
案例:输出年龄最大的学生信息
package main
import "fmt"
type Class struct {
id int
name string
age int
credit int
}
func main() {
var s = make([]Class, 3)
InitData(s)
GetMaxAge(s)
}
func InitData(str []Class) {
for i := 0; i < len(str); i++ {
fmt.Printf("请输入%d学生的信息:", i+1)
fmt.Scan(&str[i].id, &str[i].name, &str[i].age, &str[i].credit)
}
}
func GetMaxAge(str []Class) {
max := str[0].age
var maxIndex int
for i := 0; i < len(str); i++ {
if str[i].age > max {
max = str[i].age
maxIndex = i
}
}
fmt.Printf("年龄最大同学详细信息:%v", str[maxIndex])
}
代码输出内容:
请输入1学生的信息:100 zhangsan 18 200
请输入2学生的信息:200 lisi 22 20
请输入3学生的信息:300 wangwu 50 100
年龄最大同学详细信息:{300 wangwu 50 100}