./prog.go:6:7: cannot use a (type [3]int) as type [5]int in assignment
数组是值类型
Go 中的数组是值类型而不是引用类型。 这意味着当它们被分配给一个新变量时,原始数组的副本被分配给新变量。 如果对新变量进行了更改,它将不会反映在原始数组中。
1 2 3 4 5 6 7 8 9 10 11
package main
import"fmt"
funcmain() { a := [...]string{"USA", "China", "India", "Germany", "France"} b := a // a 的副本被分配给 b b[0] = "Singapore"// b 的第一个元素被改变为 Singapore,这不会影响到 a fmt.Println("a is ", a) fmt.Println("b is ", b) }
a is [USA China India Germany France] b is [Singapore China India Germany France]
同样,当数组作为参数传递给函数时,它们是按值传递的,原始数组不变。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
package main
import"fmt"
funcchangeLocal(num [5]int) { num[0] = 55 fmt.Println("inside function ", num)
} funcmain() { num := [...]int{5, 6, 7, 8, 8} fmt.Println("before passing to function ", num) changeLocal(num) // num 是按值传递的,因此不会因为函数调用而改变 fmt.Println("after passing to function ", num) }
funcmain() { a := [...]float64{67.7, 89.8, 21, 78} for i := 0; i < len(a); i++ { // 从 0 循环到数组的长度 fmt.Printf("%d th element of a is %.2f\n", i, a[i]) } }
上面的程序使用一个 for 循环来迭代数组的元素,从索引 0 到 length of the array - 1。 这个程序可以工作并且会打印
1 2 3 4
0 th element of a is 67.70 1 th element of a is 89.80 2 th element of a is 21.00 3 th element of a is 78.00
Go 通过使用 for 循环的 range 形式提供了一种更好、更简洁的方法来迭代数组。 range 返回索引和该索引处的值。 让我们使用 range 重写上面的代码。 我们还将找到数组所有元素的总和。
1 2 3 4 5 6 7 8 9 10 11 12 13
package main
import"fmt"
funcmain() { a := [...]float64{67.7, 89.8, 21, 78} sum := float64(0) for i, v := range a { // range 同时返回索引和值 fmt.Printf("%d the element of a is %.2f\n", i, v) sum += v } fmt.Println("\nsum of all elements of a",sum) }