2021-04-17

一 切片的使用

1 方式 1——定义一个切片,然后让切片去引用一个已经创建好的数组。

示例

package main

import (
   "fmt"
)

func main() {
   // 演示切片的基本使用
   var intArr [5]int = [...]int{1, 22, 33, 66, 99}
   // 声明/定义一个切片
   // slice := intArr[1:3]
   // 1 slice 就是切片名
   // 2 intArr[1:3] 表示 slice 引用到 intArr 这个数组
   // 3 引用 intArr 数组的起始下标为 1,最后的下标为3(但是不包含3)
   slice := intArr[1:3]
   fmt.Println("intArr=", intArr)
   fmt.Println("slice 的元素是 =", slice)       // 22, 33
   fmt.Println("slice 的元素个数 =", len(slice)) // 2
   fmt.Println("slice 的容量 =", cap(slice))   // 切片的容量是可以动态变化
   fmt.Printf("intArr[1]的地址=%p\n", &intArr[1])
   fmt.Printf("slice[0]的地址=%p slice[0]==%v\n", &slice[0], slice[0])
   slice[1] = 34
   fmt.Println()
   fmt.Println("intArr=", intArr)
   fmt.Println("slice=", slice) //  22, 34
}

2 方式 2——通过 make 来创建切片.

a 基本语法

var 切片名 []type = make([]type, len, [cap])

b 参数说明

type:数据类型。 

len:大小 。

cap:切片容量,可选,如果指定了 cap, 则要求 cap >= len。

c 代码

package main

import (
   "fmt"
)

func main() {
   // 演示切片使用 make
   var slice []float64 = make([]float64, 5, 10)
   slice[1] = 10
   slice[3] = 20
   fmt.Println(slice)
   fmt.Println("slice的size=", len(slice))
   fmt.Println("slice的cap=", cap(slice))
}

d 测试

[0 10 0 20 0]

slice的size= 5

slice的cap= 10

e 图解

f 说明

  • 通过 make 方式创建切片可以指定切片的大小和容量。

  • 如果没有给切片的各个元素赋值,那么就会使用默认值(int , float 为 0,string 为"" ,bool  为 false)。

  • 通过 make 方式创建的切片,对应的数组是由 make 底层维护,对外不可见,即只能通过 slice 去访问各个元素。

3 方式 3——定义一个切片,直接就指定具体数组,使用原理类似 make 的方式。

a 代码

package main

import "fmt"

func main() {
   // 定义一个切片,直接就指定具体数组,使用原理类似make的方式
   var strSlice []string = []string{"tom", "jack", "mary"}
   fmt.Println("strSlice=", strSlice)
   fmt.Println("strSlice size=", len(strSlice)) // 3
   fmt.Println("strSlice cap=", cap(strSlice))  // 3
}

b 测试

strSlice= [tom jack mary]

strSlice size= 3

strSlice cap= 3

4 方式 1 和方式 2 的区别

方式1是直接引用数组,这个数组是事先存在的,程序员是可见的。

方式2是通过 make 来创建切片,make也会创建一个数组,是由切片在底层进行维护,程序员不可见。

make 创建切片的示意图。

二 切片的遍历

切片的遍历和数组一样,也有两种方式。

  • for 循环常规方式遍历

  • for-range 结构遍历切片

1 代码

package main
import (
   "fmt"
)

func main() {
   // 使用常规的 for 循环遍历切片
   var arr [5]int = [...]int{10, 20, 30, 40, 50}
   slice := arr[1:4] // 20, 30, 40
   for i := 0; i < len(slice); i++ {
      fmt.Printf("slice[%v]=%v ", i, slice[i])
   }
   fmt.Println()
   // 使用for range 方式遍历切片
   for i, v := range slice {
      fmt.Printf("i=%v v=%v \n", i, v)
   }
}

2 测试

slice[0]=20 slice[1]=30 slice[2]=40

i=0 v=20

i=1 v=30

i=2 v=40

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值