不懂就问, 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
3846 次点击
所在节点    Go 编程语言
27 条回复
jackiejkl
2021-11-29 00:03:50 +08:00
@yyf1234
@lysS
主要是[]这个运算符 似乎我自定义一个 K-V 容器的话用不了[]来取 value ?
jackiejkl
2021-11-29 00:05:31 +08:00
@neoblackcap 666 学到了
@mzmssg 明白
@qq2562524625 确实是刚学 领教了
2i2Re2PLMaDnghL
2021-11-29 09:58:56 +08:00
@Buges 这个名字来源于数学、错误迁用和错误翻译。
数学:overload 原本是指同一个符号(数学上的符号,包括 d/dx 或者 A B C 这种)用于多个不同的含义。因为会产生混淆,数学上认为这是一种糟糕的实践。
错误迁用: 工程上其实是用这样一个词来表述『相似的符号通过不同的实现来获得相似的含义』,它产生了表面的一致性( Matrix+Matrix 或者 int+int 当然都应该是 + )。但同样地发生了上述 overload 的问题,用以表示不同的含义(比如 str+str 其实不应该是 str ,更恰当的比如 ++)。
错误翻译:这个词构词有「载」,但「重」到底是 chóng 还是 zhòng 是个问题。看 overload 一词构词上来说,应该是 zhòng ,但这个读音下这个词还是多义。另一方面,根据「重复的名称」似乎又应该是 chóng 。而且这个词在电学上也有「过载」一译法。
whyso
2021-11-29 10:38:01 +08:00
”为什么 map 可以通过下标访问“
先问是不是,再问为什么
Buges
2021-11-29 12:41:02 +08:00
@2i2Re2PLMaDnghL 我觉得这个应该是从无泛型的语言沿用下来的,“重载”一般是多个签名不同的函数(类型、数量不一致)共用同一个名字,而运算符则更接近定义于对应 interface/type class 的泛型函数(或 OO 里所谓的多态),任何类型只要实现了对应的 interface/type class 就能支持相应的操作,不应该再称为“重载”。
2i2Re2PLMaDnghL
2021-11-29 13:10:44 +08:00
@Buges OO 的多态有两种,一种是唯名论的 trait ;另一种是唯实论的 interface 。 (以 Ponylang 的术语命名)
(注:Java 的 interface 实际上是 trait )
( Python 原本是唯实论的,后来搞出唯名论,现在又做了点唯实论的东西,属实是墙头草)
重载只是单纯的「同形不同义」之表述,并不实质上区分函数名、关键词、操作符,甚至发源在 OO 之前。这都属于文法范畴,语义层面上考虑时不建议深究它们的区别,毕竟 Lisp 早已经大一统了, `+` `-` 都是函数名。
Buges
2021-11-29 13:37:44 +08:00
@2i2Re2PLMaDnghL duck typing 和显式声明的区别并不重要。我不是指区分 operator 和 function ,而是说通过所谓多态、泛型,用户并没有为自己的类型实现`+`,而是实现其所定义的 interface 需要的方法。使用时还是调用的原本的`+`,没有复用已有的名字,所以不该称为重载。

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

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

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

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

© 2021 V2EX