go 中没有固定长度限制的“动态数组”,但可通过 `append()` 函数实现零手动管理容量的切片自动扩容,时间复杂度为均摊 o(1),完美替代 java 的 `arraylist.add()`。
在 Go 中,切片(slice)本身就是动态长度的数据结构——它底层由数组、长度(len)和容量(cap)三部分组成。虽然切片本身不提供 .add() 这样的方法,但标准库提供的 append() 函数正是为此而生:它会在底层数组容量不足时自动分配更大内存,并复制原有元素,整个过程对开发者完全透明。
你原代码中使用 make([]string, 100) 预分配固定长度,不仅浪费内存(如目录仅含 3 个文件),还存在越界风险(若文件数超过 100)。正确做法是初始化一个长度为 0、容量可伸缩的切
片,然后持续 append:
package main
import (
"fmt"
"io/ioutil" // 注意:Go 1.16+ 推荐改用 os.ReadDir,ioutil 已弃用
)
func listFile() []string {
var list []string // 等价于 make([]string, 0),更简洁
files, err := ioutil.ReadDir("content")
if err != nil {
panic(err) // 实际项目中应妥善处理错误,而非 panic
}
for _, f := range files {
list = append(list, f.Name()) // 自动扩容,无需关心 cap
}
return list
}
func main() {
fmt.Println(listFile()) // 输出类似:[1.txt 2.txt tmp]
}✅ 关键要点说明:
总结:Go 切片 + append() 组合,就是 Go 世界里的“动态数组”。无需手动扩容、无需预估大小、无需第三方依赖——这是 Go 基于值语义与运行时优化给出的优雅答案。