如何通过指针接收者修改非结构体类型的值

冬强酱_3520

冬强酱_3520

2026-09-09

406人浏览

原创

如何通过指针接收者修改非结构体类型的值

在 Go 中,为非结构体类型(如自定义整数)定义指针接收者方法时,需使用解引用操作符 *i = newValue 修改底层值;若仅赋值指针变量(如 i = &newValue),只会改变局部指针副本,不影响原始变量。

在 go 中,为非结构体类型(如自定义整数)定义指针接收者方法时,需使用解引用操作符 `*i = newvalue` 修改底层值;若仅赋值指针变量(如 `i = &newvalue`),只会改变局部指针副本,不影响原始变量。

Go 允许为任意命名类型(包括 int、string、bool 等基础类型的别名)定义方法,只要接收者是该类型的值或指针。但指针接收者并不自动提供“就地修改”的魔法——它只传递一个指向原值的地址,真正修改值仍需显式解引用。

回到示例代码:

type MyInt int

func (i *MyInt) Change() {
    newValue := MyInt(32)
    i = &newValue // ❌ 错误:仅重置了形参 i 的指向,未修改原值
}

此处 i 是一个局部指针变量(类型为 *MyInt),其初始值指向调用方传入的 myInt 地址。但 i = &newValue 只是让这个局部指针指向一个新的栈上变量 newValue,原变量 myInt 的内存内容完全未被触及。函数返回后,newValue 被回收,i 的改动也彻底丢失。

✅ 正确做法是使用解引用赋值,直接写入目标内存位置:

func (i *MyInt) Change() {
    *i = 32 // ✅ 正确:将 32 写入 i 所指向的地址,即原 myInt 的存储位置
}

完整可运行示例:

package main

import "fmt"

type MyInt int

func (i *MyInt) Change() {
    *i = 32 // 关键:解引用后赋值
}

func main() {
    myInt := MyInt(64)
    fmt.Println(myInt) // 输出: 64
    myInt.Change()
    fmt.Println(myInt) // 输出: 32
}

⚠️ 注意事项:

  • 指针接收者方法必须由地址调用(如 (&myInt).Change()),但 Go 会自动将 myInt.Change() 转换为 (&myInt).Change()(前提是 myInt 是可寻址的变量);
  • 若 myInt 是字面量或不可寻址值(如 MyInt(64).Change()),编译器会报错:cannot call pointer method on ...;
  • 对于非结构体类型,值接收者方法无法修改原始值(因为传的是副本),因此需修改值时,必须使用指针接收者 + 解引用赋值这一组合。

总结:指针接收者的本质是“传递地址”,而非“启用自动修改”。无论接收者类型是否为 struct,要变更原始数据,唯一可靠的方式始终是 *ptr = newValue。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

2026.04.23

339

31

java值传递和引用传递有什么区别
java值传递和引用传递有什么区别

java值传递和引用传递的区别:1、基本数据类型的传递;2、对象的传递;3、修改引用指向的情况。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

166

5

go语言引用传递
go语言引用传递

本专题整合了go语言引用传递机制,想了解更多相关内容,请阅读专题下面的文章。

2025.06.26

3977

12

Python uv使用教程
Python uv使用教程

本专题汇总了 Python uv 使用教程与高效使用指南,从 uv 安装配置、常用命令到虚拟环境、依赖管理与项目打包,系统讲解如何用 uv 替代 pip 与 poetry,全面提升 Python 项目开发效率,助你快速上手这一现代化包管理工具,打造干净高效的 Python 工作流。

2026.10.15

0

15

剧云AI短剧创作教程合集
剧云AI短剧创作教程合集

本专题聚焦剧云AI短剧创作,讲解从短剧灵感、梗概、全局大纲到分集、分场和正文的完整流程及节奏设计方法。

2026.10.14

0

15

剧云AI剧本创作零基础入门
剧云AI剧本创作零基础入门

本专题系统讲解剧云AI剧本创作流程,涵盖灵感、梗概、大纲、分场与正文生成,帮助新手快速完成首个中文剧本项目。

2026.10.14

0

14

VibeKnow文档转视频操作指南
VibeKnow文档转视频操作指南

本专题讲解VibeKnow上传Word、TXT、Markdown等材料生成视频的方法,覆盖内容解析、脚本组织、画面生成与成片检查。

2026.10.14

0

15

VibeKnow知识视频制作与导出详解
VibeKnow知识视频制作与导出详解

本专题整理VibeKnow从注册、素材上传、AI生成到预览导出的完整操作,帮助新手快速制作第一条知识讲解视频。

2026.10.14

0

13

二狗PPT大纲编辑实操指南
二狗PPT大纲编辑实操指南

本专题聚焦二狗PPT结构化大纲的生成和修改,讲解标题、正文、目录、页数与页面顺序的调整方法,提升汇报逻辑和内容完整性。

2026.10.14

0

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.7万人学习