Go核心开发学习笔记(十七) —— 数组

数组与C差不多 array,切片是独有 slice

数组

  1. 数组在Golang中为值类型,定义方法如下:

var intArray [3]int //定义一个整型数组,包含三个元素,其中下标为0,1,2
var flArray [3]float64 //定义一个float64型数组,包含三个元素,初始值都是0
var intArray [3]int = [3]int{10,20,30} //定义一个整形数组,包含三个元素并赋值
var intArray [3]string = [3]string{“Kobe”,“Durant”,“James”} //定义一个字符串数组并赋值
var intArray [3]string = [3]string{0:“Kobe”:2:“Durant”:1:“James”} //定义一个字符串数组并赋值,通过下标表明对应的值是什么

var intArray [3]int
intArray[0] = 10
intArray[1] = 20
intArray[2] = 30 //或者这样赋值
var arr []int //!!!这个不是数组,是切片slice
var intArray1 = […]int{10,20,30} //让系统自己识别吧,跟函数中参数 args… 一样,三个点必不可少

  1. 数组在内存中开辟的一块儿连续的空间,具体每个元素根据数据类型占用内存大小决定,一个数组的地址就是数组a[0]的地址
    &intArray[0] == &intArray

  2. 数组遍历: for-range结构遍历
    for _ , value := range intArray {…} //这样遍历出数组的每一个元素

  3. 数组是多个相同类型数据的组合,一旦声明长度是固定的,不能动态变化

  4. 数组[]xx,xx既可以是值类型也可以是引用类型,但是要注意必须数据类型都一致,不能由不同的数据类型组成数组,即不可混用

  5. 数组的默认值:int 0; string “”; bool false

  6. 使用数组的步骤:
    (1) 声明一个数组变量并开辟连续内存空间
    (2) 为数组赋值
    (3) 使用数组

  7. 数组下标从0开始,必须使用[foo]xx foo-1个数的下标,如果越界使用则会panic (index out of range)

  8. 数组是属于值类型,默认情况下是值传递,因此会是值拷贝,数组间不会相互影响,调用数组变量修改变量数组中某个元素的值不会影响到原数组变量

  9. 如果希望通过被调用函数修改数组变量,那就直接赋予被调用函数指针数组变量,通过修改 *(array)[0] = xx 的方式改变数组变量

  10. Go中长度是数组类型的一部分,如果一个函数接收数组变量作为形参,那么实参一定要和形参对数组的长度一致,即[n]int中的n一定要等长

数组案例

案例一:创建一个26字母的byte类型数组,分别放置A-Z,使用for循环访问并将它们打印出来。

package main
import "fmt"
func main() {
	var myChars [26]byte
	for i := 0 ; i <= 25 ; i++ {
		myChars[i] = 'A' + byte(i)
	}
	for i := 0 ; i<= 25 ; i++ {
	fmt.Printf("%c",myChars)
	}
}

案例二:求一个数组中最大值那个数和下标

package main

import "fmt"

func main() {
	/*
	思路:一个数组中假设array[0]为最大,下标即为0,初始化变量值;
	      这时从数组中第二个数,也就是下标为1的数开始,for循环逐一比较,凡是比0大,那么我就直接修改初始值为当前下标和对应的值
	 */
	var array = [...]int{10,20,-1,90,220}
	maxValue := array[0]
	maxIndex := 0

	for i :=1 ; i < len(array) ; i++ {
		if maxValue < array[i] {
			maxValue = array[i]
			maxIndex = i
		}
	}
	fmt.Printf("最大值的下标为%v,最大值为%v",maxIndex,maxValue)
}

案例三:求一个数组中所有值的和,和平均值,for-range

package main

import "fmt"

func main() {
	/*
		只要要把遍历的数组中的值做一个累加即可
	*/
	var array = [...]int{10,20,-1,90,220}
	sum := 0
	for _ , value := range array {
		sum += value
	}
	fmt.Printf("和为%v\n",sum)
	fmt.Printf("平均数为%v\n",float64(sum) / float64(len(array)))  // 凡是涉及到平均值包含小数的情况,最后一定要保证除数和被除数都是一个数据类型
}

案例四:随机生成五个数,并将其反转打印

package main
import (
	"fmt"
	"math/rand"
	"time"
)
func main() {
	/*
	生成五个随机数需要使用rand.intn()函数,但由于存在seed不变情况,所以需要使用时间函数来使seed随时在变化,保证随机数每次不一致
	 */
	var intArray [5]int
	//记得seed变化一定是纳秒最好,因为秒有些时候因为操作在1秒内,完全有可能一致,所以Unix()不推荐
	rand.Seed(time.Now().UnixNano())
	for i := 0 ; i < len(intArray) ; i++ {
		intArray[i] = rand.Intn(100)
	}
	fmt.Println(intArray)

	/*
	交换次数: len(intArray) / 2  无论奇数还是偶数,因为整数的除法是取模
	 */
	temp := 0
	for i := 0 ; i < len(intArray) / 2 ; i++ {
		temp = intArray[len(intArray) - 1 - i]
		intArray[len(intArray) - 1 - i] = intArray[i]
		intArray[i] = temp
	}
	fmt.Println(intArray)
}
发布了50 篇原创文章 · 获赞 18 · 访问量 4012

猜你喜欢

转载自blog.csdn.net/weixin_41047549/article/details/89819944