首页 > 其他分享 >Golang学习笔记_12——结构体

Golang学习笔记_12——结构体

时间:2024-12-17 22:02:32浏览次数:10  
标签:Status 12 Name Age 笔记 Golang func fmt struct

Golang学习笔记_09——if条件判断
Golang学习笔记_10——Switch
Golang学习笔记_11——指针


文章目录


结构体

Go语言中的结构体(struct)是一种复合数据类型,它允许你将多个不同类型的变量组合在一起。结构体在Go语言中非常常用,因为它提供了一种组织数据的强大方式,使代码更加清晰和模块化。

一个 结构体(struct)就是一组 字段(field)。

1. 定义

type Person struct {
	Name   string
	Age    int
	Status string
}
func StructDemo() {
	p1 := Person{
		Name:   "tom",
		Age:    20,
		Status: "ok",
	}
  p2 := Person{"Alice", 30, "Error"}
	fmt.Println(p1, p2) // 不用会报异常,简单打印下
}

2. 访问 && 修改

我们定义了一个名为Person的结构体,它有三个字段:Name(字符串类型)、Age(整型)和City(字符串类型)。通过点操作符(.)可以访问和修改这些字段的值。

func StructDemo2() {
	p := Person{
		Name:   "tom",
		Age:    20,
		Status: "ok",
	}
	fmt.Printf("Name: %s, Age: %d, Status: %s\n", p.Name, p.Age, p.Status)
	p.Status = "error"
	fmt.Printf("after fixed, Name: %s, Age: %d, Status: %s\n", p.Name, p.Age, p.Status)
}

测试方法

func TestStructDemo2(t *testing.T) {
	StructDemo2()
}

输出结果

=== RUN   TestStructDemo2
Name: tom, Age: 20, Status: ok
after fixed, Name: tom, Age: 20, Status: error
--- PASS: TestStructDemo2 (0.00s)
PASS

3. 零值初始化 & 使用指针初始化

func StructDemo3() {
	// 零值初始化
	var p3 Person

	var p4 = &Person{"Alice", 30, "ok"}

	fmt.Printf("Name: %s, Age: %d, Status: %s\n", p3.Name, p3.Age, p3.Status)
	fmt.Printf("Name: %s, Age: %d, Status: %s\n", p4.Name, p4.Age, p4.Status)

}

4. 匿名字段和嵌套结构体

type Address struct {
	Street string
	City   string
}

type Employee struct {
	Name    string
	Age     int
	Address // 匿名字段
}

func structDemo4() {
	e := Employee{
		Name: "Bob",
		Age:  40,
		Address: Address{
			Street: "123 Main St",
			City:   "San Francisco",
		},
	}

	// 访问嵌套结构体的字段
	fmt.Printf("Employee Name: %s\n", e.Name)
	fmt.Printf("Street: %s\n", e.Street) // 直接访问匿名字段中的字段
}

测试方法

func Test_structDemo4(t *testing.T) {
	structDemo4()
}

输出结果

=== RUN   Test_structDemo4
Employee Name: Bob
Street: 123 Main St
--- PASS: Test_structDemo4 (0.00s)
PASS

5. 结构体方法和接收者

Go语言允许为结构体定义方法。方法是与特定类型(通常是结构体类型)绑定的函数。定义方法时,需要在函数签名前加上该类型的接收者。接收者可以是值接收者(方法接收一个类型的值)或指针接收者(方法接收一个类型的指针)。

type Rectangle struct {
	Width, Height float64
}

// 值接收者方法
func (r Rectangle) Area() float64 {
	return r.Width * r.Height
}

// 指针接收者方法(修改结构体的值)
func (r *Rectangle) Scale(factor float64) {
	r.Width *= factor
	r.Height *= factor
}

func StructDemo5() {
	r := Rectangle{Width: 3, Height: 4}
	fmt.Println("Area:", r.Area())

	r.Scale(2)
	fmt.Println("Scaled Area:", r.Area())
}

测试方法

func TestStructDemo5(t *testing.T) {
	StructDemo5()
}

输出结果

=== RUN   TestStructDemo5
Area: 12
Scaled Area: 48
--- PASS: TestStructDemo5 (0.00s)
PASS

源码

// struct_demo.go 文件
package struct_demo

import "fmt"

type Person struct {
	Name   string
	Age    int
	Status string
}

func StructDemo() {
	p1 := Person{
		Name:   "tom",
		Age:    20,
		Status: "ok",
	}
	p2 := Person{"Alice", 30, "ok"}
	fmt.Println(p1, p2)
}

func StructDemo2() {
	p := Person{
		Name:   "tom",
		Age:    20,
		Status: "ok",
	}
	fmt.Printf("Name: %s, Age: %d, Status: %s\n", p.Name, p.Age, p.Status)
	p.Status = "error"
	fmt.Printf("after fixed, Name: %s, Age: %d, Status: %s\n", p.Name, p.Age, p.Status)
}

func StructDemo3() {
	// 零值初始化
	var p3 Person

	var p4 = &Person{"Alice", 30, "ok"}

	fmt.Printf("Name: %s, Age: %d, Status: %s\n", p3.Name, p3.Age, p3.Status)
	fmt.Printf("Name: %s, Age: %d, Status: %s\n", p4.Name, p4.Age, p4.Status)

}
// struct_demo_test.go 文件
package struct_demo

import "testing"

func TestStructDemo(t *testing.T) {
	StructDemo()
}

func TestStructDemo2(t *testing.T) {
	StructDemo2()
}
// struct_demo2.go 文件
package struct_demo

import "fmt"

type Address struct {
	Street string
	City   string
}

type Employee struct {
	Name    string
	Age     int
	Address // 匿名字段
}

func structDemo4() {
	e := Employee{
		Name: "Bob",
		Age:  40,
		Address: Address{
			Street: "123 Main St",
			City:   "San Francisco",
		},
	}

	// 访问嵌套结构体的字段
	fmt.Printf("Employee Name: %s\n", e.Name)
	fmt.Printf("Street: %s\n", e.Street) // 直接访问匿名字段中的字段
}

// struct_demo2_test.go 文件
package struct_demo

import "testing"

func Test_structDemo4(t *testing.T) {
	structDemo4()
}
// struct_demo3.go 文件
package struct_demo

import "fmt"

type Rectangle struct {
	Width, Height float64
}

// 值接收者方法
func (r Rectangle) Area() float64 {
	return r.Width * r.Height
}

// 指针接收者方法(修改结构体的值)
func (r *Rectangle) Scale(factor float64) {
	r.Width *= factor
	r.Height *= factor
}

func StructDemo5() {
	r := Rectangle{Width: 3, Height: 4}
	fmt.Println("Area:", r.Area())

	r.Scale(2)
	fmt.Println("Scaled Area:", r.Area())
}
// struct_demo3_test.go
package struct_demo

import "testing"

func TestStructDemo5(t *testing.T) {
	StructDemo5()
}

标签:Status,12,Name,Age,笔记,Golang,func,fmt,struct
From: https://blog.csdn.net/LuckyLay/article/details/144545503

相关文章

  • 12.17 CW 模拟赛 T4. 记忆碎片
    思路转化题意,问你在一个带权无向完全图中,如何填上\(w_i\in\left[1,\frac{n\cdot(n-1)}{2}\right]\),使得其最小生成树上的边权为给定的\(n-1\)个数考虑模仿\(\rm{kruskal}\)的方式,令\(f_S\)表示当前点集为\(S\),每次转移,如果当前边权需要在最小生......
  • 20241217每日一题洛谷P1803
    普及-每日一题洛谷P1683题目描述现在各大oj上有\(n\)个比赛,每个比赛的开始、结束的时间点是知道的。yyy认为,参加越多的比赛,noip就能考的越好(假的)。所以,他想知道他最多能参加几个比赛。由于yyy是蒟蒻,如果要参加一个比赛必须善始善终,而且不能同时参加\(2\)个及以上的......
  • 代理 mitmproxy Python启动时,配置 block_global 参数,使用笔记(三)
    代理mitmproxyPython启动时,配置block_global参数,使用笔记(三)为什么要加block_global=false?,若不加,则只能本地拦截,而移动设备,或非本机请求时则无法被拦截将报错如下:Clientconnectionfrom192.167.6.166killedbyblock_globaloption注意:使用Python的非命令行启动,之前的......
  • 2024/12/27 总结
    2024/12/27总结模拟赛T1取石子游戏A和B两人玩取石子游戏。一共有n堆石子,第堆有α个石子。A和B轮流取石子,A先取,每次选择一堆然后取任意数量的石子(不能不取)。但是B必须取两次,即取石子的顺序是,ABBABB...。当一方无法取石子,则输掉游戏。假设A和B均绝顶聪明,请判断A是否可以获,胜......
  • 12 月做题记录
    12.1-12.15P11364[NOIP2024]树上查询简单题,不知道场上在干嘛,拿出\([l,r]\)只有\(O(n)\)个区间的结论,然后找出来直接扫描线就好了。实际上更好的做法是\[LCA(l,r)=\text{mindep}_{i=l}^{r-1}lca(i,i+1)\]找出来建笛卡尔树,然后扫描线应该会更好写。这个结论怎么能忘了的......
  • Crashlytics在Web应用中的集成教程_2024-07-23_16-12-19.Tex
    Crashlytics在Web应用中的集成教程Crashlytics简介Crashlytics的功能与优势Crashlytics是Firebase提供的一项服务,专门用于监控和分析应用程序的崩溃情况。它能够自动收集、整理并报告应用在运行过程中遇到的错误和异常,帮助开发者快速定位问题,提高应用的稳定性和用户体验......
  • .NET周刊【12月第2期 2024-12-08】
    国内文章终于解决了.net在线客服系统总是被360误报的问题(对软件进行数字签名)https://www.cnblogs.com/sheng_chao/p/18581139升讯威在线客服与营销系统由.netcore和WPF开发,旨在开放、开源、共享。开发者为解决360与其他国产管家的误报问题,采用数字签名以提升软件安全性。使用S......
  • Android 13 相较于 Android 12 的新特性
    标签:Android13;Android13新特性;Android13相较于Android12的新特性及开发者注意事项一、Android13相较于Android12的新特性Android13(代号Tiramisu)在用户体验、安全性、隐私保护以及开发者工具等多个方面进行了改进和增强。以下是一些主要的新特......
  • 使用 Golang 和模板引擎创建网站
    使用Golang和模板引擎创建网站原创 源自开发者 源自开发者 2024年12月17日12:57 广东在过去,人们通常使用HTML、CSS和JavaScript来构建网站,同时在后端使用PHP。如今,已经有许多JavaScript框架可供选择,比如React.js、Next.js、Vue.js、Nuxt、Svelte、SvelteKit......
  • 阅读笔记
    技术深度与广度在《程序员修炼之道》中,作者强调了程序员在技术深度和广度上的均衡发展。技术深度意味着对某一领域技术的深入理解和熟练掌握;而技术广度则要求程序员了解多个技术领域,以便在解决问题时能够灵活应用。深入掌握核心技能:书中提到,程序员应该深入掌握至少一种编程语言......