
当使用 structname{} 语法初始化结构体时,我们创建的是结构体的一个值类型实例。这意味着变量将直接存储结构体的所有字段值,而不是其内存地址。
package main
import "fmt"
// 定义一个简单的结构体
type Rectangle struct {
Width int
Height int
}
func main() {
// 初始化一个Rectangle值类型实例
r := Rectangle{
Width: 10,
Height: 5,
}
fmt.Printf("r 的类型: %T, 值: %+v\n", r, r) // 输出: r 的类型: main.Rectangle, 值: {Width:10 Height:5}
// 尝试修改r的副本
modifyRectangleValue(r)
fmt.Printf("调用 modifyRectangleValue 后 r 的值: %+v\n", r) // 输出: 调用 modifyRectangleValue 后 r 的值: {Width:10 Height:5}
}
// 接收Rectangle值类型参数的函数
func modifyRectangleValue(rect Rectangle) {
rect.Width = 20 // 修改的是传入参数的副本
fmt.Printf("在 modifyRectangleValue 中 rect 的值: %+v\n", rect) // 输出: 在 modifyRectangleValue 中 rect 的值: {Width:20 Height:5}
}特点:
当使用 &StructName{} 语法初始化结构体时,我们创建的是一个指向结构体实例的指针类型。这意味着变量存储的不是结构体本身,而是结构体在内存中的地址。
package main
import (
"fmt"
"net/http" // 示例中引用的标准库http包
)
// 定义一个简单的结构体用于演示
type User struct {
ID int
Name string
}
func main() {
// 初始化一个http.Client的指针类型实例
// 类似于标准库中的示例:client := &http.Client{CheckRedirect: redirectPolicyFunc,}
client := &http.Client{}
fmt.Printf("client 的类型: %T, 值: %+v\n", client, client) // 输出: client 的类型: *http.Client, 值: &{}
// 初始化一个User的指针类型实例
u := &User{
ID: 1,
Name: "Alice",
}
fmt.Printf("u 的类型: %T, 值: %+v\n", u, u) // 输出: u 的类型: *main.User, 值: &{ID:1 Name:Alice}
// 通过指针修改结构体内容
modifyUserPointer(u)
fmt.Printf("调用 modifyUserPointer 后 u 的值: %+v\n", u) // 输出: 调用 modifyUserPointer 后 u 的值: &{ID:2 Name:Bob}
}
// 接收User指针类型参数的函数
func modifyUserPointer(user *User) {
user.ID = 2
user.Name = "Bob" // 通过指针修改的是原始结构体
fmt.Printf("在 modifyUserPointer 中 user 的值: %+v\n", user) // 输出: 在 modifyUserPointer 中 user 的值: &{ID:2 Name:Bob}
}特点:
选择使用值类型还是指针类型初始化结构体,取决于具体的应用场景和设计考量:
立即学习“go语言免费学习笔记(深入)”;
内存与性能开销:
修改原始数据:
方法接收者:
nil 值:
并发安全:
综上所述,Go语言中结构体初始化时使用 StructName{} 还是 &StructName{},本质上是选择创建结构体的值类型实例还是指针类型实例。这并非简单的语法偏好,而是对变量类型、内存管理和程序行为的深思熟虑。
在实际开发中,应根据结构体的大小、是否需要修改其状态、以及与现有API(尤其是标准库)的兼容性来做出明智的选择。理解这两种初始化方式的语义,是编写健壮、高效Go代码的关键一步。
以上就是Go语言结构体初始化:理解值类型与指针类型的选择的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号