Go中值类型赋值时会复制数据,包括基本类型和结构体,修改副本不影响原值;结构体可比较当所有字段可比较且类型相同;含不可比较字段则无法使用==;通过指针可共享数据并修改原值,避免大对象拷贝提升性能。

在 Go 语言中,值类型(Value Types)的默认行为是赋值时进行数据拷贝。这意味着当你将一个值类型的变量赋给另一个变量,或作为参数传递给函数时,系统会创建该值的一个副本,而不是引用原始数据。这种行为适用于所有基本类型和结构体类型,只要它们没有被显式地取地址使用指针。
Go 的基本类型如 int、float64、bool、string 等都是值类型。它们的赋值操作会直接复制底层数据。
例如:
a := 10 b := a // b 得到 a 的副本 b = 20 // 修改 b 不影响 a fmt.Println(a) // 输出 10
这里 a 和 b 是独立的变量,修改其中一个不会影响另一个。
立即学习“go语言免费学习笔记(深入)”;
结构体(struct)也是值类型。当结构体变量被赋值或传参时,整个结构体的内容会被复制。
type Person struct {
Name string
Age int
}
p1 := Person{Name: "Alice", Age: 30}
p2 := p1 // p2 是 p1 的完整拷贝
p2.Age = 35 // 修改 p2 不影响 p1
fmt.Println(p1.Age) // 输出 30
即使结构体包含多个字段,赋值操作仍会复制所有字段的值。如果字段本身是值类型,就逐字段拷贝;如果是引用类型(如 slice、map),则拷贝的是引用,但结构体本身仍是值传递。
Go 支持使用 == 和 != 对值类型进行比较,前提是类型可比较。
示例:
p1 := Person{Name: "Bob", Age: 25}
p2 := Person{Name: "Bob", Age: 25}
fmt.Println(p1 == p2) // 输出 true
但如果结构体中包含不可比较的字段(如 slice、map、func),则结构体整体不可比较,使用 == 会编译错误。
虽然结构体默认是值类型,但通过使用指针可以改变其行为,实现共享和修改原始数据。
p1 := Person{Name: "Alice", Age: 30}
ptr := &p1
ptr.Age = 35 // 修改通过指针影响原始变量
fmt.Println(p1.Age) // 输出 35
指针本身是引用,但指向的结构体仍是值类型。使用指针传递结构体可以避免大对象拷贝,提升性能。
基本上就这些。Go 的值类型设计强调明确性和安全性,理解拷贝与比较的默认行为有助于写出更清晰、无副作用的代码。
以上就是Golang值类型默认行为 基本类型与结构体比较的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号