浅析Go语言中数组的这些细节
掘金小逆 人气:1Go语言基础二
len&cap
书接上文,我们提到二维数组中的第二个维度的数组不能用...
来表示,接下来我们要认识两个新的函数,它们分别是len和cap
package main func main() { a := [2]int{} println(len(a), cap(a)) }
由上方代码可知,我们在main函数里面定义了一个a数组,长度为2,未进行初始化变量等赋值操作,所以数组元素均为0;调用打印函数输出的是数组a的length
和cap
值,这里运行结果均为2
二维数组的遍历
接下来我们重点讲一下二维数组的遍历,有些小伙伴可能就要问了:我没学过什么遍历循环啊,这让我怎么理解?
别急,咱们看代码主要看的是一个思路过程~
package main import ( "fmt" ) func main() { var f [2][3]int = [...][3]int{{1, 2, 3}, {7, 8, 9}} for k1, v1 := range f { for k2, v2 := range v1 { fmt.Printf("(%d,%d)=%d ", k1, k2, v2) } fmt.Println() } }
首先我们可以看到在main
函数里面定义了一个int
类型,名叫f的数组,它的属性为2行3列,第一行存储的是 {1,2,3} ,第二行存储的是 {7,8,9} ,我们通过for循环对二维数组进行一次遍历,读者暂时可以把它理解成一个循环的固定格式,后续循环会为读者一一介绍,由于本次数组是二维数组,所以我们需要调用两次for循环来对数组进行遍历,通过函数打印输出所需要的值
数组的拷贝与传参
package main import "fmt" func printArr(arr *[5]int) { arr[0] = 10 for i, v := range arr { fmt.Println(i, v) } } func main() { var arr1 [5]int printArr(&arr1) fmt.Println(arr1) arr2 := [...]int{2, 4, 6, 8, 10} printArr(&arr2) fmt.Println(arr2) }
首先我们可以看到定义了一个printArr方法,并在方法里面内置了一个长度为5、int类型的数组。紧接着我们将数组的第一个元素赋值为10,紧接着对数组进行循环遍历,分别输出数组的索引及索引位置上的值
回到main方法中,我们定义了一个名叫arr1,长度为5,int类型的数组,并直接打印该数组的地址值,同时调用函数打印出该数组未进行初始化时候的值,显而易见的是,由于我们在printArr中已经对索引位置为1的数组的值进行了一次修改,所以本次打印输出数组的时候,也会受到上一次数组的影响,所以本次数组打印输出的结果为[10 0 0 0 0]
。紧接着,我们定义了一个名叫arr2,长度为任意,int类型的数组,同时给予赋值操作,但是由于在printArr中索引为1的数组的位置的值已经发生了改变,所以本次arr2数组打印输出的结果为[10 4 6 8 10]
求数组所有元素之和
package main import ( "fmt" "math/rand" "time" ) func sumArr(a [10]int) int { var sum int = 0 for i := 0; i < len(a); i++ { sum += a[i] } return sum } func main() { rand.Seed(time.Now().Unix()) var b [10]int for i := 0; i < len(b); i++ { b[i] = rand.Intn(1000) } sum := sumArr(b) fmt.Printf("sum=%d\n", sum) }
我们首先定义了一个方法名叫sumArr,同时往该方法里面传入一个名为a,长度为10,数据类型为int类型的数组。在本方法里面,我们定义一个变量为sum,使用for循环来对数组进行遍历操作,同时使用sum来记录该数组各元素的和,最终返回sum的值
紧接着我们看到main方法,我们在该方法中使用rand.seed()
函数来定义一个随机数,同时初始化一个名为b,长度为10,数据类型为int类型的数组使用for循环对该数组进行遍历,同时将随机数的值赋给b数组中元素。最终我们将数组sumArr中b的值赋给sum,调用函数进行打印输出sum的值
例题:数组元素匹配问题
找出数组中和为给定值的两个元素的下标,例如数组[1,3,5,8,7],
找出两个元素之和等于8的下标分别是(0,4)和(1,2)
求元素和,是给定的值
package main import "fmt" func myTest(a [5]int, target int) { // 遍历数组 for i := 0; i < len(a); i++ { other := target - a[i] // 继续遍历 for j := i + 1; j < len(a); j++ { if a[j] == other { fmt.Printf("(%d,%d)\n", i, j) } } } } func main() { b := [5]int{1, 3, 5, 8, 7} myTest(b, 8) }
根据题意,我们可以得知,在myTest
方法里面我们定义了一个名为a,长度为5,数据类型为int类型的数组,同时还定义了一个目标值target
用于检验元素和是否正确。
紧接着我们对该数组进行遍历,定义other
变量用于表示另一个数组元素,这里进行二次遍历的原因是因为本条题目需要匹配数组中两个元素的值,因此进行二次遍历匹配数组中i的值,一旦与other
匹配上,即打印输出该数组的值(两个元素) 。
我们在main
函数中对数组b进行变量初始化的赋值操作,以便进行方法的调用,如果在数组中能够找到myTest()
方法中的第二个,即target
元素,就打印输出这两个元素,反之则什么都不打印
今日总结
今天我们主要学习了Go语言在二维数组和遍历数组中的一些应用。如遍历数组的一个固定格式,亦或是数组的拷贝与传参,这些都值得读者去仔细推敲
加载全部内容