首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数组和切片

数组和切片

作者头像
酷走天涯
发布2019-06-11 16:33:10
6270
发布2019-06-11 16:33:10
举报
数组

需要掌握的知识点

1、数组不可边长 2、如何声明数组 3、如何初始化数组 4、如何给数组赋值 5、如何获取数组的值 6、如何给数组排序 7、如何遍历数组 8、如何窃取数组里面的一段值 9、查看容量和长度 (容量和长度相等)

声明数组

package main
import "fmt"
func main(){
  var a [10]string 
  fmt.Println(a)
}

初始化数组

package main
import "fmt"
func main(){
  var a =   [3]string{"1","2"}
  fmt.Println(a)
}
切片
package main

import "fmt"

func main(){
  var array = make([]string,10,20) // 
  fmt.Println(array)
  fmt.Printf("长度: %d \n", len(array))
  fmt.Printf("容量: %d \n",cap(array))
  }

说明 make 是一个内建函数 第一个参数类型,第一个参数容量,第三个参数长度,

image.png

加入我们将10 和 20 调换一下,编译会不会报错,运行会不会报错? 编译不会报错,因为参数数据类型是正确的,编译会报错,因为容量不能大于长度

如果我们初始化切片的时候不指明长度那么系统会自动将长度的值设置和容量一样

再看一个例子

package main

import  "fmt"


 func main(){
   array := []int{1,2,3,4,5,6,7,8,9,10}
   s1 := array[3:6]
   fmt.Printf("长度:%d\n",len(s1))
   fmt.Printf("容量:%d\n",cap(s1))
 }

数据类型

[3:6] 其实对应区间表达式是[3:6) 所以它的数据长度为 3,容量为7,数据长度3比较好理解即3,4,5三个元素的个数,但是容量7怎么解释呢?切片s1底层的数组是array,它的内存其实地址是位置3所在的位置,那么它的结束位置就是数组array的最后一个元素位置,则10-3 = 7

image.png

如何把切片s1 容量最大化

package main
import (
    "fmt"
    )
func main(){
  array := []int{1,2,3,4,5,6,7,8,9,10}

  s1 := array[1:4]
  s1 = s1[0:cap(s1)]
  fmt.Printf("长度:%d\n",len(s1))
  fmt.Printf("容量:%d\n",cap(s1))
  fmt.Println(s1)
  }

image.png

如果我修改了array中的4改成5,那么s1的值会变吗?什么情况下会不变呢?

答案 :会,因为他们是同一个内存区域!

package main

import (
    "fmt"
    )

func main(){
  array := []int{1,2,3,4,5,6,7,8,9,10}
  s1 := array[1:6]
  s1 = append(s1,0)
  s1 = append(s1,0)
  s1 = append(s1,0)
  s1 = append(s1,0)
  s1 = append(s1,0)
  s1 = append(s1,0)
  fmt.Printf("长度:%d\n",len(s1))
  fmt.Printf("容量:%d\n",cap(s1))
  array[3] = 5
  fmt.Println(s1)
  }

image.png

两个地方解释一下

容量为什么是18呢?

s1底层的内存其实和array是共享的,当s1的长度超过容量是,那么系统会自动为它分配两倍大的内存空间作为它的最新内存

有几个特殊的事项需要注意

1.如果一次给切片追加的元素太多,长度大于容量的两倍,那么新的切片的容积就等于实际元素的数量 2.如果切片长度大于或者等于1024,go语言会以原容量的1.25倍进行扩容 3.append 返回的切片是一个新的切片,如果长度没有超过,那么新的切片的底层数组就是原来的底层数组

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.12.24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 数组
  • 切片
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档