为了账号安全,请及时绑定邮箱和手机立即绑定

为什么字符串函数没有在字符串类型上定义?

为什么字符串函数没有在字符串类型上定义?

Go
噜噜哒 2021-09-10 21:47:33
我只是想知道为什么 Google Go 中的字符串函数是在strings包中定义的,而不是在string数据类型本身上定义的。他们本可以轻松完成func (s string) ToUpper() string {}而不是当前func ToUpper(s string) string {}在strings包中。我的猜测是,如果您想ToUpper在扩展string(即type MyString string)的自定义类型上实现自定义版本,您将无法再访问该ToUpper类型的内置函数,但我找不到对此的任何支持。
查看完整描述

2 回答

?
ibeautiful

TA贡献1993条经验 获得超5个赞

简短的回答是:“保持语言简单。”

Go 作为一种语言只允许在同一个包中的类型上定义方法,但是因为string(像其他内置类型一样)是在语言本身中实现的,所以没有办法向它添加方法,而不会使语言/编译器复杂化.

部分原因在于 Go 的设计方式。

有关更多信息,请参阅Rob Pike(Go 的创建者之一)的这封邮件

Go 没有基本类型的方法,因为语言的设计者不希望为基本类型定义方法,部分原因是它们可能对接口产生连锁反应。我相信我们仍然对这个决定感到满意。其他人可能会有不同的感觉。

-抢

还有这个

我们只是不明白这意味着什么;没什么好解释的。Go 的设计非常谨慎。

在这种情况下,看看字符串库的大小。正如安德鲁所说,在基本类型上创建所有功能方法会使语言复杂化。既然可以通过一个更易于维护、更易于扩展、更灵活的库来实现,为什么要用这些琐碎的事情来复杂化语言呢?语言要简单得多。

-抢


查看完整回答
反对 回复 2021-09-10
?
Qyouu

TA贡献1786条经验 获得超11个赞

string内置包中预先声明的类型之一。

strings不能将这些函数定义为使用预先声明的类型作为接收器的方法:这将需要定义类型别名(到基础类型string,以便将方法附加到它)。

方法声明使用具有一个接收器类型,这反过来又不会包括任何预声明类型(布尔字节complex64 complex128错误FLOAT32 float64 INT INT8 INT16 INT32的int64符串UINT UINT8 UINT16 UINT32 UINT64 uintptr)。

或者(在此处完成),使用专用包“ strings”中的函数。
这似乎与类型字符串本身没有字段的事实相一致:它的内容不必“接收”方法,它可以简单地由函数使用。


查看完整回答
反对 回复 2021-09-10
  • 2 回答
  • 0 关注
  • 181 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信