Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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
Sorting 转换类型进行排序:有运行时成本吗?_Sorting_Go_Casting - Fatal编程技术网

Sorting 转换类型进行排序:有运行时成本吗?

Sorting 转换类型进行排序:有运行时成本吗?,sorting,go,casting,Sorting,Go,Casting,我刚刚开始学习围棋(两天前开始,写了不到1000行),我还在想一些成语 我需要按长度递减对一段字符串进行排序。我确实喜欢这样: func ... { ... do business ... sort.Sort(stringsLongestFirst(severalThousandStrings)) ... carry on and be happy, because it works ... } type stringsLongestFirst []string

我刚刚开始学习围棋(两天前开始,写了不到1000行),我还在想一些成语

我需要按长度递减对一段字符串进行排序。我确实喜欢这样:

func ... {
    ... do business ...

    sort.Sort(stringsLongestFirst(severalThousandStrings))

    ... carry on and be happy, because it works ...
}

type stringsLongestFirst []string

func (b stringsLongestFirst) Len() int           { return len(b) }
func (b stringsLongestFirst) Less(i, j int) bool { return len(b[i]) > len(b[j]) }
func (b stringsLongestFirst) Swap(i, j int)      { b[j], b[i] = b[i], b[j] }
首先,我想知道这是否是最惯用的方法

然后,最重要的是,我想知道当我写
stringsLongestFirst(数个sandstrings)
时,引擎盖下会发生什么。字符串片段是否以某种方式被巧妙地重新解释为
stringsLongestFirst
类型,或者我必须用一些复制开销来计数


(已编辑:删除了规范中不适合当前情况的摘录)

您正在转换的类型既不是数字类型也不是字符串:
[]字符串和
字符串长度优先
是切片类型


因此,转换产生的开销应该不会比复制切片头(12或24字节,取决于字长)多,这在将其打包为
接口{}
变量以调用
排序时无论如何都会发生。备份数组没有被复制,这就是为什么调用后会对若干个sandstrings进行排序。

这里没有什么是字符串特有的。(我认为规范中的这些部分是关于涉及
[]符文
[]字节
的转换)每次调用
len
时,它都在拉
len
。这很快,因为--如果您尝试单独缓存长度,可能不会有任何好处。因此,如果我很好地遵循,将普通[]字符串转换为带排序伪装的[]字符串。接口实际上不会改变内存表示形式,对吗?没错。如果您好奇的话,通常是指向类型信息的指针和指向底层对象的第二个指针。这样的速度不会太慢——按长度排序几千个字符串可能需要几毫秒的CPU时间。事实上,在这一点上不费吹灰之力。但因为我只是在自学,所以这是一个提出这个话题的机会。非常感谢!这很有道理,并帮助我建立了一个模型。谢谢