【入门】Go语言结构体(struct)详解

发布时间 2023-04-02 15:56:35作者: 躺平摆烂

一、结构体介绍

1.1 什么是结构体?

  • 结构体是一种自定义的数据类型,用于表示一组相关的数据字段。
  • 结构体可以包含任意数量和类型的字段,每个字段都有一个名称和一个类型。
  • 结构体的定义使用关键字 typestruct

二、结构体定义与初始化

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结构体类型

[{101 zhangsan 100 100} {102 lisi 20 90} {103 wangwu 21 80}]
{101 zhangsan 100 100}
100

代码输出内容:

[{101 zhangsan 100 100} {102 lisi 20 90} {103 wangwu 21 80}]
{101 zhangsan 100 100}
100

遍历循环:

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}