首页 > 其他分享 >【入门】Go语言结构体(struct)详解

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

时间:2023-04-02 16:00:54浏览次数:40  
标签:struct int fmt age 详解 Go 100 main Class

目录

一、结构体介绍

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

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)

}

代码输出内容:

[{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}

标签:struct,int,fmt,age,详解,Go,100,main,Class
From: https://www.cnblogs.com/qinziteng/p/17280098.html

相关文章

  • Golang 需要至少 5 个操作系统线程
    Golang需要至少5个操作系统线程主线程:Golang代码执行的入口点,负责初始化程序,并启动其他Goroutine。垃圾回收器线程:Golang内置了垃圾回收器,使用专门的线程来执行垃圾回收操作,回收不再使用的内存空间。CPU核心数个系统线程:每个核心需要一个系统线程来支持并发任务的执行......
  • golang 是抢占式调度 如果协程不主动让出 或者 阻塞 可以一直运行
    设置处理的器的数量为1是什么将处理器设置为1就是可以控制线程数呢?在GMP模型中,P与M一对一的挂载形式,通过设定GOMAXPROCS变量就能控制并行线程数。演示案例packagemainimport( "fmt" "runtime" "runtime/debug" "runtime/pprof" "time")funcmain()......
  • Go 语言数组和切片的区别
    原文链接:Go语言数组和切片的区别在Go语言中,数组和切片看起来很像,但其实它们又有很多的不同之处,这篇文章就来说说它们到底有哪些不同。另外,这个问题在面试中也经常会被问到,属于入门级题目,看过文章之后,相信你会有一个很好的答案。数组数组是同一种数据类型元素的集合,数组在......
  • django直线支付宝支付接口
    1.创建Django项目首先,在命令行中使用以下命令创建一个新的Django项目:django-adminstartprojectproject_name2.安装PythonSDK然后,下载并安装支付宝PythonSDK。可以使用pip命令进行安装:pipinstallalipay-sdk-python3.配置支付宝参数配置支付宝参数在settings.py文件......
  • Go语言入门2(流程控制,string)
    流程控制选择结构(分支语句)​ 因为switch只能匹配固定值,推荐使用if-else做条件筛选if-else判断packagemainimport"fmt"funcmain(){ vartmpAint fmt.Scanln(&tmpA) iftmpA>=90{ fmt.Println("tmpA>=90") }elseiftmpA<90&&tmpA>......
  • FTP状态码详解
    目录详细分解1xx–肯定的初步答复110120125150原因2xx–肯定的完成答复202211212213214215220221225226原因227230原因2502573xx–肯定的中间答复331原因3323504xx–瞬态否定的完成答复421425426原因4504514525xx–永久性否定的完成答复500501502503504530原因532550原......
  • Python异常 ValueError的问题详解
    导读这篇文章主要介绍了Python异常ValueError的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教Python异常ValueErrorValueError:invalidliteralforint()withbase10:'*'试图将一个与数字无关的类型转化为整数,会抛出该异常。......
  • Django笔记十三之select_for_update等选择和更新等相关操作
    本篇笔记将介绍update和create的一些其他用法,目录如下:get_or_createupdate_or_createselect_for_updatebulk_createbulk_update1、get_or_create前面我们介绍过get()和create()的用法,那么get_or_create()的意思很简单,就是获取或者创建,如果存在就返回,不存在就......
  • MongoDB 架构
    优质博文:IT-BLOG-CN一、存储数据格式MongoDB作为主流的NoSQL数据库之一,使用面向文档的数据存储方式,将数据以JSON和BSON的方式存储在磁盘中。BSONBinaryJSON是一种基于JSON的二级制序列化格式,用于MongoDB存储文档并进行远程过程调用,作为网络数据交互的一种存储形式,类似于Prot......
  • golang蒙特卡洛树算法实现五子棋AI
    已经实现蒙特卡洛树算法的通用逻辑,只需要对应结构体实现相关接口就可以直接使用该算法。优化算法主要优化GetActions生成下一步动作,要尽可能少,去掉无意义的动作。以及优化ActionPolicy从众多动作挑选比较优秀的动作。对应五子棋就是执行该动作后当前局面评分最高。packagemain......