中使用的启发式方法append可能不适用于所有应用程序。它专为在您不知道要存储的数据的最终长度时使用而设计。我会尽量减少您分配的额外容量,而不是稍后对其进行迭代。这是一种策略的简单示例,即仅在长度未知时使用缓冲区,并重用该缓冲区:type buffer struct { names []string ... // possibly other things}// assume this is called frequently and has lots and lots of namesfunc (b *buffer) readNames(lines bufio.Scanner) ([]string, error) { // Start from zero, so we can re-use capacity b.names = b.names[:0] for lines.Scan() { b.names = append(b.names, lines.Text()) } // Figure out the error err := lines.Err() if err == io.EOF { err = nil } // Allocate a minimal slice out := make([]string, len(b.names)) copy(out, b.names) return out, err}当然,如果你需要一些可以安全并发使用的东西,你需要修改它;为此,我建议使用缓冲通道作为存储缓冲区的漏桶。