GO系列
1、GO学习之Hello World
2、GO学习之入门语法
3、GO学习之切片操作
文章目录
前言
按照公司目前的任务,go 学习是必经之路了,虽然行业卷,不过技多不压身,依旧努力!!!
前面学了一些 go 的基础知识,比如说 go 语言的基础,go 的数据类型和一些基本操作,if else switch for 等语法,当然除了简单的一些变量定义还有稍微复杂的,就是数据和切片了,那就针对切片专门进行学习一下,毕竟在开发中 切片 也是使用比较多的。
一、什么是切片(和数组有什么关系)
切片的定义:
- 切片由三部分组成:指针、长度 和 容量。
- 指针指向数组的第一个元素,切片的长度表示切片表示当前存储元素的个数,容量表示切片底层数组的长度。
切片和数组有什么关系呢?
- 切片是数组的一个连续片段的应用,提供了一种动态大小的、方便的方式来操作数组。
- 切片和数组的底层数据结构是相同的,都是连续的内存块,但是切片是一个动态长度的视图,而数组的长度是固定的。
- 对切片的修改会影响底层数组,因为切片是对数组的引用。同样的,对底层数组的修改也会影响切片。
二、切片基本操作
2.1 切片定义
package main
import "fmt"
func main() {
// 声明切片
var s1 []int
s2 := []int{}
// 通过 make 来创建分片
var s3 []int = make([]int, 10)
var s4 []int = make([]int, 0, 5)
// 简写方式
s5 := []int{1, 2, 3}
arr := [5]int{1, 2, 3, 4, 5}
var s6 []int
// 声明切片为数组的部分
s6 = arr[1:4]
if s1 == nil {
fmt.Println("s1 is nil")
}
fmt.Println("s1: ", s1)
fmt.Println("s2: ", s2)
fmt.Println("s3: ", s3)
fmt.Println("s4: ", s4)
fmt.Println("s5: ", s5)
fmt.Println("s6: ", s6)
}
执行结果:
s1 is nil
s1: []
s2: []
s3: [0 0 0 0 0 0 0 0 0 0]
s4: []
s5: [1 2 3]
s6: [2 3 4]
2.2 添加元素
package main
import "fmt"
func main() {
var list []int
for i := 0; i < 5; i++ {
// 添加元素
list = append(list, i)
}
list = append(list, 100)
fmt.Println("list: ", list)
}
执行结果:
list: [0 1 2 3 4 100]
2.3 删除元素
package main
import "fmt"
func main() {
data := [...]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
// 删除元素
data3 := append(data[:2], data[3:]...)
fmt.Println("被删除后的数组为:", data3)
}
执行结果:
被删除后的数组为: [0 1 3 4 5 6 7 8 9]
2.4 遍历
package main
import "fmt"
func main() {
// 切片遍历
data := [...]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
slice := data[:]
for index, value := range slice {
fmt.Printf("index %v 的值为 %v \n", index, value)
}
// 需要 下标(index) 的写法
for _, value := range slice {
fmt.Println(value)
}
}
执行结果:
index 0 的值为 0
index 1 的值为 1
index 2 的值为 2
index 3 的值为 3
index 4 的值为 4
index 5 的值为 5
index 6 的值为 6
index 7 的值为 7
index 8 的值为 8
index 9 的值为 9
2.5 自定义contains函数
package main
import "fmt"
func main() {
//定义数组
data := [...]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
//切片
slice := data[:]
element := 5
if contains(slice, element) {
fmt.Println(element, " 在切片slice2中...")
} else {
fmt.Println(element, " 不在切片slice中...")
}
}
func contains(data []int, element int) bool {
for _, value := range data {
if value == element {
return true
}
}
return false
}
三、总结
看到这里,go 语言中的切片就基本有了了解,也能写一写简单的功能了,不过相对于JAVA来说,go 语言中好多地方还是大不相同的,就对切片来说,表面上有点类似于 JAVA 的 ArrayList,但其实大相径庭,也需要更加去使用和了解才能正在的懂什么是切片。
那为什么 JAVA 中对 ArrayList 操作由 remove、contains等方法,但是 go 中却没有这样的函数呢?
切片就到这里吧!
感谢阅读!!!如有不妥之处欢迎纠正!