💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
## slice陷阱 ### 陷阱一: append 会改变切片的地址 `append`的本质是向切片中追加数据,而随着切片中元素逐渐增加,当切片底层的数组将满时,切片会发生扩容, 扩容会导致产生一个新的切片(拥有容量更大的底层数组),更多关于切片的信息,请查阅切片相关章节。 `append`每个追加元素,都有可能触发切片扩容,也即有可能返回一个新的切片,这也是`append`函数声明中返回值为切片的原因 示例: 函数`Validation()`用于一些合法性检查,每遇到一个错误,就生成一个新的`error`并追加到切片`errs`中, 最后返回包含所有错误信息的切片,如下所示: ~~~golang func Validation() []error { var errs []error append(errs, errors.New("error 1")) append(errs, errors.New("error 2")) append(errs, errors.New("error 3")) return errs } ~~~ ### 陷阱二: append 可以追加nil值 向切片中追加一个`nil`值是完全不会报错的,如下代码所示: ~~~ slice := append(slice, nil) ~~~ 经过追加后,slice的长度递增1,实际上`nil`是一个预定义的值,即空值,所以完全有理由向切片中追加; 示例: 函数`ValidateName()`用于检查某个名字是否合法,如果不为空则认为合法,否则返回一个`error`: ~~~golang func ValidateName(name string) error { if name != "" { return nil } return errors.New("empty name") } func Validations(name string) []error { var errs []error errs = append(errs, ValidateName(name)) return errs } ~~~