Go--切片,append


提示:以下是本篇文章正文内容,下面案例可供参考

一、切片是什么?

  • Go语言中的数组,数组的长度一旦确定就不能改变, 但在实际开发中我们
    可能事先不能确定数组的长度, 为了解决这类问题Go语言中推出了一种新的数据类型 切片
  • 切片可以简单的理解为长度可以变化的数组,但是Go语言中的切片本质上是一个结构体

二、切片的三种创建方式

1.1、通过数组创建切片 array[startIndex.endIndex]

  • 切片取值顾头步顾尾

	arrMondayOne := []string{"老王", "你是哪个", "我住在你隔壁", "我姓王"}
	arrMonday := arr[1:3] //[你是哪个 我住在你隔壁] ,和python一样顾头不顾尾
	fmt.Println(arrMonday)
---------
	var arr = [5]int{1, 2, 3, 4, 5}
	var sex = arr[2:4]
	fmt.Println(sex) // [3 4]
	fmt.Println(len(sex))  // 2
	fmt.Println(cap(sex)) //3,  cap可以用来查看数组或slice的容量
  • 指定起始位置时有三种方式可以指定
    • 开始位置和结束位置都指定
    • 只指定开始位置或结束位置
    • 开始位置和结束位置都不指定
	var arr = [5]int{1, 2, 3, 4, 5}
	// 同时指定开始位置和结束位置
	var sec = arr[2:4]
	fmt.Println(sec) // [3 4]

	// 只指定结束位置
	secMonday := arr[:5]
	fmt.Println(secMonday) //[1 2 3 4 5]

	// 只指定开始位置

	secTuesday := arr[2:]
	fmt.Println(secTuesday) //[3 4 5]

	// 都不指定, 就是打印所有
	secWednesday := arr[:]
	fmt.Println(secWednesday) // [1 2 3 4 5]   

1.2、方式二: 通过make函数创建 make(类型, 长度, 容量)

  • 内部会先创建一个数组, 然后让切片指向数组
  • 如果没有指定容量,那么容量和长度一样
  • make() , 第一个参数: 指定切片数据类型 ,第二个参数: 指定切片的长度,第三个参数: 指定切片的容量
	var sec = make([]int, 3, 5)
	fmt.Println(sec)      // [0 0 0]
	fmt.Println(len(sec)) // 3
	fmt.Println(cap(sec)) //5
	/*
				内部的实现原理
			var arr =[5]int{0,0,0}
		    var sec =arr[0:3]
	*/

1.3、通过Go提供的语法糖快速创建

  • 和创建数组一样但是不能指定长度
  • 通过该方式创建时,切片的长度和容量相等
var sce = []int{1, 3, 5}
fmt.Println(sce) // [1 3 5]
fmt.Println(len(sce)) // 3
fmt.Println(cap(sce)) // 3

二、切片的使用

  • 切片的基本使用方式和数组一样, 可以通过 切片名称[索引] 方式操作切片
	var sec = []int{1, 3, 5}
	sec[1] = 666
	fmt.Println(sec) //[1 666 5]
	
	// 使用切片的时候不可以下标越界
  • 如果希望切片自动扩容,那么添加数据时必须使用append方法
    • append函数会在切片 末尾 添加一个元素, 并返回一个追加数据之后的切片
    • 利用append函数追加数据时,如果追加之后没有超出切片的容量,那么返回原来的切片, 如
      果追加之后超出了切片的容量,那么返回一个新的切片
    • append函数每次给切片扩容都会按照原有切片容量*2的方式扩容
package main
import "fmt"
func main() {
var sce = []int{1, 3, 5}
fmt.Println("追加数据前:", sce) // [1 3 5]
fmt.Println("追加数据前:", len(sce)) // 3
fmt.Println("追加数据前:", cap(sce)) // 3
fmt.Printf("追加数据前: %p\n", sce) // 0xc0420600a0
// 第一个参数: 需要把数据追加到哪个切片中
// 第二个参数: 需要追加的数据, 可以是一个或多个
sce = append(sce, 666)
fmt.Println("追加数据后:", sce) // [1 3 5 666]
fmt.Println("追加数据后:", len(sce)) // 4
fmt.Println("追加数据后:", cap(sce)) // 6
fmt.Printf("追加数据前: %p\n", sce) // 0xc042076b60

练习

one:编写一个函数,将字符串的每个字母放入一个数组中,并返回该数组

//方式一
func arrStrone(strone string) []string {
	var arrstrone []string
	for i := 0; i < len(strone); i++ {
		arrstrone = append(arrstrone, string(strone[i])) // arrstrone 是一个字符串切片,而 strone[i] 是一个单个字符,这两者的类型不匹配。要修复这个问题,你需要将单个字符转换为字符串,然后再将其添加到切片中
	}

	return arrstrone

}
// 方式二

func arrStrtwo(str string) [] string {
	var arrstrone [] string
	for _,char := range str{
		arrstrone = append(arrstrone, string(char))
	}
	return arrstrone
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lovely_red_scarf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值