Golang中Append文档过时问题探讨

Golang中Append文档过时问题探讨 go.dev 上关于 append 的文档已经过时,因为它写道:

其中 T 是任意给定类型的占位符。实际上,你无法在 Go 中编写一个类型 T 由调用者决定的函数。这就是为什么 append 是内置函数:它需要编译器的支持。

随着 1.18 版本的发布,这已不再正确。文档链接:Effective Go - The Go Programming Language

2 回复

你好,Jordan,

我们与 go.dev 网站没有官方关联。我认为你应该在这里提交一个问题:Issues · golang/go · GitHub

更多关于Golang中Append文档过时问题探讨的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


确实,Go 1.18引入泛型后,append文档中的这部分描述已经过时。现在我们可以用泛型编写接收任意类型切片的函数。以下是示例代码:

package main

import "fmt"

// 泛型函数,可以处理任意类型的切片
func AppendSlice[T any](slice []T, elements ...T) []T {
    return append(slice, elements...)
}

func main() {
    // 处理int切片
    intSlice := []int{1, 2, 3}
    intSlice = AppendSlice(intSlice, 4, 5)
    fmt.Println(intSlice) // [1 2 3 4 5]
    
    // 处理string切片
    strSlice := []string{"a", "b"}
    strSlice = AppendSlice(strSlice, "c", "d")
    fmt.Println(strSlice) // [a b c d]
    
    // 处理自定义类型切片
    type Point struct{ X, Y int }
    pointSlice := []Point{{1, 2}, {3, 4}}
    pointSlice = AppendSlice(pointSlice, Point{5, 6})
    fmt.Println(pointSlice) // [{1 2} {3 4} {5 6}]
}

虽然现在可以用泛型实现类似功能,但append作为内置函数仍有其优势:

  1. 编译器可以直接优化,性能更好
  2. 支持append(slice, anotherSlice...)的展开语法
  3. 内存分配策略更智能

文档确实需要更新以反映泛型的引入,但append的内置实现仍有其存在的价值。

回到顶部