【Golang】9.用代码形式总结go的切片Slice与范围Range与集合Map

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()

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值