Sorting 转换类型进行排序:有运行时成本吗?
我刚刚开始学习围棋(两天前开始,写了不到1000行),我还在想一些成语 我需要按长度递减对一段字符串进行排序。我确实喜欢这样: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
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时间。事实上,在这一点上不费吹灰之力。但因为我只是在自学,所以这是一个提出这个话题的机会。非常感谢!这很有道理,并帮助我建立了一个模型。谢谢