与python对比
初开始接触golang的slice,感觉跟python的slice有点像,但也有几个比较明显的区别:
- python中的slice是在原有基础上拷贝一份。go中的slice则是指向生成它的数组/切片(切片和数组共用同一片内存),切最长长度不会超限;
- go的切片,其成员是相同类型的,python的列表和元组则不限制类型;
- 对于[a:b]这种切片操作,go的a、b两个参数不能是负数,python可以是负数,此时就相当于从末尾往前数;
- 对于[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
19package 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
16package 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包用法)