不懂就问, go 不是没有运算符重载吗,为什么 map 可以通过下标访问,数组比较可以用==

2021 年 11 月 28 日
 jackiejkl
m:=make(map[int]int)
m[0]=0 //map 可以通过下标访问元素
a:=[]int{1,2,3}
b:=[]int{1,2,3}
fmt.Print(a==b) //true
4972 次点击
所在节点    Go 编程语言
27 条回复
awah
2021 年 11 月 28 日
不懂就问,运算符重载和这两个有什么关系?为什么不可以这样用?
SuperMild
2021 年 11 月 28 日
invalid operation: a == b (slice can only be compared to nil)

数组可以 ==,slice 不行。
jackiejkl
2021 年 11 月 28 日
@SuperMild 谢谢大佬 学到了 但是还是不明白数组可以==,按我的理解是两个不同数组的头指针在对比
jackiejkl
2021 年 11 月 28 日
@luguhu 因为按我的理解下标访问是数组才可以 数组==比较是两个不同数组的头指针在对比
Buges
2021 年 11 月 28 日
“运算符重载”是很糟糕的命名,“重载”什么了?
正确的叫法应该是不允许为自定义类型定义运算符操作。
显然内置类型不属于自定义类型。
awah
2021 年 11 月 28 日
@jackiejkl go 的数组在做比较的时候对比的不是指针而是值吧. 可以尝试用 unsafe.Pointer 获取地址再对比, 获取到的两个地址应该是不一样的
jackiejkl
2021 年 11 月 28 日
@luguhu 明白 感谢!
neoblackcap
2021 年 11 月 28 日
运算符重载的例子你都举得不对,map 等内置数据结构当然可以用下标比较。因为这是语言规定的一部分。要举例子啊,你应该举 make ,毕竟它可以接受数量不一样的参数。你试试看能不能模仿
jackiejkl
2021 年 11 月 28 日
@neoblackcap 不明白这和 make 有什么关系 另外是因为我觉得除了 int 这种基本类型 map 应该是类 应该用 map.getValue(Key)来取得值 (似乎暴露了什么
PlG5sBkXD1ziLeGB
2021 年 11 月 28 日
map[key] = value,不明白和下标有什么关系
lysS
2021 年 11 月 28 日
你这是学叉了吧

map 那个你是访问的 key, 你把 map 的 key 定为 string 看看
ClarkAbe
2021 年 11 月 28 日
map 你不用这种方式的话你就只有 range 才能获取了........map 没有函数封装也不是 struct,为什么不能这样访问.......建议看完圣经.....
leoleoasd
2021 年 11 月 28 日
有些语言,支持重载运算符,内置类型的运算自然通过重载运算符实现,比如 Python 和 Rust 。
有些语言不支持重载运算符,内置类型的运算符就只能通过语言规定。
Cbdy
2021 年 11 月 28 日
大道至简
qq2562524625
2021 年 11 月 28 日
楼主 Go 语言基础可能需要好好补一下,Go 里的数组类型,不止是与元素的类型有关,还有数据的长度有关,不同长度的数据类型不同,只有相同长度相同类型,才会逐一对比数据内的元素。
Nasei
2021 年 11 月 28 日
Go 不是 java ,map 和运算符重载没关系,== 比较数组的值相等有问题吗
iQXQZX
2021 年 11 月 28 日
下标访问是万能的编译器,做的代码转换,这些在编译的时候会换改成对应的函数吧
noroot
2021 年 11 月 28 日
没有运算符重载的意思是运算符重载不给用户使用而已,没说不给语言发明者使用。(手动狗头
neoblackcap
2021 年 11 月 28 日
@jackiejkl 我的意思是 map 是内置的,好比你对数组也只能用[index]这样的方法取值,而不能使用.index 这样的方式取值。它本来就是语言的一部分。语言就是这样规定的。
至于为什么提到 make ,因为 make 就是一个看似违反函数调用方式的存在,它一个函数可以有多种函数签名。本质上还是语言作者自己开洞实现或者说这就是语言的一部分,“我用可以,你们使用者用就不行”
mzmssg
2021 年 11 月 28 日
go 和 c++不一样。c++对 stl 和用户类是一视同仁的,用户自己可以实现出和 stl 相同的东西。但 go 是为内置数据类型开了天窗的,用户没法自己实现内置类型的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/818542

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX