Golang的切片学习笔记

与python对比

初开始接触golang的slice,感觉跟python的slice有点像,但也有几个比较明显的区别:

  1. python中的slice是在原有基础上拷贝一份。go中的slice则是指向生成它的数组/切片(切片和数组共用同一片内存),切最长长度不会超限;
  2. go的切片,其成员是相同类型的,python的列表和元组则不限制类型;
  3. 对于[a:b]这种切片操作,go的a、b两个参数不能是负数,python可以是负数,此时就相当于从末尾往前数;
  4. 对于[a:b:c]这种切片操作,go的c表示的是容量;而python的c表示的是步长。

先来点俗气的

切片使用s =s[0:]可以清空。

如果要查看获取到的东东究竟是数组还是切片,可以使用fmt.Printf("%s",reflect.TypeOf(获取到的东西).Kind())

如果想要数组转切片很简单,[:]就可以。

判断切片相等

比较两个切片是否相等,除了循环遍历还有一个reflect方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package main

import (
"fmt"
"reflect"
)

func bijiao(b,c []int) bool{
return reflect.DeepEqual(b,c)
}
func main(){
b := []int{} //他俩是一回事
c :=make([]int,0,0)
var d []int //d跟b、c不是一回事
fmt.Println(bijiao(b,c))
fmt.Println(bijiao(d,c))
fmt.Println(d)
fmt.Println(c)
}

reflect.DeepRqual()除了可以比较数组和切片,还可以比较map和srtucts,不过据说 https://github.com/google/go-cmp 这个方法更牛逼。

copy的问题

go的copy是拷贝对应的位置,而不是全拷贝,也就是说如果是让一个空切片作为目的切片,那得到了新切片就是空切片,如果是让一个空切片做源切片,那么得到的新切片与目的切片一致。

判断字符串的几种情况

用一个例子说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package main

import (
"fmt"
"strings"
)

func main() {
var str string = "This is an example of a string." //定义变量
fmt.Printf("T/F? Does the string \"%s\" have prefix %s? ", str, "Th")
fmt.Printf("%t\n", strings.HasPrefix(str, "Th"))
fmt.Printf("%t\n", strings.HasSuffix(str,"ing"))
fmt.Println(strings.Contains(str,"an")) //目标变量是否含有an
fmt.Println(strings.ContainsAny(str,"axwq")) //目标变量是否含有“axwq”里的任意一个
fmt.Println(strings.Count(str, "s")) //目标变量里有多少个s
}

如果要获取汉字字符串的汉字数,可以使用utf8.RuneCountInString(s)

参考资料

https://studygolang.com/articles/12944 (判断相等的deepequal)
https://studygolang.com/articles/5769 (golang中strings包用法)

感谢您请我喝咖啡~O(∩_∩)O,如果要联系请直接发我邮箱chenx1242@163.com,我会回复你的
-------------本文结束感谢您的阅读-------------