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()
}
相关推荐
__雨夜星辰__5 小时前
Linux 学习笔记__Day2
linux·服务器·笔记·学习·centos 7
学问小小谢5 小时前
第26节课:内容安全策略(CSP)—构建安全网页的防御盾
运维·服务器·前端·网络·学习·安全
charlie1145141919 小时前
从0开始使用面对对象C语言搭建一个基于OLED的图形显示框架(协议层封装)
c语言·驱动开发·单片机·学习·教程·oled
马船长10 小时前
[BSidesCF 2020]Had a bad day1
学习
黄交大彭于晏10 小时前
三端回链增加截图功能
学习
linwq810 小时前
设计模式学习(二)
java·学习·设计模式
Fhd-学习笔记11 小时前
《大语言模型》综述学习笔记
笔记·学习·语言模型
加油,旭杏12 小时前
【go语言】接口
开发语言·后端·golang
简知圈12 小时前
【04-自己画P封装,并添加已有3D封装】
笔记·stm32·单片机·学习·pcb工艺