Algorithm 为什么;“拆分”;不是类型为“的成员函数”;“字符串”;在围棋中?
以下是要使用不同语言的特定分隔符拆分字符串时的一些代码段:Algorithm 为什么;“拆分”;不是类型为“的成员函数”;“字符串”;在围棋中?,algorithm,go,Algorithm,Go,以下是要使用不同语言的特定分隔符拆分字符串时的一些代码段: # python s = 'a,b,c,d,e' tokens = s.split(',') // javascript let s = 'a,b,c,d,e' let tokens = s.split(',') // go s := "a,b,c,d,e" tokens := strings.Split(s, ",") 如您所见,“split”在Python和Javascript中是string类型的成员函数,但在Go中不是。
# python
s = 'a,b,c,d,e'
tokens = s.split(',')
// javascript
let s = 'a,b,c,d,e'
let tokens = s.split(',')
// go
s := "a,b,c,d,e"
tokens := strings.Split(s, ",")
如您所见,“split”在Python和Javascript中是string类型的成员函数,但在Go中不是。
我想知道为什么,它看起来像CPP中的STL,为什么操作类型实例的函数不是该类型的成员函数,在Go中实现它们似乎很容易,比如:
// go
func (s *string) Split(d string) []string {
// here goes the code to split s with d given
}
是什么原因使它这样设计的
如您所见,“split”在python和javascript中是string类型的成员函数,但在golang中不是
这似乎从一开始就是这样:第一次提交时提到了string Split()
函数
基本的字符串实用程序
这些职能被视为“公用事业”,而不是公共事业的一部分
不久之后,它被记录在案
您可以在中看到它第一次被使用
同样的方法也用于byte with bytes:,with a
添加一个类似于strings包的bytes包
总体思路是:您可以在不更改值类型本身的情况下更改该效用函数。见: 更改
strings.Split
,bytes.Split
以获取最大子字符串count
参数
func Split(s, sep []byte, n int) [][]byte
更为剧烈的演变:
strings.Split
:将默认设置为全部拆分。假设完全拆分,将拆分的签名更改为无计数,并将现有的
Split
重命名为SplitN
另一个想法是继续使用string
,同时可能在不需要时删除这些实用程序函数的依赖项(如:“删除对strconv
和strings
)的依赖项)
它还允许添加更多相关功能,而无需触摸字符串本身。请参阅:行:=
strings.SplitAfter(text,“\n”,0)
,它使用Split()
另一个优点是:您可以独立于string
本身优化这些函数,允许重复的“Split”函数替换为strings.Split()
看
go/printer
:使用字符串。拆分
而不是专用代码
使用更快的字符串包,专用代码和字符串之间的区别在于噪音:
benchmark old ns/op new ns/op delta
BenchmarkPrint 16724291 16686729 -0.22%
相反的情况也是如此:用更简单的代码替换string.Split,如
mime:删除字解码中的分配。
这修复了(*WordDecoder)中的TODO
。通过替换对字符串的调用进行解码。使用简单的前缀/后缀检查和一些自定义切片拆分
基准结果:
benchmark old ns/op new ns/op delta
BenchmarkQEncodeWord-8 740 693 -6.35%
BenchmarkQDecodeWord-8 1291 727 -43.69%
BenchmarkQDecodeHeader-8 1194 767 -35.76%
(与中的想法相同)就其价值而言,split
最初也是Python中的一种语言。go作者不想用一些非绝对必要的东西来扰乱编程语言,因此如果需要一些东西,您可以通过stdlib来获得。更一般的问题是“为什么基本的Go类型没有任何方法?”这很可能是为了保持一致性。如果Split是一种方法,那么您可能希望Join是一种[]string
的方法,但这需要字符串切片是特殊的,而不仅仅是另一种切片类型。因为Go不相信“一切都是对象”的心态。谢天谢地。
benchmark old ns/op new ns/op delta
BenchmarkQEncodeWord-8 740 693 -6.35%
BenchmarkQDecodeWord-8 1291 727 -43.69%
BenchmarkQDecodeHeader-8 1194 767 -35.76%