0

0

Go语言中自定义类型切片的元素替换:正确解引用操作符优先级解析

聖光之護

聖光之護

发布时间:2025-12-25 20:33:07

|

103人浏览过

|

来源于php中文网

原创

Go语言中自定义类型切片的元素替换:正确解引用操作符优先级解析

go中对自定义类型(如结构体切片)指针进行索引赋值时,需注意解引用操作符`*`与索引操作符`[]`的优先级关系;错误写法`*v[i]`会被解析为`*(v[i])`,而正确写法`(*v)[i]`才能先解引用再索引,从而实现原地元素替换。

当你为一个自定义类型(例如 type UserList []User)定义方法,并希望在指针接收者方法中修改底层数组的某个元素时,常见的陷阱源于 Go 操作符优先级规则:*方括号 [] 的优先级高于星号 ``**。

这意味着:

  • *v[i] 等价于 *(v[i]) —— 先尝试对 v 进行索引(但 v 是 *UserList 类型,即指向切片的指针,不支持直接索引),编译器报错:invalid operation: v[i] (type *UserList does not support indexing)。
  • (*v)[i] 则明确表示:先解引用 v 得到 UserList 类型(即 []User),再对其执行索引操作,这才是合法且符合预期的行为。

✅ 正确示例代码:

type User struct {
    ID   int
    Name string
}

type UserList []User

// ReplaceAt 替换指定索引处的用户(指针接收者)
func (v *UserList) ReplaceAt(i int, u User) {
    if i < 0 || i >= len(*v) {
        panic("index out of range")
    }
    (*v)[i] = u // 关键:括号确保先解引用,再索引
}

// 使用示例
func main() {
    users := UserList{{ID: 1, Name: "Alice"}, {ID: 2, Name: "Bob"}}
    fmt.Printf("Before: %+v\n", users) // [{ID:1 Name:"Alice"} {ID:2 Name:"Bob"}]

    users.ReplaceAt(1, User{ID: 2, Name: "Bobby"})
    fmt.Printf("After:  %+v\n", users) // [{ID:1 Name:"Alice"} {ID:2 Name:"Bobby"}]
}

⚠️ 注意事项:

司马诸葛
司马诸葛

基于企业知识文档,就可训练专属AI数字员工

下载

立即学习go语言免费学习笔记(深入)”;

  • 若方法使用值接收者(func (v UserList) ReplaceAt(...)),则操作的是副本,无法修改原始切片;
  • 始终校验索引边界(i = len(*v)),避免 panic;
  • 该模式适用于任何基于切片的自定义类型(如 type IntSlice []int),核心原则不变:(*v)[i] 是安全替换的黄金写法。

总结:Go 中没有“隐式解引用”,一切操作符行为均严格遵循优先级规则。牢记 (*v)[i] 是对自定义切片类型指针进行元素赋值的标准、可靠且可读性高的写法。

相关专题

更多
golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

193

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

184

2025.07.04

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

311

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

511

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

46

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

177

2025.08.29

Go中Type关键字的用法
Go中Type关键字的用法

Go中Type关键字的用法有定义新的类型别名或者创建新的结构体类型。本专题为大家提供Go相关的文章、下载、课程内容,供大家免费下载体验。

233

2023.09.06

go怎么实现链表
go怎么实现链表

go通过定义一个节点结构体、定义一个链表结构体、定义一些方法来操作链表、实现一个方法来删除链表中的一个节点和实现一个方法来打印链表中的所有节点的方法实现链表。

441

2023.09.25

笔记本电脑卡反应很慢处理方法汇总
笔记本电脑卡反应很慢处理方法汇总

本专题整合了笔记本电脑卡反应慢解决方法,阅读专题下面的文章了解更多详细内容。

1

2025.12.25

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 2.9万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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