使用指向数组的指针

新手上路,请多包涵

我正在玩谷歌的 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 许可协议

阅读 267
1 个回答

Google Go 文档 陈述了以下关于传递数组的内容——他们说你通常想要传递一个切片(而不是一个指针?):

更新:

正如@Chickencha 的评论所指出的,数组切片是引用,这就是它们可以高效传递的原因。因此,您可能希望使用切片机制而不是“原始”指针。

来自 Google Effective Go 文档 http://golang.org/doc/effective_go.html#slices

切片是引用类型,


原来的

它在标题下

关于类型的插曲

[…snip…] 将数组传递给函数时,您几乎总是希望将形参声明为切片。当您调用该函数时,获取数组的地址,Go 将(有效地)创建一个切片引用并将其传递。

编者按:情况不再如此

使用切片可以编写此函数(来自 sum.go):

 09    func sum(a []int) int {   // returns an int
10        s := 0
11        for i := 0; i < len(a); i++ {
12            s += a[i]
13        }
14        return s
15    }

并像这样调用它:

 19        s := sum(&[3]int{1,2,3})  // a slice of the array is passed to sum


也许将整个数组作为切片传递。 Google 表示 Go 可以高效地处理切片。这是问题的替代答案,但也许这是更好的方法。

原文由 John K 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题