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

2021-11-28 17:06:12 +08:00
 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
3837 次点击
所在节点    Go 编程语言
27 条回复
luguhu
2021-11-28 17:12:45 +08:00
不懂就问,运算符重载和这两个有什么关系?为什么不可以这样用?
SuperMild
2021-11-28 17:17:35 +08:00
invalid operation: a == b (slice can only be compared to nil)

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

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