我正在玩谷歌的 Go 语言,我遇到了一些在 C 中相当基础但似乎没有包含在我目前所见的文档中的东西
当我将一个指向切片的指针传递给一个函数时,我假设我们有一些方法可以访问它,如下所示:
func conv(x []int, xlen int, h []int, hlen int, y *[]int)
for i := 0; i<xlen; i++ {
for j := 0; j<hlen; j++ {
*y[i+j] += x[i]*h[j]
}
}
}
但是 Go 编译器不喜欢这样:
sean@spray:~/dev$ 8g broke.go
broke.go:8: invalid operation: y[i + j] (index of type *[]int)
很公平——这只是一个猜测。我有一个相当简单的解决方法:
func conv(x []int, xlen int, h []int, hlen int, y_ *[]int) {
y := *y_
for i := 0; i<xlen; i++ {
for j := 0; j<hlen; j++ {
y[i+j] += x[i]*h[j]
}
}
}
但肯定有更好的方法。令人恼火的是,用谷歌搜索 Go 上的信息并不是很有用,因为大多数搜索词都会出现各种 C/C++/不相关的结果。
原文由 Sean 发布,翻译遵循 CC BY-SA 4.0 许可协议
Google Go 文档 陈述了以下关于传递数组的内容——他们说你通常想要传递一个切片(而不是一个指针?):
更新:
正如@Chickencha 的评论所指出的,数组切片是引用,这就是它们可以高效传递的原因。因此,您可能希望使用切片机制而不是“原始”指针。
来自 Google Effective Go 文档 http://golang.org/doc/effective_go.html#slices
原来的
它在标题下
关于类型的插曲
编者按:情况不再如此
使用切片可以编写此函数(来自 sum.go):
并像这样调用它:
也许将整个数组作为切片传递。 Google 表示 Go 可以高效地处理切片。这是问题的替代答案,但也许这是更好的方法。