首页 > 后端开发 > Golang > 正文

Golang值类型与指针类型类型转换技巧

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

golang值类型与指针类型类型转换技巧

在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
登录后复制

解引用后得到的是原值的副本(对于基本类型),结构体等复合类型也会复制整个值。

文心大模型
文心大模型

百度飞桨-文心大模型 ERNIE 3.0 文本理解与创作

文心大模型 56
查看详情 文心大模型

安全做法是判空后再解引用:

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 调用
登录后复制

反过来,如果接收者是值类型,传入指针也可以自动解引用。

map、slice、channel 等引用类型的特殊情况

这些类型本身是引用语义,即使作为值传递,内部仍共享底层数组或结构。

因此,对 slice 值传递时修改其元素,会影响原始 slice;但若重新分配(如 append 导致扩容),可能断开连接。

建议:对于这类类型,是否使用指针取决于是否需要修改其长度或指向。

func extend(s []int) {
    s = append(s, 4)  // 外部看不到这个 append
}

func extendPtr(s *[]int) {
    *s = append(*s, 4) // 外部可见
}
登录后复制

基本上就这些。掌握取地址和解引用的规则,理解自动转换机制,就能灵活处理Go中值与指针的关系。关键是清楚每一步操作的对象是副本还是原值。不复杂但容易忽略细节。

以上就是Golang值类型与指针类型类型转换技巧的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号