Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 为什么;“拆分”;不是类型为“的成员函数”;“字符串”;在围棋中?_Algorithm_Go - Fatal编程技术网

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%