【Go】结构体的基本使用

devtools/2025/3/28 13:30:09/

go语言不是面向对象的语言
但是结构体类似于面向对象

结构体的定义

package mainimport "fmt"type Student struct {id     intname   stringage    intschool string
}func main() {s := Student{1, "luobozi", 18, "znl"}fmt.Println(s)
}

结构体实例化(指针类型)

package mainimport "fmt"type Student struct {id   intname string
}func main() {// 使用 & 进行实例化stu := &Student{id: 1, name: "luobozi"}fmt.Println((*stu).name) // 通过指针访问字段fmt.Println(stu.name)    // 语法糖,自动解引用
}

结构体实例化(值类型)

package mainimport "fmt"type Student struct {id   intname string
}func main() {// 值类型实例化 不加 & 符号stu := Student{id: 1, name: "luobozi"}fmt.Println(stu)
}

使用 new 进行实例化

new(T) 分配 T 类型的零值 并返回 指向该零值的指针 *T
适用于 值类型(如 struct、array 等)。
只分配内存,不进行额外初始化。

package mainimport "fmt"type Student struct {name stringage  int
}func main() {stu := new(Student) // 分配 Student 类型的零值fmt.Printf("%+v\n", stu) // 输出:&{name: age:0}stu.name = "Alice"stu.age = 20fmt.Printf("%+v\n", stu) // 输出:&{name:Alice age:20}
}

结构体的值传递与指针传递

package mainimport "fmt"type Student struct {id   intname stringage  int
}func test(s Student) {fmt.Println("传递值")s.age = 100
}func test1(s *Student) {fmt.Println("传递指针")s.age = 200
}func main() {stu := Student{id: 1, name: "luobozi", age: 18}test(stu)fmt.Println("调用 test 后:", stu)test1(&stu)fmt.Println("调用 test1 后:", stu)
}

结构体方法(值接收者和指针接收者)

package mainimport "fmt"type Student struct {name string
}func (s Student) ChangeName(name string) {fmt.Println("值接收者:", name)s.name = name
}func (s *Student) ChangeName2(name string) {fmt.Println("指针接收者:", name)s.name = name
}func main() {stu := Student{name: "luobozi"}stu.ChangeName("Alice") // 不会修改原数据fmt.Println(stu)stu.ChangeName2("Bob") // 会修改原数据fmt.Println(stu)
}

匿名结构体

package mainimport "fmt"func main() {anon := struct {id   intaddr string}{id: 10, addr: "长沙"}fmt.Println(anon)
}

匿名字段

package mainimport "fmt"type Person struct {stringint
}func main() {p := Person{"匿名", 20}fmt.Println(p)
}

空结构体

package mainimport "fmt"type Empty struct{}func (e *Empty) Call() {fmt.Println("调用空结构体方法")
}func main() {var e Emptye.Call()
}

空结构体用于集合

package mainimport "fmt"type Set map[string]struct{} //使用map为基本,创建set类型func (s Set) Add(k string) {s[k] = struct{}{} //空结构体是不占用内存的,所以就用这种方式实现集合,本质上也是一个map
}func main() {s := make(Set)s.Add("Go")s.Add("Python")fmt.Println(s)
}

结构体内存对齐

package mainimport ("fmt""unsafe"
)type A struct {a int8b int64c int8
}type B struct {a int8c int8b int64
}func main() {fmt.Println("结构体 A 大小:", unsafe.Sizeof(A{})) //结构体 A 大小: 24fmt.Println("结构体 B 大小:", unsafe.Sizeof(B{})) //结构体 B 大小: 16
}

http://www.ppmy.cn/devtools/171151.html

相关文章

享元模式(Flyweight Pattern)

享元模式(Flyweight Pattern)是一种结构型设计模式,它通过共享技术来高效地支持大量细粒度对象的复用。 一、基础 1 意图 运用共享技术有效地支持大量细粒度的对象 减少内存中对象的数量,节省系统资源 2 适用场景 一个应用程序使用了大量对象 由于对象数量庞大造成很大的…

Docker学习笔记(十一)宿主机无法链接宿主机问题处理

故障排查优先级排序 服务状态 → 2. 端口监听 → 3. 防火墙 → 4. 权限配置 → 5. 网络路由 (按此顺序可覆盖95%的常见问题‌15) mysql镜像启动命令: docker run -p 3306:3306 --restartalways --name mysqlv8 -e MYSQL_ROOT_PASSWORDCd…

CSS 中@media查询的工作原理,如何利用它实现不同设备的样式适配

大白话 CSS 中media查询的工作原理,如何利用它实现不同设备的样式适配 什么是 media 查询 在网页设计里,不同的设备(像手机、平板、电脑)屏幕尺寸各异。要是只使用一套固定的样式,网页在某些设备上可能就显示得乱七八…

springboot集成onlyoffice(部署+开发)

前言 最近有个项目需求是实现前端页面可以对word文档进行编辑,并且可以进行保存,于是一顿搜索,找到开源第三方onlyoffice,实际上onlyOffice有很多功能,例如文档转化、多人协同编辑文档、文档打印等,我们只…

目标检测20年(二)

没有看过(一)的可以看看笔者这篇文章: 目标检测20年(一)-CSDN博客 目录 3.2 目标检测数据集和指标 3.2.1 数据集 3.2.1.1 Pascal VOC 3.2.1.2 ILSVRC 3.2.1.3 MS-COCO 3.2.1..4 Open Images 3.2.2 指标 3.3 目…

手动配置树莓派wifi联网连接热点手机热点

手动配置树莓派wifi联网连接热点 修改wifi配置文件: 运行命令: sudo nano /etc/wpa_supplicant/wpa_supplicant.conf 在文件中添加无线网配置信息: ctrl_interfaceDIR/var/run/wpa_supplicant GROUPnetdev update_config1 countryCN network{ ssid”你的无线网名字” psk”…

WPF Binding方式详解

在 WPF 中,Binding 是数据绑定的核心机制,用于将 UI 元素与数据源(或控件)连接起来。Binding 提供了多种方式来实现不同的绑定需求。以下是 Binding 的所有主要方式及其详细说明和示例。 1. 绑定到 DataContext 这是最常见的绑定…

12.1Linux阻塞和非阻塞IO详细知识点_csdn

阻塞和非阻塞 IO 是 Linux 驱动开发里面很常见的两种设备访问模式,在编写驱动的时候一定要考虑到阻塞和非阻塞。本章我们就来学习一下阻塞和非阻塞 IO,以及如何在驱动程序中处理阻塞与非阻塞,如何在驱动程序使用等待队列和 poll 机制。 1.1阻…