在golang

时间:2016-08-02 22:27:26

标签: arrays go

我来自C background并在C风格中传递数组导致错误。

plz help

package main
import "fmt"

func f(a *int){
  fmt.Println(a[1])
}

func main(){
  var a [100]int
  a[1]=100
  f(a)
}

错误 :: 不能在f的参数中使用(类型[100] int)作为类型* int

4 个答案:

答案 0 :(得分:7)

正如其他人在评论中提到的那样,您可能希望使用切片而不是数组。切片已通过引用传递,因此无需指定指针。下面的make语句创建一个int的片段(由数组支持)。在下面的代码中,我给它的长度为2,容量为100,以满足您分配索引1的目标。

import (
    "fmt"
)

func f(a []int) {
    fmt.Println(a[1])
}

func main() {
    a := make([]int, 2, 100)
    a[1] = 100
    f(a)
}

答案 1 :(得分:2)

必须使用切片而不是数组作为函数的参数。 例如:

func p(a int){
fmt.Println(a)
}
func main() {
    var a = make([]int,2,10) //2 is length, 10 is capacity
    a[0] = 10
    p(a[0])
}

数组是值类型,slice是引用类型。您可以在https://blog.golang.org/go-slices-usage-and-internals

了解更多信息

希望它对你有所帮助!

答案 2 :(得分:1)

要回答原始问题,您可以传递指向数组的指针,以通过引用传递数组。

例如,以下函数更改3个整数数组的内容。

func change(ptr *[3]int) {
    ptr[2] = 20
}

您可以通过传递指向原始数组的指针来调用它:

change(&arr)

Complete Example

package main

import (
    "fmt"
)

func main() {
    grades := [3]int {1, 2, 3}

    fmt.Printf("\nOriginal array:\n")
    for i, v := range grades {
        fmt.Printf("arr[%d] = %d\n", i, v)    // prints 1 2 3
    }

    change(&grades)
    fmt.Printf("\nModified grades:\n")
    for i, v := range grades {
        fmt.Printf("arr[%d] = %d\n", i, v)    // prints 1 2 20
    }
}

func change(ptr*[3]int) {
    ptr[2] = 20
}

在您的示例中,f期望指向整数的指针

func f(a *int)    // a points to an integer

您正在将其传递给数组,

var a [100]int
f(a)

因此它会给您错误cannot use a (type [100]int) as type *int in argument to f

尽管将指针传递给数组非常有效,并且允许被调用函数更改调用方的变量,但数组的大小仍然固定。因此,建议使用切片,这些切片将通过引用传递并且大小是动态的。

答案 3 :(得分:0)

go数组的功能有限。在C / C ++中,当您将数组传递给函数时,第0个索引的地址将被传递,但如果转到go,则会复制完整的数组。如果在main和f中打印数组的地址,则可以看到,如果传递数组,它们将有所不同。您可以做的是,从数组a中使用slice创建一个a[:]。传递slice时,由于slice包含指向a的指针,因此将slice的值复制了。您在f中所做的任何更改都将反映在原始数组a中。

package main
import "fmt"

func f(a []int){
  fmt.Println(a[1])
}

func main(){
  var a [100]int
  a[1]=100
  //Create a slice and pass it
  f(a[:])

}