数组和切片

数组

需要掌握的知识点

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 返回的切片是一个新的切片,如果长度没有超过,那么新的切片的底层数组就是原来的底层数组

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 读取文件

    读取文件是一个经常用到的功能,比如从文件目录中读取一张照片,读取一个txt文件,word,excel等等,今天我们就学习一下go是如何读取文件的?

    酷走天涯
  • Swift3.0 - 检测API

    酷走天涯
  • go - os包 彻头彻尾用法使用

    os包提供了操作系统函数的不依赖平台的接口。设计为Unix风格的,虽然错误处理是go风格的;失败的调用会返回错误值而非错误码。通常错误值里包含更多信息。例如,如...

    酷走天涯
  • 利用 word2vec 训练的字向量进行中文分词

    http://blog.csdn.net/itplus/article/details/17122431

    bear_fish
  • 6-STM32+ESP8266+AIR202基本控制篇功能4-微信小程序扫码绑定GPRS,并通过MQTT和Air202实现远程通信控制(兼容SIM800)

    整体说明 这节演示一下使用微信小程序扫码绑定GPRS,然后通过MQTT服务器实现远程温湿度采集和远程控制继电器 程序兼容SIM800 测试功能 1.请按...

    杨奉武
  • 【LeetCode】860. 柠檬水找零【贪心】

    每位顾客只买一杯柠檬水,然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付 5 美元。

    韩旭051
  • 2018年6月会有哪些手机发布? | 拔刺

    镁客网
  • 8月最新编程语言排行榜出炉,等你来pick!

    编程语言Python非常接近TIOBE索引的前3位。如果Python超过C ++并成为3号,那么对于Guido van Rossum的脚本语言来说,这将是史上最...

    老九君
  • 2019年2月编程语言排行榜:Java依旧第一,Python干掉C++!

    请注意,TIOBE 编程语言排行榜只是反映某个编程语言的热门程度,并不能说明一门编程语言好不好,或者一门语言所编写的代码数量多少。

    老九君
  • 6 月编程语言排行榜:Python 飙升,有望挑战 Java 和 C?

    排名前三变成了 Java、C、Python,C++ 掉到第四,第五为 VB .NET。

    老九君

扫码关注云+社区

领取腾讯云代金券