值类型转指针用取地址符&,指针转值用解引用符,示例中x=42取地址得ptr,ptr可获取原值;结构体同理,且Go支持指针自动解引用访问字段和方法;注意避免nil解引用、确保变量可寻址,不返回局部变量地址,引用类型取地址需注意语义区别。

在 Go 语言中,值类型和指针类型的转换是日常开发中常见的操作。理解它们之间的关系和转换方式,有助于写出更安全、高效的代码。Go 不支持 C/C++ 那样的强制类型转换,但提供了安全的取地址和解引用机制来实现值与指 针之间的交互。
将值类型转换为指针类型,需要使用取地址操作符 &。这会返回该值在内存中的地址,生成一个指向该值的指针。
常见于函数传参、结构体初始化或需要避免拷贝大对象的场景。
注意:不要返回局部变量的地址,除非你清楚其生命周期。示例:
立即学习“go语言免费学习笔记(深入)”;
package main
import "fmt"
func main() {
var x int = 42
ptr := &x // 值转指针
fmt.Println("值:", x) // 输出: 42
fmt.Println("指针地址:", ptr) // 输出: 0xc...
fmt.Println("指针指向的值:", *ptr) // 输出: 42
}
也可以在结构体中使用:
type Person struct {
Name string
Age int
}
p := Person{"Alice", 30}
pptr := &p // 取结构体地址
fmt.Println((*pptr).Name) // 访问字段,也可简写为 pptr.Name
将指针转换为值类型,使用解引用操作符 *。这会访问指针所指向的内存位置的值。
必须确保指针不为 nil,否则会引发 panic。
示例:
立即学习“go语言免费学习笔记(深入)”;
var ptr *int
y := 100
ptr = &y
if ptr != nil {
value := *ptr // 指针转值
fmt.Println("解引用后的值:", value) // 输出: 100
}
结构体指针转值:
personPtr := &Person{Name: "Bob", Age: 25}
person := *personPtr // 指针转值,发生拷贝
fmt.Printf("值: %+v\n", person) // 输出: {Name:Bob Age:25}
Go 允许通过指针直接访问结构体字段和方法,无需显式解引用。编译器会自动处理。
示例:
立即学习“go语言免费学习笔记(深入)”;
type Dog struct {
Name string
}
func (d *Dog) Bark() {
fmt.Println(d.Name, "barks!")
}
func main() {
d := &Dog{Name: "Max"}
fmt.Println(d.Name) // 自动解引用,等价于 (*d).Name
d.Bark() // 方法调用也自动处理
}
&123 是非法的)。基本上就这些。掌握 & 和 * 的使用,理解何时发生拷贝、何时共享数据,就能在 Go 中灵活处理值与指针的转换。不复杂但容易忽略细节,尤其是 nil 安全和可寻址性问题。
以上就是如何用Golang实现值类型与指针类型转换_Golang 值指针类型转换实践的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号