Go基础 数组 切片 Map

数组

数组介绍

数组可以存放多个同一类型数据 数组也是一种数据类型 在Go 中数组是指类型

案例

package main

import "fmt"

func main() {
	// 计算 6个人 平均体重 以及体重总和
	var person [6]float64
	person[0] = 98
	person[1] = 90
	person[2] = 91
	person[3] = 3
	person[4] = 4
	person[5] = 96
	// 计算平均体重
	sum := 0.0
	for i := range person {
		sum += person[i]
	}
	sprintf := fmt.Sprintf("%.2f", sum/float64(len(person)))
	fmt.Printf("avg=%v", sprintf)
}

数组的使用

访问数组元素

数组名【下标】比如 你要使用a 数组的第三个的第三个元素 a[2]

入门案例
package main

import "fmt"

func main() {
	//终端循环输入 5个成绩 保存到 float 64 数组
	var scorearr [5]float64
	for i := 0; i < len(scorearr); i++ {
		fmt.Printf("请输入第%d个学生成绩", i+1)
		fmt.Scanln(&scorearr[i])

	}
	for i := 0; i < len(scorearr); i++ {
		fmt.Print(scorearr[i])
	}
}

初始化数组的方式

package main

func main() {
	// 数组初始化的方式
	var numArr01 [3]int = [3]int{1, 2, 3}
	println(numArr01)

	var numArr02 = [3]int{1, 6, 3}
	println(numArr02)

	var numArr03 = [...]int{1, 6, 3}
	println(numArr03)

	var numArr04 = [...]int{1: 800, 0: 99, 2: 44}
	println(numArr04)
}

遍历数组的方式

package main

import "fmt"

func main() {
	// 数组初始化的方式
	names := [...]string{"娇娇", "Amy", "小张"}
	// for range 遍历
	for i, name := range names {
		// 第一个返回值 index 是数组的下标
		// 第二个 value 是在 该下标位置的值
		// 他们都是在 for 内部的局部变量
		// 遍历数组元素的时候 不想要 index 可以用下划线代替
		fmt.Printf("i=%v  name=%v \n", i, name)
	}

}

数组使用的时候注意细节

1,数组是多个相同类型数据的组合 一个数组一旦声明、定义 长度是固定的 不能动态变化了
2,var arr[] int 这时就是一个 slice 切片
3,数组中的元素类型 值类型 和引用类型 不能一块使用
4)数组创建后,如果没有赋值,有默认值(零值)数值类型数组:默认值为0字符串数组:默认值为""bool数组:默认值为false
5)使用数组的步骤1.声明数组并开辟空间给数组各个元素赋值3使用数组6)数组的下标是从o开始的。
7)数组下标必须在指定范围内使用,否则报panic:数组越界,比如var arr [5]int则有效下标为0-4
8)Go的数组属值类型,在默认情况下是值传递,因此会进行值拷贝。数组间不会相互影响

切片

切片的基本介绍

1)切片的英文是slice
2)切片是数组的一个引用,因此切片是引用类型,在进行传递时,遵守引用传递的l机制。
3)切片的使用和数组类似,遍历切片、访问切片的元素和求切片长度len(slice)都一样。
4)切片的长度是可以变化的,因此切片是一个可以动态变化数组。
5)切片定义的基本语法:
var变量名[类型
比如: var a [] int

package main

import "fmt"

func main() {
	// 切片的基本使用
	var intArr [5]int = [...]int{1, 2, 4, 5, 6}
	// 声明、定义 一个切片
	//intArr[1:3] 表示的是 引用数组intArr
	// 引用 数组的起始下标为1 最后的下标为 3 (不包括3)
	slice := intArr[1:3]
	fmt.Println(slice)
	fmt.Println(len(slice))
	fmt.Println(cap(slice))

}

切片的三种方式

方式一

定义一个切片,然后让切片去引用一个已经创建好的数据

package main

import "fmt"

func main() {
	// 切片的基本使用
	var intArr [5]int = [...]int{1, 2, 4, 5, 6}
	// 声明、定义 一个切片
	//intArr[1:3] 表示的是 引用数组intArr
	// 引用 数组的起始下标为1 最后的下标为 3 (不包括3)
	slice := intArr[1:3]
	fmt.Println(slice)
	fmt.Println(len(slice))
	fmt.Println(cap(slice))

}

方式二

通过make 来创建切片

package main

import "fmt"

func main() {
	// 切片的基本使用
	//var intArr [5]int = [...]int{1, 2, 4, 5, 6}
	// 声明、定义 一个切片 参数说明: type:就是数据类型len:大小cap :指定切片容量,
	ints := make([]int, 3, 9)
	ints[0] = 80
	ints[1] = 80
	ints[2] = 80
	fmt.Println(ints)
}

方式三

定义一个切片直接就指定具体数据使用原理类似于make的方式

package main

func main() {
	var slice []int = []int{1, 3, 5}
	println(slice)
}

切片注意事项和细节说明

切片初始化时var slice = arr[startlndex:endIndex]
说明:从arr数组下标为startlndex,取到下标为endIndex的元素(不含arr[endIndex])。
切片初始化时,仍然不能越界。范围在[O-len(arr)]之间,但是可以动态增长
.1) var slice = arr[0:end]可以简写var slice = arr[:end]
2) var slice = arr[start:lep(arr)]可以简写: var slice = arr[start:]
3) var slice = arr[O:len(arr)]可以简写: var slice = arr[:]
cap是一个内置函数,用于统计切片的容量,即最大可以存放多少个元素。
切片定义完后,还不能使用,因为本身是一个空的,需要让其引用到一个数组,或者make一个空间供切片来使用
切片可以继续切片

Map

map的声明
基本语法
var map变量名map[keytype]valuetypekey可以是什么类型
golang中的map,的 key可以是很多种类型,比如 bool,数字,string,指针,channel ,还可以是只包含前面几个类型的接口,结构体,数组
通常为int .string
注意: slice,map还有function不可以,因为这几个没法用==来判断

package main

import "fmt"

func main() {
	// 方式一 声明一个map
	var mapdemo map[int]string
	mapdemo = make(map[int]string, 10)
	mapdemo[1] = "娇娇"
	mapdemo[2] = "小张"
	fmt.Println(mapdemo)
	// 方式二
	m := make(map[int]string)
	m[1] = "娇娇"
	m[2] = "小张"
	// 方式三
	m1 := map[int]string{
		1: "ee",
		2: "ee",
	}
	fmt.Println(m1)
}


案例

用map 存放学生学号姓名和年龄

package main

import "fmt"

func main() {
	m := make(map[int]map[string]int)
	m[1] = map[string]int{
		"娇娇":   18,
		"amy":  18,
		"kiko": 18,
	}
	for i, m2 := range m {
		fmt.Printf("学生的学号为:%v \n ", i)
		for s, i2 := range m2 {
			fmt.Printf("学生的姓名为:%v \n ", s)
			fmt.Printf("学生的年龄为:%v \n ", i2)
		}

	}
}

map的切片

基本介绍

切片的数据类型如果是map,则我们称为slice of map,map切片,这样使用则map个数就可以动态变化了。

// 要求:使用一个map来记录monster的信息name和 age,也就是说一个monster对应一个map.并且妖怪的个数可以动态的增加=>map切片
func Monster() []map[string]string {
	// 创建一个 空的map
	m := make([]map[string]string, 2)
	m[0] = make(map[string]string)
	m[0]["name"] = "悟空"
	m[0]["age"] = "19"

	m[1] = make(map[string]string)
	m[1]["name"] = "悟空1"
	m[1]["age"] = "191"
	// 此时想童泰添加 必须append

	m2 := make(map[string]string)
	m2["name"] = "dddd"
	m2["age"] = "22"

	m = append(m, m2)

	return m
}

	
func main() {
	monster := Monster()
	for _, m := range monster {
		fmt.Println(m)

	}
	}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值