我来自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
答案 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)
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[:])
}