Golang数据类型 数组(arry)

前言

前面学习了Go数据类型中的数字、字符串,下面看看Go中是否有Python中的list、dict等复合数据类型?

需要注意的是在Go中数组是值类型,而切片是引用类型

package main

import "fmt"

func main() {
	//声明1个字符串变量
	var name string
	fmt.Println(name)
	//声明1个数组变量
	var a1 [3]int
	fmt.Println(a1)
	//声明1个切片类型的变量
	var s1 []int
	fmt.Println(s1 == nil)
	//声明二维数组
	var a3 [3][3]int
	//对二维数组进行初始化
	a3 = [3][3]int{
		[3]int{1, 2, 3},
		[3]int{4, 5, 6},
		[3]int{7, 8, 8},
	}
	fmt.Println(a3)
	//
	a4 := [3]int{1, 2, 3}
	a5 := modifyArry(a4)
	fmt.Println(a4)
	fmt.Println(a5)
	s2 := []string{"河北", "保定", "唐县"}
	s3 := modifySlice(s2)
	fmt.Println(s2)
	fmt.Println(s3)

}

//数组是值类型:修改数组时,会复制 1个新的数组让我们修改
func modifyArry(a1 [3]int) (ret [3]int) {
	a1[0] = 100
	return a1
}

//切片是引用类型:修改切片时,不会复制1个新的切片让我们修改(修改原来的)
func modifySlice(s2 []string) (ret2 []string) {
	s2[0] = "河北省"
	return s2
}

  

数组

数组就是存放同1种数据基本数据类型(数值,字符、字符串、布尔值)元素的容器。

Go中的数组有一下特点:

在声明arry变量时就要声明arry的长度、容器内存放元素的数据类型;

数组的长度是数据类型的1部分,所以2个长度不同arrr,即使他们都属于数组,但2者的数据类型完全不一致,所以2者无法相互比较和赋值。

数组如果没有初始化里面的元素默认为0值(bool=false,int or float=0, string=空字符串)

数组的声明和初始化

package main

import "fmt"

func main() {
	//数组:存放同1中基础数据类型的容器
	//声明1个长度为3的数组,里面存放bool数据类型
	var arry1 [3]bool
	var arry2 [4]bool
	var arry3 [3]bool
	fmt.Printf("arry1:%T arry2:%T arry3:%T
", arry1, arry2, arry3)
	fmt.Println(arry1 == arry3)
	//初始化方式1:
	arry1 = [3]bool{true, true, true}
	fmt.Println(arry1) //[true true true]
	//初始化方式2:[...]自动推算数组的长度
	arry4 := [...]int{1, 2, 3, 4}
	fmt.Println(arry4)
	//初始化方式3:利用默认值
	arry5 := [5]int{12, 13}
	fmt.Println(arry5) //[12 13 0 0 0]
	//初始化方式4:根据索引指定arry中的元素
	arry6 := [5]int{0: 1, 4: 6}
	fmt.Println(arry6)//[1 0 0 0 6]

}

  

遍历数组

//遍历数组
package main

import (
	"fmt"
)

func main() {
	//根据索引访问元素
	var cities = [...]string{"北京", "上海", "深圳"}
	for i := 0; i < len(cities); i++ {
		fmt.Printf("%s
", cities[i])
	}

	//遍历数组
	for i, v := range cities {
		fmt.Println(i, v)
	}

}

  

多维数组

多维数组就是数组里面嵌套数组

package main

import (
	"fmt"
)

func main() {
	//定义多维数组
	a1 := [3][2]int{{1, 2}, {1, 3}, {1, 4}}
	fmt.Println(a1) //[[1 2] [1 3] [1 4]]
	//遍历多维数组
	for _, v := range a1 {
		for _, v1 := range v {
			fmt.Println(v1)
		}
	}

}

Go中多维数组是数值类型不是引用类型

 值类型:就是重新开辟新的内存,与引用类型相反

package main

import (
	"fmt"
)

func main() {
	//arry数值类型辩证
	a1 := [...]string{"河北", "河南", "山东"}
	a2 := a1
	a1[len(a1)-1] = "山西"
	fmt.Println(a1) //[河北 河南 山西]
	fmt.Println(a2) //[河北 河南 山东]

}

  

 练习题

package main

import (
	"fmt"
)

func main() {
	//1.求数组[1, 3, 5, 7, 8]所有元素的和
	arr1 := [...]int{1, 3, 5, 7, 8}
	var sum int
	for _, v := range arr1 {
		sum += v
	}
	fmt.Println(sum)
	/*找出数组中和为指定值的两个元素的下标,比如从数组[1, 3, 5, 7, 8]中找出和为8的两个元素的下标分别为(0,3)和(1,2)*/
	for i := 0; i < len(arr1); i++ {
		for j := i + 1; j < len(arr1); j++ {
			if arr1[i]+arr1[j] == 8 {
				fmt.Printf("%d %d
", i, j)
			}
		}
	}

}

see also

原文地址:https://www.cnblogs.com/sss4/p/12550517.html