如何解决考虑预分配(prealloc)lint?

Mah*_*ani 8 lint go slice

Consider preallocating [to] (prealloc)golangci-lint 我的代码中发现这个问题是:

var to []string
for _, t := range s.To {
    to = append(to, t.String())
}
Run Code Online (Sandbox Code Playgroud)

您是否有在 lint 中解决此问题的想法?

icz*_*cza 16

预先分配一个有容量的切片,这样append()可以减少(或没有)复制:

to := make([]string, 0, len(s.To))
for _, t := range s.To {
    to = append(to, t.String())
}
Run Code Online (Sandbox Code Playgroud)

或者更好的是,不要使用append()而是分配给单个切片元素:

to := make([]string, len(s.To))
for i, t := range s.To {
    to[i] = t.String()
}
Run Code Online (Sandbox Code Playgroud)

  • 请密切注意此处两个 `make` 之间的区别 - 如果您使用 `append`,则必须将 cap 设置为 0,而在使用直接索引时,不得将其设置为 0。 (5认同)