码迷,mamicode.com
首页 > 编程语言 > 详细

Go数组

时间:2020-01-22 11:15:32      阅读:78      评论:0      收藏:0      [点我收藏+]

标签:数值   越界   一个   int   nbsp   +=   mat   函数   highlight   

1. 数组

技术图片

2. 数组的定义

技术图片

技术图片

 3. 数组的初始化

package main
import (
	"fmt"
)

func main() {

	var intArr [3]int //int占8个字节
	//当我们定义完数组后,其实数组的各个元素有默认值 0
	fmt.Println(intArr) //[0 0 0]
	intArr[0] = 10
	intArr[1] = 20
	intArr[2] = 30
	fmt.Println(intArr) //[10 20 30]
	fmt.Printf("intArr的地址=%p intArr[0] 地址%p intArr[1] 地址%p intArr[2] 地址%p\n",
		&intArr, &intArr[0], &intArr[1], &intArr[2])
	//intArr的地址=0xc000010360 intArr[0] 地址0xc000010360 intArr[1] 地址0xc000010368 intArr[2] 地址0xc000010370


	//四种初始化数组的方式
	var numArr01 [3]int = [3]int{1, 2, 3}
	fmt.Println("numArr01=", numArr01) //numArr01= [1 2 3]

	var numArr02 = [3]int{5, 6, 7}
	fmt.Println("numArr02=", numArr02) //numArr02= [5 6 7]

	//这里的 [...] 是规定的写法
	var numArr03 = [...]int{8, 9, 10}
	fmt.Println("numArr03=", numArr03) //numArr03= [8 9 10]

	var numArr04 = [...]int{1: 800, 0: 900, 2:999}
	fmt.Println("numArr04=", numArr04) //numArr04= [900 800 999]

	//类型推导
	strArr05 := [...]string{1: "tom", 0: "jack", 2:"mary"}
	fmt.Println("strArr05=", strArr05) //strArr05= [jack tom mary]
}

4. 数组的遍历

技术图片 

package main
import (
	"fmt"
)

func main() {

	//演示for-range遍历数组
	heroes  := [...]string{"宋江", "吴用", "卢俊义"}
	//使用常规的方式遍历,我不写了..

	for i, v := range heroes {
		fmt.Printf("i=%v v=%v\n", i , v)
		fmt.Printf("heroes[%d]=%v\n", i, heroes[i])
	}

	for _, v := range heroes {
		fmt.Printf("元素的值=%v\n", v)
	}
}

5. 数组注意事项

技术图片

package main
import (
	"fmt"
)

//函数
func test01(arr [3]int) {
	arr[0] = 88
}

//函数
func test02(arr *[3]int) {  // 此时的arr变成了指向数组的一个指针
	fmt.Printf("arr指针的地址=%p", &arr) //arr指针的地址=0xc00008e020
	(*arr)[0] = 88 //*arr 取值符
}

func main() {

	/*
	//数组是多个相同类型数据的组合,一个数组一旦声明/定义了,其长度是固定的, 不能动态变化。
	var arr01 [3]int
	arr01[0] = 1
	arr01[1] = 30
	//这里会报错
	arr01[2] = 1.1
	//其长度是固定的, 不能动态变化,否则报越界
	arr01[3] = 890

	fmt.Println(arr01)
	*/

	//数组创建后,如果没有赋值,有默认值(零值)
	//1. 数值(整数系列, 浮点数系列) =>0
	//2. 字符串 ==> ""
	//3. 布尔类型 ==> false

	var arr01 [3]float32
	var arr02 [3]string
	var arr03 [3]bool
	fmt.Printf("arr01=%v arr02=%v arr03=%v\n", arr01, arr02, arr03)
	//arr01=[0 0 0] arr02=[  ] arr03=[false false false]
	
	//数组的下标是从0开始的
	// var arr04 [3]string // 0 - 2
	// var index int = 3
	// arr04[index] = "tom" // 因为下标是 0 - 2 ,因此arr04[3]就越界

	//Go的数组属值类型, 在默认情况下是值传递, 因此会进行值拷贝。数组间不会相互影响
	// arr := [3]int{11, 22, 33}
	// test01(arr)
	// fmt.Println("main arr=", arr) //


	arr := [3]int{11, 22, 33}
	fmt.Printf("arr 的地址=%p\n", &arr) //arr 的地址=0xc000060160
	test02(&arr)
	fmt.Println("main arr=", arr) //main arr= [88 22 33]
}

6. 数组的应用

package main
import (
	"fmt"
	"math/rand"
	"time"
)

func main() {
	//1)创建一个byte类型的26个元素的数组,分别 放置‘A‘-‘Z‘。
	//使用for循环访问所有元素并打印出来。提示:字符数据运算 ‘A‘+1 -> ‘B‘
	//思路
	//1. 声明一个数组 var myChars [26]byte
	//2. 使用for循环,利用 字符可以进行运算的特点来赋值 ‘A‘+1 -> ‘B‘
	//3. 使用for打印即可
	//代码:
	var myChars [26]byte
	for i := 0; i < 26; i++ {
		myChars[i] = ‘A‘ + byte(i) // 注意需要将 i => byte
	}

	for i := 0; i < 26; i++ {
		fmt.Printf("%c ", myChars[i])
	}

	//2)请求出一个数组的最大值,并得到对应的下标
	//思路
	//1. 声明一个数组 var intArr[5] = [...]int {1, -1, 9, 90, 11}
	//2. 假定第一个元素就是最大值,下标就0
	//3. 然后从第二个元素开始循环比较,如果发现有更大,则交换
	fmt.Println()
	var intArr [6]int = [...]int {1, -1, 9, 90, 11, 9000}
	maxVal := intArr[0]
	maxValIndex := 0

	for i := 1; i < len(intArr); i++ {
		//然后从第二个元素开始循环比较,如果发现有更大,则交换
		if maxVal < intArr[i] {
			maxVal = intArr[i]
			maxValIndex = i
		}
	}
	fmt.Printf("maxVal=%v maxValIndex=%v\n\n", maxVal, maxValIndex)

	//3)请求出一个数组的和和平均值。for-range
	//思路
	//1. 就是声明一个数组  var intArr[5] = [...]int {1, -1, 9, 90, 11}
	//2. 求出和sum
	//3. 求出平均值
	//代码
	var intArr2 [5]int = [...]int {1, -1, 9, 90, 12}
	sum := 0
	for _, val := range intArr2 {
		//累计求和
		sum += val
	}
	//如何让平均值保留到小数.
	fmt.Printf("sum=%v 平均值=%v \n\n", sum, float64(sum) / float64(len(intArr2)))


	//5)要求:随机生成五个数,并将其反转打印
	//思路
	//1. 随机生成五个数 , rand.Intn() 函数
	//2. 当我们得到随机数后,就放到一个数组 int数组
	//3. 反转打印 , 交换的次数是  len / 2, 倒数第一个和第一个元素交换, 倒数第2个和第2个元素交换
	var intArr3 [5]int
	//为了每次生成的随机数不一样,我们需要给一个seed值
	len := len(intArr3)
	rand.Seed(time.Now().UnixNano())
	for i := 0; i < len; i++ {
		intArr3[i] = rand.Intn(100) //  0<=n<100
	}

	fmt.Println("交换前~=", intArr3)
	//反转打印 , 交换的次数是  len / 2, 
	//倒数第一个和第一个元素交换, 倒数第2个和第2个元素交换
	temp := 0  //做一个临时变量
	for i := 0; i < len / 2; i++ {
		temp = intArr3[len - 1 - i]
		intArr3[len - 1 - i] = intArr3[i]
		intArr3[i] = temp
	}
	fmt.Println("交换后~=", intArr3)
}

Go数组

标签:数值   越界   一个   int   nbsp   +=   mat   函数   highlight   

原文地址:https://www.cnblogs.com/yzg-14/p/12227671.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!