Golang学习笔记_12——结构体

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


文章目录

    • 结构体
      • [1. 定义](#1. 定义)
      • [2. 访问 && 修改](#2. 访问 && 修改)
      • [3. 零值初始化 & 使用指针初始化](#3. 零值初始化 & 使用指针初始化)
      • [4. 匿名字段和嵌套结构体](#4. 匿名字段和嵌套结构体)
      • [5. 结构体方法和接收者](#5. 结构体方法和接收者)
    • 源码

结构体

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

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

1. 定义

go 复制代码
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(字符串类型)。通过点操作符(.)可以访问和修改这些字段的值。

go 复制代码
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)
}

测试方法

go 复制代码
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. 零值初始化 & 使用指针初始化

go 复制代码
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. 匿名字段和嵌套结构体

go 复制代码
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) // 直接访问匿名字段中的字段
}

测试方法

go 复制代码
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语言允许为结构体定义方法。方法是与特定类型(通常是结构体类型)绑定的函数。定义方法时,需要在函数签名前加上该类型的接收者。接收者可以是值接收者(方法接收一个类型的值)或指针接收者(方法接收一个类型的指针)。

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())
}

测试方法

go 复制代码
func TestStructDemo5(t *testing.T) {
	StructDemo5()
}

输出结果

复制代码
=== RUN   TestStructDemo5
Area: 12
Scaled Area: 48
--- PASS: TestStructDemo5 (0.00s)
PASS

源码

go 复制代码
// 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)

}
go 复制代码
// struct_demo_test.go 文件
package struct_demo

import "testing"

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

func TestStructDemo2(t *testing.T) {
	StructDemo2()
}
go 复制代码
// 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) // 直接访问匿名字段中的字段
}
go 复制代码
// struct_demo2_test.go 文件
package struct_demo

import "testing"

func Test_structDemo4(t *testing.T) {
	structDemo4()
}
go 复制代码
// 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())
}
go 复制代码
// struct_demo3_test.go
package struct_demo

import "testing"

func TestStructDemo5(t *testing.T) {
	StructDemo5()
}
相关推荐
梅子酱~18 分钟前
Vue 学习随笔系列二十二 —— 表格高度自适应
javascript·vue.js·学习
s_little_monster22 分钟前
【Linux】进程信号的捕捉处理
linux·运维·服务器·经验分享·笔记·学习·学习方法
浮尘笔记23 分钟前
go-zero使用elasticsearch踩坑记:时间存储和展示问题
大数据·elasticsearch·golang·go
JackmoodCC1 小时前
Java学习总结-递归-递归寻找文件绝对路径
学习
RedMery1 小时前
论文阅读笔记:Denoising Diffusion Implicit Models (4)
论文阅读·笔记
守护者1701 小时前
JAVA学习-练习试用Java实现“实现一个Hadoop程序,使用Hive进行复杂查询和数据筛查”
java·学习
go_bai1 小时前
Linux环境基础开发工具——(2)vim
linux·开发语言·经验分享·笔记·vim·学习方法
吴梓穆2 小时前
UE5学习笔记 FPS游戏制作35 使用.csv配置文件
笔记·学习·ue5
虾球xz2 小时前
游戏引擎学习第199天
学习·游戏引擎
100分题库小程序2 小时前
2025年机动车授权签字人考试判断题分享
经验分享·笔记