一尘不染

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

go

我只是想知道为什么Google Go中的字符串函数是在strings包中定义的,而不是在string数据类型本身上定义的。他们本可以轻松完成

func (s string) ToUpper() string {
}

而不是当前

func ToUpper(s string) string {
}

strings包装中。

我的猜测是,如果您想ToUpper在扩展的自定义类型上实现的自定义版本string(即type MyString string),则无法再访问该ToUpper类型的内置函数,但是我找不到对此的任何支持。


阅读 313

收藏
2020-07-02

共1个答案

一尘不染

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

作为一种语言运行,仅允许在同一程序包中的类型上定义方法,但是由于string(像其他内置类型一样)是在语言本身中实现的,因此无法在不使语言/编译器复杂化的情况下向其中添加方法。

也有一部分是因为Go的设计方式。

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

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

-抢

这一次太:

我们根本不了解其中的含义。没有什么可解释的。Go的设计非常谨慎。

按照这种方式,查看字符串库的大小。如安德鲁所说,在基本类型上使用所有这些功能方法会使该语言复杂化。如果通过可维护,更容易扩展和更灵活的库实现语言的功能,为什么还要使语言复杂化呢?语言要简单得多。

-抢

2020-07-02