Go语言13-复合类型-结构体

本文深入探讨了Go语言中结构体的使用,包括结构体的概述、初始化方式、成员调用、比较与赋值,以及作为函数参数的两种传递方式。通过实例演示了普通变量与指针变量的初始化及调用过程,解析了结构体成员的赋值规则,并展示了结构体变量的比较和赋值操作。最后,文章讲解了结构体变量作为函数参数时的值传递与引用传递的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1结构体概述

Go语言的结构体是一种聚合的数据类型,由一系列具体相同或不同类型的数据构成的数据集合。

2.结构体初始化

2.1普通变量初始化

创建方式操作说明
顺序初始化按结构体变量顺序依次赋值。用顺序初始化的方式初始化,每个成员都必须初始化
部分成员初始化仅对结构体类型的部分成员进行赋值没被初始化的成员,会自动取零值。
package main

import "fmt"

type classMessage struct {
	className    string
	number       int
	maleNumber   int
	femaleNumber int
}

func main() {
	/*1.顺序初始化必须每个成员都初始化*/
	var c1 classMessage = classMessage{"高一(一)班", 50, 25, 25}
	fmt.Println("c1 =", c1)
	c2 := classMessage{"高二(三)班", 51, 25, 26}
	fmt.Println("c2 =", c2)
	/*顺序初始化,还有成员没有被赋值,报错*/
	//c3 := classMessage{"高二(一)班", 51, 20}
	/*2.指定初始化某个成员,没有初始化的成员,自动取得零值*/
	c4 := classMessage{className: "高一(一)班", number: 50, maleNumber: 50}
	fmt.Println("c4 =", c4)
	/*指定初始化某个成员时,可以不按照顺序赋值,单打印结果会按照结构类型变量顺序打印*/
	c5 := classMessage{number: 50, className: "高一(一)班", maleNumber: 50}
	fmt.Println("c5 =", c5)
}

2.2指针变量初始化

package main

import "fmt"

type classMessage struct {
	className    string
	number       int
	maleNumber   int
	femaleNumber int
}

func main() {
	/*1.顺序初始化必须每个成员都初始化*/
	var c1 *classMessage = &classMessage{"高一(一)班", 50, 25, 25}
	fmt.Println("8c1 =", *c1)
	c2 := &classMessage{"高二(三)班", 51, 25, 26}
	fmt.Println("*c2 =", *c2)
	/*顺序初始化,还有成员没有被赋值,报错*/
	//c3 := &classMessage{"高二(一)班", 51, 20}
	/*2.指定初始化某个成员,没有初始化的成员,自动取得零值*/
	c4 := &classMessage{className: "高一(一)班", number: 50, maleNumber: 50}
	fmt.Println("*c4 =", *c4)
	/*指定初始化某个成员时,可以不按照顺序赋值,单打印结果会按照结构类型变量顺序打印*/
	c5 := &classMessage{number: 50, className: "高一(一)班", maleNumber: 50}
	fmt.Println("*c5 =", *c5)
}

3.匿名字段

创建的结构体里的字段只有类型,没有字段名,这样的字段被成为匿名字段。

虽然匿名字段没有名称,但本质上是以类型名为名称的字段。

package main

import "fmt"

type classMessage struct {
	string
	int
}

func main() {
	c1 := classMessage{"高一(一)班", 50}
	fmt.Println("c1 =", c1)
	var c2 classMessage
	c2.string = "高二(二)班"
	c2.int = 30
	fmt.Println("c2 =", c2)
}

4结构体成员的调用

4.1普通变量的调用

调用结构体变量的成员, 需要用点操作符".",即:结构体变量名.成员名。

package main

import "fmt"

type classMessage struct {
	className    string
	number       int
	maleNumber   int
	femaleNumber int
}

func main() {
	/*1.打印结构体成员变量*/
	c1 := classMessage{"高一(一)班", 50, 25, 25}
	fmt.Printf("className=%s,number=%d,maleNumber=%d,femaleNumber=%d\n", c1.className, c1.number, c1.maleNumber, c1.femaleNumber)
	/*2.对结构体成员变量赋值或修改*/
	var c2 classMessage
	c2.className = "高三(一)班"
	c2.number = 45
	c2.maleNumber = 45
	fmt.Printf("c2=%v\n", c2)
	fmt.Printf("c2=%+v\n", c2)
	c2.className = "高三(二)"
	fmt.Printf("c2=%+v\n", c2)
}

4.2指针变量成员的调用

对指针变量的成员调用方式有两种:

调用方式说明
结构体变量名.成员名调用的指针变量成员,可以赋值,也可以修改其值
(*结构体变量名).成员名
package main

import "fmt"

type classMessage struct {
	className    string
	number       int
	maleNumber   int
	femaleNumber int
}

func main() {
	/*1.打印结构体成员变量*/
	c1 := &classMessage{"高一(一)班", 50, 25, 25}
	fmt.Printf("className=%s,number=%d,maleNumber=%d,femaleNumber=%d\n",
		(*c1).className, (*c1).number, (*c1).maleNumber, (*c1).femaleNumber)
	/*2.对结构体成员变量赋值或修改*/
	c2 := new(classMessage)
	c2.className = "高三(一)班"
	(*c2).number = 45
	c2.maleNumber = 45
	fmt.Printf("c2=%v\n", *c2)
	fmt.Printf("c2=%+v\n", *c2)
	c2.className = "高三(二)"
	fmt.Printf("c2=%+v\n", *c2)
}

5.结构体变量的比较和赋值

5.1结构体变量的比较

a.结构体变量可以使用"=="或"!="运算符比较,但不支持">"或"<"。

b.当两个结构体变量的类型相同,想要的成员值相等,这两个结构体变量相等。

package main

import "fmt"

type classMessage struct {
	className    string
	number       int
	maleNumber   int
	femaleNumber int
}

func main() {
	c1 := classMessage{"高二(一)班", 50, 25, 25}
	c2 := classMessage{"高二(一)班", 50, 25, 25}
	c3 := classMessage{"高二(一)班", 70, 25, 25}
	fmt.Println(c1 == c2) //类型相同成员值相等
	fmt.Println(c1 != c3) //类型相同,成员值不相等
}

5.2结构体变量的赋值

 两个结构体变量类型相同,这两个变量可以互相赋值。

package main

import "fmt"

type classMessage struct {
	className    string
	number       int
	maleNumber   int
	femaleNumber int
}

func main() {
	c1 := classMessage{"高二(一)班", 50, 25, 25}
	c2 := classMessage{"高二(一)班", 70, 25, 25}
	c2 = c1
	var c3 classMessage
	c3 = c1
	fmt.Println("c1 = ", c1)
	fmt.Println("c2 = ", c2)
	fmt.Println("c3 = ", c3)
}

6.结构体变量作为函数参数

6.1值传递

不会影响实参的值。

package main

import "fmt"

type classMessage struct {
	className    string
	number       int
	maleNumber   int
	femaleNumber int
}

func test(c classMessage) {
	c.number = 100
	fmt.Println("test:c = ", c)
}

func main() {
	c1 := classMessage{"高二(一)班", 50, 25, 25}
	test(c1)
	fmt.Println("main:c1 = ", c1)
}

6.2引用传递

实参的值也发生改变

package main

import "fmt"

type classMessage struct {
	className    string
	number       int
	maleNumber   int
	femaleNumber int
}

func test(c classMessage) {
	c.number = 100
	fmt.Println("test:c = ", c)
}

func main() {
	c1 := classMessage{"高二(一)班", 50, 25, 25}
	test(c1)
	fmt.Println("main:c1 = ", c1)
}

 

### 关于 UniApp 框架推荐资源与教程 #### 1. **Uniapp 官方文档** 官方文档是最权威的学习资料之一,涵盖了从基础概念到高级特性的全方位讲解。对于初学者来说,这是了解 UniApp 架构技术细节的最佳起点[^3]。 #### 2. **《Uniapp 从入门到精通:案例分析与最佳实践》** 该文章提供了系统的知识体系,帮助开发者掌握 Uniapp 的基础知识、实际应用以及开发过程中的最佳实践方法。它不仅适合新手快速上手,也能够为有经验的开发者提供深入的技术指导[^1]。 #### 3. **ThorUI-uniapp 开源项目教程** 这是一个专注于 UI 组件库设计实现的教学材料,基于 ThorUI 提供了一系列实用的功能模块。通过学习此开源项目的具体实现方式,可以更好地理解如何高效构建美观且一致的应用界面[^2]。 #### 4. **跨平台开发利器:UniApp 全面解析与实践指南** 这篇文章按照章节形式详细阐述了 UniApp 的各个方面,包括但不限于其工作原理、技术栈介绍、开发环境配置等内容,并附带丰富的实例演示来辅助说明理论知识点。 以下是几个重要的主题摘选: - **核心特性解析**:解释了跨端运行机制、底层架构组成及其主要功能特点。 - **开发实践指南**:给出了具体的页面编写样例代码,展示了不同设备间 API 调用的方法论。 - **性能优化建议**:针对启动时间缩短、图形绘制效率提升等方面提出了可行策略。 ```javascript // 示例代码片段展示条件编译语法 export default { methods: { showPlatform() { console.log(process.env.UNI_PLATFORM); // 输出当前平台名称 #ifdef APP-PLUS console.log('Running on App'); #endif #ifdef H5 console.log('Running on Web'); #endif } } } ``` #### 5. **其他补充资源** 除了上述提到的内容外,还有许多在线课程视频可供选择,比如 Bilibili 上的一些免费系列讲座;另外 GitHub GitCode 平台上也有不少优质的社区贡献作品值得借鉴研究。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值