package main
import (
"fmt"
)
// go语言的切片与范围Range与map
// go语言的切片是对数组的抽象,所以切片就可认为是动态数组
// go语言中的数组长度不可变,但是切片比较灵活,长度不固定,可以追加元素,追加元素后切片容量增大
// go语言中的range关键字用于for循环中迭代遍历数组array、切片slice、链表channel和集合map的元素。
/*
数组和切片中range返回值包含数组切片的元素下标以及元素值,
在集合map中返回key和value即键值对如apple->2
也可直接遍历一个字符串,这样返回值为字符下表和字符的unicode值
*/
//Map 是一种无序的键值对的集合。Map最重要的一点是通过key来快速检索数据,key类似于索引,指向数据的值。
//Map 是一种集合,所以我们可以像迭代数组和切片那样迭代它。不过,Map是无序的,我们无法决定它的返回顺序,这是因为Map是使用hash表来实现的
/*
声明变量,默认 map 是 nil
var map名 map[键的类型] 键值对值的类型
使用 make 函数
map名 = make(map[键值对键的类型] 键值对值的类型)
*/
func aboutRange () {
var sum int = 0
nums := [8]int{2, 3, 12, 4, 5, 6, 1, 7}
for i, number := range nums {
sum += number
fmt.Println(i, ":", number)
}
fmt.Println(sum)
mm := map [string] int {"apple": 1, "banana":5, "watermelon":3}
for name, number := range mm {
fmt.Println(name, ":", number)
}
// 再添加一个键值对
mm["melon"] = 10
for name, number := range mm {
fmt.Println(name, ":", number)
}
nn, iss := mm["pear"]
if(iss){
fmt.Println("梨存在", nn)
}else{
fmt.Println("梨不存在")
}
//删除其中一个元素
delete(mm, "melon")
for name, number := range mm {
fmt.Println(name, ":", number)
}
}
func main(){
var a = [5]int {1, 2, 3, 7, 4}
// 切片的定义:声明一个未指定大小的数组
// var 切片名 []类型 = make([]类型, 数组长度即切片的初始长度) var s []type = make([]type, len)
// 切片名 := make([]类型, 数组长度即切片的初始长度, 切片容量) s := make([]T, length, capacity)
// 可以通过内置函数make()初始化切片
// 切片初始化
s := [] int {1, 2, 3} //直接初始化切片,[]表示是切片类型,{1,2,3}初始化值依次是1,2,3.其cap=len=3
s1 := a[:] ///初始化切片s1,是数组a的引用
s2 := a[1:2] //s2切片是从第二个元素开始到第三个元素
/*
s := a[startIndex:endIndex]
将arr中从下标startIndex到endIndex-1下的元素创建为一个新的切片
缺省endIndex时将表示一直到arr的最后一个元素
缺省startIndex时将表示从arr的第一个元素开始
*/
/*
len():获取切片长度
cap():获取测量切片最长可以达到多少,即计算切片容量
*/
fmt.Println("切片s的长度:", len(s))
fmt.Println("切片s的容量:", cap(s))
fmt.Println("切片s的长度:", len(s1))
fmt.Println("切片s的容量:", cap(s1))
fmt.Println("切片s的长度:", len(s2))
fmt.Println("切片s的容量:", cap(s2))
// 空切片 nil
// 一个切片在未初始化前默认为nil,长度为0
var emptys []int
if(emptys == nil){
fmt.Println("切片是空的")
fmt.Println("切片长度:", len(emptys), "切片容量:", cap(emptys),"切片:", emptys)
}
/*
切片是空的
切片长度: 0 切片容量: 0 切片: []
*/
// 切片截取
fmt.Println("原切片s:", s1)
fmt.Println("截取切片到第三个s:", s1[:2])
fmt.Println("截取切片从第三个开始s:", s1[2:])
fmt.Println("截取切片从第三个到第四个s:", s1[2:3])
/*
原切片s: [1 2 3 7 4]
截取切片到第三个s: [1 2]
截取切片从第三个开始s: [3 7 4]
截取切片从第三个到第四个s: [3]
*/
fmt.Println("原切片s:", s)
for i := 1; i < 4; i++ {
s = append(s, i) //逐个添加,也可以一次添加s = append(s, 1, 2, 3)
}
fmt.Println("添加多个元素后切片s:", s)
ss := make([]int, len(s), (cap(s))*2)
copy(ss, s)
fmt.Println("创建了s的二倍切片ss并赋值s的值与长度后s:", ss)
/*
原切片s: [1 2 3]
添加多个元素后切片s: [1 2 3 1 2 3]
创建了s的二倍切片ss并赋值s的值与长度后s: [1 2 3 1 2 3]
*/
aboutRange()
}
【Golang】9.用代码形式总结go的切片Slice与范围Range与集合Map
最新推荐文章于 2023-11-13 22:22:18 发布