首页 > 其他分享 >golang 数组

golang 数组

时间:2023-02-19 15:57:37浏览次数:40  
标签:数组 int fmt golang arr4 arr1 Printf

1. 概念

golang中的数组是具有固定长度及相同数据类型的序列集合

2. 初始化数组

var 数组名 [数组大小]数据类型

package main

import "fmt"

func main() {
	//第一种
	var arr1 [3]int = [3]int{1, 2, 3}//指定数组长度为3,指定3个值初始化
	//var arr1 = [3]int{1, 2, 3} //可以省略[3]int
	fmt.Printf("arr1的类型为%T\n", arr1)
	fmt.Println("arr1的值为:", arr1)

	//第二种
	var arr2 = [...]int{1, 2, 3, 4, 5} //数组长度位置为“...”,则表示数组的长度是根据初始值的长度确定的
	fmt.Printf("arr2的类型为%T\n", arr2)
	fmt.Println("arr2的值为:", arr2)
	
	//第三种
	var arr3 = [...]int{0: 1, 3: 4, 5: 6} //对下标0赋值1,对下标3赋值4,对下标5赋值6
	fmt.Printf("arr3的类型为%T\n", arr3)
	fmt.Println("arr3的值为:", arr3)

	//第四种
	var arr4 [4]string //定义一个长度为4的空数组
	arr4[0] = "1.23"   //按照下标赋值
	arr4[3] = "4.46"   //没有赋值的下标对应数组指定数据类型的默认值
	fmt.Printf("arr4的类型为%T\n", arr4)
	fmt.Println("arr4的值为:", arr4)
}

输出结果

arr1的类型为[3]int
arr1的值为: [1 2 3]      
arr2的类型为[5]int       
arr2的值为: [1 2 3 4 5]  
arr3的类型为[6]int       
arr3的值为: [1 0 0 4 0 6]
arr4的类型为[4]string    
arr4的值为: [1.23   4.46]

3. 数组内存分析

数组下标的内存下标地址的计算为: 0x+数组内存地址+数组的下边*数组数据类型占用的字节数

package main

import "fmt"

func main() {
	var arr1 [3]int32
	//%p表示为十六进制,并加上前导的0x
	fmt.Printf("arr1数组的内存地址为:%p\n", &arr1)       //0xc00009e070
	fmt.Printf("arr1[0]数组的内存地址为:%p\n", &arr1[0]) //0xc00009e070 = 0x+c00009e070+0*4
	fmt.Printf("arr1[1]数组的内存地址为:%p\n", &arr1[1]) //0xc00009e074 = 0x+c00009e070+1*4
	fmt.Printf("arr1[2]数组的内存地址为:%p\n", &arr1[2]) //0xc00009e078 = 0x+c00009e070+2*4
}

输出结果

arr1数组的内存地址为:0xc00009e070
arr1[0]数组的内存地址为:0xc00009e070
arr1[1]数组的内存地址为:0xc00009e074
arr1[2]数组的内存地址为:0xc00009e078

4. 遍历数组

4.1 for循环遍历

package main

import "fmt"

func main() {
	var arr4 = [5]int{10, 20, 30, 40, 50} //定义数组arr4长度为5,初始化值为10,20,30,40,50
	for i := 0; i < len(arr4); i++ {      //i为arr4的数组下标,从0开始,到len(arr4)=5结束,每次加1
		fmt.Printf("arr4[%d]的值为:%v\n", i, arr4[i])
	}
}

输出结果

arr4[0]的值为:10
arr4[1]的值为:20
arr4[2]的值为:30
arr4[3]的值为:40
arr4[4]的值为:50

4.2 for range遍历

package main

import "fmt"

// for range遍历
func main() {
	var arr5 = [5]string{"a", "b", "c", "d", "e"}
	for key, val := range arr5 { //key为数组的下标,val为下标对应的值
		fmt.Printf("arr4[%d]的值为:%v\n", key, val)
	}
}

输出结果

arr4[0]的值为:a
arr4[1]的值为:b
arr4[2]的值为:c
arr4[3]的值为:d
arr4[4]的值为:e

5. 数组注意点

5.1 数组定义的长度属于数据类型的一部分

如长度为3的int类型数组:[3]int和长度为6的int类型数组:[6]int的类型是不一样的

package main

import "fmt"

func main() {
	var arr1 [3]int
	var arr2 [6]int
	fmt.Printf("数组arr1的类型为:%T\n", arr1)
	fmt.Printf("数组arr1的类型为:%T", arr2)
}

输出结果

数组arr1的类型为:[3]int
数组arr1的类型为:[6]int

5.2 数组是值类型而不是引用类型。这意味着当数组变量被赋值时,将会获得原数组的拷贝。新数组中元素的改变不会影响原数组中元素的值。

package main

import "fmt"

func test(arr1 [3]int) { //定义test函数,指定传入参数为[3]int数组
	arr1[0] = 10 //修改传入数组的下标为0的值为10
	fmt.Printf("test函数中的arr1数组的值为:%v", arr1) 
}
func main() {
	var arr2 = [3]int{1, 2, 3}
	test(arr2)
	fmt.Println() //换行
	fmt.Printf("main函数中的arr2数组的值为:%v", arr2)
}

输出结果

test函数中的arr1数组的值为:[10 2 3]
main函数中的arr2数组的值为:[1 2 3]

5.3 其它函数中,去修改原来的数组,可以使用指针方式。

package main

import "fmt"

func test1(arr *[3]int) { //定义test函数,指定传入参数为[3]int内存地址
	arr[0] = 10 //修改内存地址下标为0的值为10
}
func main() {
	var arr3 = [3]int{1, 2, 3}
	test1(&arr3) //将数组的内存地址传进去
	fmt.Printf("main函数中的arr3数组的值为:%v", arr3)
}

输出结果

main函数中的arr3数组的值为:[10 2 3]

6. 二维数组

6.1 二维数组赋值

var 数组名 [一维数组大小][二维数组大小]数据类型

package main

import "fmt"

func main() {
	//第一种
	var arr1 [2][4]int = [2][4]int{{1, 2, 3, 4}, {5, 6, 7, 8}} //一维数组长度为2,传入两个数组,二维数组长度为4,传入的数值个数为4
	//var arr1 = [2][4]int{{1, 2, 3, 4}, {5, 6, 7, 8}} //省略[2][4]int
	fmt.Printf("二维数组arr1的值为:%v\n", arr1)
	fmt.Printf("二维数组arr1的值为:%T\n", arr1)
	//第二种
	var arr2 = [...][2]int{{0, 1}, {2, 3}, {4, 5}} //按传入的二维数组个数指定一位数组的长度,二维数组的长度为2
	fmt.Printf("二维数组arr2的值为:%v\n", arr2)
	fmt.Printf("二维数组arr2的类型为:%T\n", arr2)
	//第三种
	var arr3 = [...][3]int{0: {1, 2, 3}, 4: {7, 8, 9}} //按照下标给二维数组赋值,没赋值的按照数组类型的默认值
	fmt.Printf("二维数组arr3的值为:%v\n", arr3)
	fmt.Printf("二维数组arr3的类型为:%T\n", arr3)
	//第四种
	var arr4 [4][2]int
	fmt.Printf("赋值前二维数组arr4的值为:%v\n", arr4)
	arr4[1][1] = 10
	arr4[2][0] = 111
	arr4[0][1] = 50
	arr4[0][0] = 40
	fmt.Printf("赋值后二维数组arr4的值为:%v\n", arr4)
	fmt.Printf("二维数组arr4的类型为:%T\n", arr4)
}

输出结果

二维数组arr1的值为:[[1 2 3 4] [5 6 7 8]]
二维数组arr1的值为:[2][4]int                                
二维数组arr2的值为:[[0 1] [2 3] [4 5]]                      
二维数组arr2的类型为:[3][2]int                              
二维数组arr3的值为:[[1 2 3] [0 0 0] [0 0 0] [0 0 0] [7 8 9]]
二维数组arr3的类型为:[5][3]int                              
赋值前二维数组arr4的值为:[[0 0] [0 0] [0 0] [0 0]]          
赋值后二维数组arr4的值为:[[40 50] [0 10] [111 0] [0 0]]     
二维数组arr4的类型为:[4][2]int 

6.2 二维数组内存

package main

import "fmt"

func main() {
	var arr1 = [2][2]int32{{0, 1}, {2, 3}}
	fmt.Println(arr1)
	fmt.Printf("arr1的内存地址为:%p\n", &arr1)             //0xc00001c0d0
	fmt.Printf("arr1[0]的内存地址为:%p\n", &arr1[0])       //0xc00001c0d0
	fmt.Printf("arr1[0][0]的内存地址为:%p\n", &arr1[0][0]) //0xc00001c0d0
	fmt.Printf("arr1[0][1]的内存地址为:%p\n", &arr1[0][1]) //0xc00001c0d4(int32为4个字节,所以最后一位为二维数组第二个下标*字节=1*4=4)
	fmt.Printf("arr1[1]的内存地址为:%p\n", &arr1[1])       //0xc00001c0d8(在上一个内存地址最后一位加上占用的4字节)
	fmt.Printf("arr1[1][0]的内存地址为:%p\n", &arr1[1][0]) //0xc00001c0d8
	fmt.Printf("arr1[1][0]的内存地址为:%p\n", &arr1[1][1]) //0xc00001c0dc(在上一个内存地址最后一位加上占用的4字节)
}

输出结果

[[0 1] [2 3]]
arr1的内存地址为:0xc00001c0d0      
arr1[0]的内存地址为:0xc00001c0d0   
arr1[0][0]的内存地址为:0xc00001c0d0
arr1[0][1]的内存地址为:0xc00001c0d4
arr1[1]的内存地址为:0xc00001c0d8   
arr1[1][0]的内存地址为:0xc00001c0d8
arr1[1][0]的内存地址为:0xc00001c0dc

6.3 遍历二维数组

6.3.1 for循环遍历

package main

import "fmt"

func main() {
	var arr1 = [2][4]int{{0, 1, 2, 3}, {4, 5, 6, 7}}
	for i := 0; i < len(arr1); i++ { //len(arr1)获取的为二维数组的长度为2,循环两次
		for j := 0; j < len(arr1[i]); j++ { //len(arr1[i])获取的为二维数组中的一维数组的长度为4,循环4次
			fmt.Printf("arr1[%v][%v]的值为:%v\n", i, j, arr1[i][j])
		}
	}
}

输出结果

arr1[0][0]的值为:0
arr1[0][1]的值为:1
arr1[0][2]的值为:2
arr1[0][3]的值为:3
arr1[1][0]的值为:4
arr1[1][1]的值为:5
arr1[1][2]的值为:6
arr1[1][3]的值为:7

6.3.2 for range遍历

package main

import "fmt"

func main() {
	var arr2 = [2][4]int{{0, 1, 2, 3}, {4, 5, 6, 7}}
	for key1, val1 := range arr2 { //循环二维数组,key1位数组下标,为0,1,val1位二维数组中的一维数组的值{0, 1, 2, 3}, {4, 5, 6, 7}
		for key2, val2 := range val1 { //循环一维数组,key2位数组的下标为0,1,2,3,val2位一维数组中的值
			fmt.Printf("arr1[%v][%v]的值为:%v\n", key1, key2, val2)
		}
	}
}

输出结果

arr1[0][0]的值为:0
arr1[0][1]的值为:1
arr1[0][2]的值为:2
arr1[0][3]的值为:3
arr1[1][0]的值为:4
arr1[1][1]的值为:5
arr1[1][2]的值为:6
arr1[1][3]的值为:7

标签:数组,int,fmt,golang,arr4,arr1,Printf
From: https://www.cnblogs.com/LI-XinYu/p/17133638.html

相关文章

  • Golang字符串拼接
    使用+funcplusConcat(nint,strstring)string{ s:="" fori:=0;i<n;i++{ s+=str } returns}使用fmt.SprintffuncsprintfConcat(nint,str......
  • Golang基础-Switch
    不需要手动breakdefault是找不到case时执行可以对多个case执行同样的操作operatingSystem:="windows"switchoperatingSystem{case"windows","linux"://......
  • golang for 循环
    1.for循环for循环是Golang唯一的循环语句。for初始表达式;布尔表达式;迭代因子{循环体;}packagemainimport"fmt"funcmain(){ fori:=0;i<5;i++{......
  • 【算法】数组的前缀和 Prefix Sum
    算法中有前缀和这样一种很好的数据结构,它能极大地降低区间查询的时间复杂度前缀和-PrefixSum 它是这样的,假如有这样一个数组(序列), A=[a1,a2,a3,a4,a5,a6,......
  • golang 单测运行单个函数、文件、跳过文件命令
    1、单测运行1.2运行某个单测函数gotest-v-run=xxx,xxx是函数名,支持正则表达式;参数-v说明需要打印详情提示Golang单测是根据前缀匹配来执行的,gotest-v-run=......
  • 4. 寻找两个正序数组的中位数
    给定两个大小分别为m和n的正序(从小到大)数组 nums1和 nums2。请你找出并返回这两个正序数组的中位数。算法的时间复杂度应该为O(log(m+n))。 题解:采用了遍......
  • F - 树状数组 2【GDUT_22级寒假训练专题五】
    F-树状数组2原题链接思路在树状数组1中我们可以得知单点修改,区间查询(区间和)对原数组进行单点修改,对区间和进行树状数组维护利用差分和前缀和我们可以推导出区......
  • LeetCode-53. 最大子数组和(Java)
    一、前言:......
  • E - 树状数组 1【GDUT_22级寒假训练专题五】
    E-树状数组1原题链接题意已知一个数列,你需要进行下面两种操作:将某一个数加上\(x\)求出某区间每一个数的和lowbit函数定义一个函数\(f=lowbit(x)\),这个函......
  • 代码随想录算法训练营day23 | leetcode 669. 修剪二叉搜索树 ● 108.将有序数组转换
    LeetCode669.修剪二叉搜索树分析1.0递归遍历树时删除符合条件(不在区间中)的节点-如何遍历如何删除如果当前节点大于范围,递归左树,反之右树当前节点不在范围内,删除它,把......