值类型通过&取地址转指针,指针通过*解引用转值类型,Go支持方法调用时的自动指针与值转换,但需注意nil判空;结构体方法根据是否需修改状态选择接收者类型,引用类型如slice、map在值传递时共享底层数组,但重新赋值会断开连接,应根据是否需修改长度决定是否用指针。

在Go语言中,值类型和指针类型的转换是日常开发中常见且关键的操作。理解它们之间的关系和转换方式,能帮助我们写出更安全、高效的代码。Go不允许随意进行类型强制转换,但在值与指针之间提供了明确的语义操作。
将值类型转换为指针类型,使用取地址符 & 即可。这是最常见也最直接的方式。
例如:
name := "Alice" ptr := &name // ptr 是 *string 类型
这种写法适用于变量已定义的情况。注意:不能对常量或临时表达式取地址,比如
&"hello"
立即学习“go语言免费学习笔记(深入)”;
如果需要指向一个临时值,可以先赋给变量,或使用内置函数辅助:
func newInt(x int) *int {
return &x
}
// 或使用 new
p := new(int)
*p = 42
将指针转为值类型,使用解引用操作符 *。前提是该指针不为 nil,否则会引发 panic。
示例:
age := 30 ptr := &age value := *ptr // value 是 int 类型,值为 30
解引用后得到的是原值的副本(对于基本类型),结构体等复合类型也会复制整个值。
安全做法是判空后再解引用:
if ptr != nil {
fmt.Println(*ptr)
}
在方法定义中,选择值接收者还是指针接收者,会影响性能和行为。
混用时,Go会自动在一定范围内做隐式转换:
type Person struct {
Name string
}
func (p *Person) SetName(name string) {
p.Name = name
}
// 调用时即使变量是值类型,也能调用指针接收者方法
var person Person
person.SetName("Bob") // 自动转为 &person 调用
反过来,如果接收者是值类型,传入指针也可以自动解引用。
这些类型本身是引用语义,即使作为值传递,内部仍共享底层数组或结构。
因此,对 slice 值传递时修改其元素,会影响原始 slice;但若重新分配(如 append 导致扩容),可能断开连接。
建议:对于这类类型,是否使用指针取决于是否需要修改其长度或指向。
func extend(s []int) {
s = append(s, 4) // 外部看不到这个 append
}
func extendPtr(s *[]int) {
*s = append(*s, 4) // 外部可见
}
基本上就这些。掌握取地址和解引用的规则,理解自动转换机制,就能灵活处理Go中值与指针的关系。关键是清楚每一步操作的对象是副本还是原值。不复杂但容易忽略细节。
以上就是Golang值类型与指针类型类型转换技巧的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号