内存地址通过&
package mainimport "fmt"func main() {var arr [2][3]int16fmt.Println(arr)fmt.Printf("arr的地址是: %p \n", &arr)fmt.Printf("arr[0]的地址是 %p \n", &arr[0])fmt.Printf("arr[0][0]的地址是 %p \n", &arr[0][0])fmt.Printf("arr[1]的地址是 %p \n", &arr[1])fmt.Printf("arr[1][0]的地址是 %p \n", &arr[1][0])//赋值arr[0][0] = 47arr[0][1] = 23arr[1][1] = 45fmt.Println(arr)var arr4 [3][3]int = [3][3]int{{1, 2, 4}, {5, 8, 9}}fmt.Println(arr4)for key, value := range arr4 {for k, v := range value {fmt.Println("arr[%v][%v]=%v", key, k, v)}}fmt.Println()fmt.Println("=========")for i := 0; i < len(arr4); i++ {for j := 0; j < len(arr4[i]); j++ {fmt.Print(arr4[i][j], "\t")}fmt.Println()}
}
普通for循环和建值循环
array的内存分析
地址*2 int16
改数组里面的值是通过指针
package mainimport "fmt"func main() {//实现的功能 给出5个学生的成绩,求出成绩的总和,平局数score1 := 95score2 := 85score3 := 75score4 := 65score5 := 55sum := score3 + score5 + score4 + score1 + score2avg := sum / 5fmt.Println(avg)//150个学生//遍历数组:依次获取数组中的数据range 数组名:index,valuevar scores [5]intscores[0] = 95scores[1] = 85scores[2] = 77scores[3] = 33scores[4] = 66sumscor := 0for i := 0; i < len(scores); i++ {sumscor += scores[i]}avgs := sumscor / len(scores)fmt.Println(avgs)fmt.Println("打印数组-->>", scores)fmt.Printf("打印数组的地址 %p", &scores)fmt.Printf("打印数组的第1个地址 %p", &scores[0])fmt.Printf("打印数组的第2个地址 %p", &scores[1])fmt.Println()fmt.Println("<<<======>>>")//数组初始数据arr := [...]int{6, 2, 3, 4, 5}var arrs1 = [3]int{1, 2, 3}fmt.Println(arrs1)var arrs02 [3]int = [3]int{2, 6, 9}fmt.Println(arrs02)var arr4 = [...]int{2: 66, 0: 1, 3: 44}fmt.Println(arr4)for i := 0; i < len(arr); i++ {fmt.Print(arr[i], "\t")}//如果数组长度不确定,可以使用 ... 代替数组的长度,编译器会根据元素个数自行推断数组的长度://数组初始数据for i := 0; i < 10; i++ {//arr.}//rangesumrr := 0//对字符串 数组都可以遍历for _, value := range arr {fmt.Println(value)sumrr += value}fmt.Println(sumrr)var scorsnum [5]intfor i := 0; i < len(scorsnum); i++ {fmt.Println("开始录入")//录入值改变上边的值用&fmt.Scanln(&scorsnum[i])}fmt.Println(scorsnum)}
package mainimport "fmt"func main() {var arr1 = [3]int{3, 6, 9}fmt.Printf("数组的类型 %T", arr1)var arr2 = [4]int{3, 6, 9, 5}fmt.Printf("数组的类型 %T", arr2)var arr3 = [3]int{3, 6, 9}test1(&arr3)fmt.Println(arr3)arr3[0] = 8fmt.Println(arr3)
}//通过指针可以改数组的值
func test1(arr *[3]int) {(*arr)[0] = 7
}
二维数组内存分析
slice切片构建在数组之上的
package mainimport "fmt"func main() {var intarr [6]int = [6]int{1, 2, 3, 4, 5, 6}//切片是构建在数组之上的//[]动态变化的数组长度不写,int 类型 intarr是原数组//[1:3]切片 -切出的一段片段 - 索引:从1开始 到3结束slice := intarr[1:3]fmt.Println("intarr", intarr)fmt.Println("slice", slice)//切片元素个数fmt.Println("slice元素个数:", len(slice))//获取切片的容量,容量可以动态变化fmt.Println("slice的容量:", cap(slice))
}
切片和数组的地址是相同的
func main() {var intarr [6]int = [6]int{1, 2, 3, 4, 5, 6}//切片是构建在数组之上的//[]动态变化的数组长度不写,int 类型 intarr是原数组//[1:3]切片 -切出的一段片段 - 索引:从1开始 到3结束slice := intarr[1:3]fmt.Println("intarr", intarr)fmt.Println("slice", slice)//切片元素个数fmt.Println("slice元素个数:", len(slice))//获取切片的容量,容量可以动态变化fmt.Println("slice的容量:", cap(slice))fmt.Printf("数组中下标为1位置的地址 %p", &intarr[1])fmt.Printf("切片中下标为0位置的地址 %p", &slice[0])slice[1] = 16fmt.Println("intarr:", intarr)
}
切片的定义
切片可以动态扩容
切片的拷贝
//定义切片var a []int = []int{1, 2, 3, 45}//var b []int = make([]int, 10)//拷贝//将a中的对应数组元素赋值到b中对应的数组中copy(b, a)fmt.Println(b)
map
map创建的方式
//只声明map内存是没有分配空间//必须通过make函数进行初始化,才会分配空间var a map[int]string//map 可以存放10个键值对a = make(map[int]string, 10)a[200901] = "账上"a[200902] = "tom"fmt.Println(a)b := make(map[int]string)b[200901] = "账上"b[200902] = "tom"c := map[int]string{200901: "toms",200902: "too",}c[200] = "tt"
map增删改查
package mainimport "fmt"func printMap(cityMap map[string]string) {//cityMap 是一个引用传递for key, value := range cityMap {fmt.Println("key = ", key)fmt.Println("value = ", value)}
}func ChangeValue(cityMap map[string]string) {cityMap["England"] = "London"
}func main() {cityMap := make(map[string]string)//添加cityMap["China"] = "Beijing"cityMap["Japan"] = "Tokyo"cityMap["USA"] = "NewYork"//遍历printMap(cityMap)//删除delete(cityMap, "China")//修改cityMap["USA"] = "DC"ChangeValue(cityMap)fmt.Println("-------")//遍历printMap(cityMap)
}