• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

go-切片slice

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
  • 其本身并不是数组,它指向底层的数组
  • 作为边长数组的替代方案,可以关联底层数组的局部或全部
  • 为引用类型
  • 可以直接创建或从低产能数组获取生成
  • 使用len()获取元素个数,cap()获取容量
  • 一般使用make()创建
  • 如果多个slice指向相同底层数组,其中一个的值改变会影响全部
  • make([]type,len,cap)
  • 其中cap可以省略,则和len相同
//第一种声明方式

package main import "fmt" func main() { var s1 []int //[]为指定size,则创建的是一个slice类型,并不是数组 fmt.Println(s1) //[]
     a := [10]int{}
   fmt.Println(a)
    s2 := a[5:10] //切片方法与python类似
    fmt.Println(s2) //[0 0 0 0 0]
}

  

//第二种声明方式
package main import "fmt" func main() { s1 := make([]int,3,10) //10表示数组容量,表示10个连续内存块,如果超过容量,容量会自动扩容2倍,会重新分配20个内存块 fmt.Println(s1,len(s1),cap(s1)) //[0 0 0] 3 10 }

  

 slice与低产能数组的对应关系

    

 

package main

import "fmt"

func main()  {
	a := []string{"a","b","c","d","e","f","g","h","i","j","k"}
	sa := a[2:5]
	fmt.Println(len(sa),cap(sa))   //3 9   
	sb := sa[1:3]    //索引不能超过slice的cap值
	fmt.Println(sb)
}

  注意:如果slice追加的元素超过slice容量,则内存地址发生变化,slice数组改变不再影响slice后的数组

 

Reslice

  • Reslice时索引以被slice的切片为准

  • 索引不可以超过被slice的切片的容量cap()值

  •  索引越界不会导致底层数组的重新分配而是引发错误

Append

  • 可以在slice尾部追加元素
  • 可以将一个slice追加在另一个slice尾部
  • 如果最终长度未超过追加到slice的容量则返回原始slice
  • 如果超过追加到的slice的容量则将重新分配数组并拷贝原始数据

Copy

package main

import "fmt"

func main()  {
	s1 := []int{1,2,3,4,5}
	s2 := []int{6,7,8}
	copy(s1,s2)   //s2为被拷贝元素,以短的slice为准,s1可以通过[:]来指定copy到的放置位置
	fmt.Println(s1)   //[6 7 8 4 5]
}

  

map

  • 类似其他语言中的哈希表或者字典,以key-value形式存储数据
  • key必须是支持==或!=比较运算的类型,不可以是函数、map或slice
  • map查找比现行搜索快很多,但比使用索引访问数据的类型慢100倍
  • Map使用make()创建,支持:=这种简写方式
  • make([keyTyep]valueType,cap)cap表示容量,可省略
  • 超出容量时会自动扩容,但尽量提供一个合理的初始值
  • 使用len()获取元素个数
  • 键值对不存在时会自动添加,使用delete()删除某键值对
  • 使用for range对map或slice进行迭代操作

 

package main

import (
	"fmt"
)

func main()  {
	a := make(map[int]string)   //map初始化
	a[1] = "ok"   //增加键值对
	delete(a ,1)    //删除键为1的键值对
	fmt.Println(a)  //map[1:ok]
	var m map[int]map[int]string    //键值都需初始化
	m = make(map[int]map[int]string)   //对key初始化
	m[1] = make(map[int]string)   //对每一个value初始化
	m[1][1] = "a"
	n,ok := m[2][1]
	if !ok {
		m[2] = make(map[int]string)
	}
	m[2][1] = "GOOD"
	n,ok = m[2][1]
	fmt.Println(n,ok) //GOOD true
}

  

//迭代操作
package main

import (
	"fmt"
	"sort"   //排序
)

func main()  {
	s := [3]string{"a","b","c"}
	for i,v:= range s{
		fmt.Println(i,v)    //0 a
							//1 b
							//2 c
	}
	sm := make([]map[int]string,5)
	for i := range sm{
		sm[i] = make(map[int]string,1)
		sm[i][1] = "ok"
		fmt.Println(sm[i])
	}
	fmt.Println(sm)
	m := map[int]string{1:"a",2:"b",3:"c",4:"d",5:"e"}
	ss := make([]int,len(m))
	i := 0
	for k,_ := range m{
		ss[i] = k
		i ++
	}
	sort.Ints(ss)    //排序
	fmt.Println(ss)
}

  

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
GO worker pool发布时间:2022-07-10
下一篇:
go语言之进阶篇JSON处理发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap