Golang学习笔记_12——结构体

news2024/12/18 18:11:22

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


文章目录

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


结构体

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2261725.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

centos使用mkisofs构建无人值守镜像(附官方学习文档)

安装mkisofs yum install -y mkisofs 挂载镜像并确认 并拷贝文件(/mnt 为我们的工作目录) 1.3 准备自动应答文件(保存为 ins.ks) 修改系统引导 实际上就是添加inst.ks 这个引导参数 传递应答文件 传统模式引导

jenkins pipeline打包流程

Jenkins Pipeline 是 Jenkins 提供的一种用于持续集成和持续交付(CI/CD)的脚本化流程工具。它允许你通过编写一个 Jenkinsfile 文件来定义整个构建、测试和部署的流程。本文介绍打包springcloud项目,react项目为docker镜像 文章目录 1.项目结…

【容器】k8s学习笔记原理详解(十万字超详细)

Pod详解 Pod介绍 Pod结构 每个Pod中都可以包含一个或者多个容器,这些容器可以分为两类: 用户程序所在的容器,数量可多可少Pause容器,这是每个Pod都会有的一个根容器,它的作用有两个: 可以以它为依据&am…

用.Net Core框架创建一个Web API接口服务器

我们选择一个Web Api类型的项目创建一个解决方案为解决方案取一个名称我们这里选择的是。Net 8.0框架 注意,需要勾选的项。 我们找到appsetting.json配置文件 appsettings.json配置文件内容如下 {"Logging": {"LogLevel": {"Default&quo…

多音轨视频使用FFmpeg删除不要音轨方法

近期给孩子找宫崎骏动画,但是有很多是多音轨视频但是默认的都是日语,电视上看没办法所以只能下载后删除音轨文件只保留中文。 方法分两步,先安装FFmpeg在转文件即可。 第一步FFmpeg安装 FFmpeg是一个开源项目,包含了处理视频的…

Ubuntu22.04切换gcc版本教程

在编译安装程序的时候,由于gcc版本过高,导致编译无法通过,需要降低gcc版本。 一、安装gcc版本 根据自己的需求安装gcc版本。 sudo apt update sudo apt install gcc-10 g++-10二、切换gcc版本 sudo update-alternatives --install /usr/bin/gcc gcc

[SZ901] JTAG合并功能(类似FPGA菊花链)

SZ901 JTAG支持将JTAG端口组合,最多将四个JTAG变成一个 设置如下 Vivado 识别结果如下 两块板子,变成一组,,可以同时抓取信号,调试! SZ901 已上架淘宝,搜素“SZ901”哦

【收藏】Cesium 限制相机倾斜角(pitch)滑动范围

1.效果 2.思路 在项目开发的时候,有一个需求是限制相机倾斜角,也就是鼠标中键调整视图俯角时,不能过大,一般 pitch 角度范围在 0 至 -90之间,-90刚好为正俯视。 在网上查阅了很多资料,发现并没有一个合适的…

如何解决samba服务器共享文件夹不能粘贴文件

sudo vim /etc/samba/smb.conf在samba的配置文件中增加一个选项 writable yes重启Samba服务以使更改生效: sudo service smbd restart

数据结构简介:结构创造效率

一、数据结构的本质 数据结构是组织大量数据的方法(data structures:methods of organizing large amounts of data )。 根据这个定义,一条数据,就不能构成数据结构。 因为结构是数据与数据之间的关联,…

【经验分享】容器云运维的知识点

最近忙于备考没关注,有次点进某小黄鱼发现首页出现了我的笔记还被人收费了 虽然我也卖了一些资源,但我以交流、交换为主,笔记都是免费给别人看的 由于当时刚刚接触写的并不成熟,为了避免更多人花没必要的钱,所以决定公…

Linux系列之如何更换Centos yum源?

环境 Centos7Xshell7 问题描述 最近安装了一个虚拟机,准备用来学习,不过使用yum命令安装一些软件,不过使用这个命令时候,提示 Cannot find a valid baseurl for repo: base/7/x86_64,Could not retrieve mirrorlis…

RabbitMQ如何构建集群?

大家好,我是锋哥。今天分享关于【RabbitMQ如何构建集群?】面试题。希望对大家有帮助; RabbitMQ如何构建集群? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在RabbitMQ中,集群(Cluster&#x…

负载均衡oj项目:介绍

目录 项目介绍 项目演示 项目介绍 负载均衡oj是一个基于bs模式的项目。 用户使用浏览器向oj模块提交代码,oj模块会在所有在线的后端主机中选择一个负载情况最低的主机,将用户的代码提交给该主机,该主机进行编译运行,将结果返回…

第8章 搬移特性

8.1 搬移函数 模块化是优秀软件设计的核心所在,好的模块化能够让我在修改程序时只需理解程序的一小部分。为了设计出高度模块化的程序,我得保证互相关联的软件要素都能集中到一块,并确保块与块之间的联系易于查找、直观易懂。同时&#xff0c…

rust的axux框架开启负载均衡和重启自身的方法-会议签到的调优

开启负载均衡和重启自身 更换axum后台的意外解决的尝试在caddy反代,使用负载均衡,加多一个节点axum主程序 ip映射信息做全局共享axum重启自身刷新全局共享配置 前期刚实现了rust的后台关键业务.结果出现了两类大问题停止服务.在正用着的时候,出现很多意外,真是刺激… 更换axum…

Spring源码分析之BeanFactory接口的解析

前言: 在我们的前两篇文章当中我们看完之后其实我们都会发现当我们进行相关的重要的行为的时候如我们看到的GetBean或者在Register方法的时候会出现BeanFactroy进行调用那么这个时候我们就会产生一个疑惑这个到底是什么为什么这么重要,在我没有说的时候我们从字面上进行一个简单…

【zlm】 webrtc源码讲解三(总结)

目录 setsdp onwrite ​编辑 play 参考 setsdp onwrite play 参考 【zlm】 webrtc源码讲解_zlm webrtc-CSDN博客 【zlm】 webrtc源码讲解(二)_webrtc 源码-CSDN博客

电子应用设计方案-56:智能书柜系统方案设计

智能书柜系统方案设计 一、引言 随着数字化时代的发展和人们对知识获取的需求增加,智能书柜作为一种创新的图书管理和存储解决方案,能够提供更高效、便捷和个性化的服务。本方案旨在设计一款功能齐全、智能化程度高的智能书柜系统。 二、系统概述 1. 系…

Spring Boot 性能提升的核武器,速度提升 500%!

虚拟线程是 Java 21 引入的一个新特性,用于简化并发编程。它与传统的操作系统线程相比,具有显著的优势: 轻量级:虚拟线程由 JVM 管理,而非操作系统,因此它们的内存占用和创建成本远低于传统线程。理论上&am…