nil 是 interface、function、pointer、map、slice 和 channel 类型变量的默认初始值
不可以用"=="比较类型: slice(切片)、map(key-value集合)、func(函数)
Go 语言采用的是哈希查找表,并且使用链表解决哈希冲突。go1.9以后(含)。源码src/runtime/map.go
map的比较可以使用reflect.DeepEqual()
m1 := map[string]string{"one": "a", "two": "b"}
m2 := map[string]string{"two": "b", "one": "a"}
// 1.map类型的值的比较,常规的思路:1). 比较长度是否相等. 2). 比较key是不是相等 3). 比较相同key的value是不是相等
if len(m1)!=len(m2){
fmt.Println("!=")
return
}
for k, v := range m1 {
if _,ok:=m2[k];!ok{
fmt.Println("!=",i)
return
}
if m2[k]!=v{
fmt.Println("!=")
return
}
}
for k, v := range m2 {
if _,ok:=m1[k];!ok{
fmt.Println("!=")
return
}
if m1[k]!=v{
fmt.Println("!=")
return
}
}
fmt.Println("==")
// 2. equal := reflect.DeepEqual(m1, m2) //性能有时稍差
fmt.Println("v1 == v2: ",equal )
如果要大小写不敏感来比较 byte 或 string 中的英文文本,可以使用 “bytes” 或 “strings” 包的 ToUpper() 和 ToLower() 函数。比较其他语言的 byte 或 string,应使用 bytes.EqualFold() 和 strings.EqualFold()
如果 byte slice 中含有验证用户身份的数据(密文哈希、token 等),不应再使用 reflect.DeepEqual()、bytes.Equal()、 bytes.Compare()。这三个函数容易对程序造成 timing attacks,此时应使用 “crypto/subtle” 包中的 subtle.ConstantTimeCompare() 等函数
reflect.DeepEqual() 认为空 slice 与 nil slice 并不相等,但注意 byte.Equal() 会认为二者相等:
var b1 []byte = nil
b2 := []byte{}
fmt.Println(reflect.DeepEqual(b1,b2),bytes.Equal(b1,b2)) //false true
一、string
string的len是字节长度,英文1个字节,中文3个字节
字符长度
str:="zh里"
runes := []rune(str)
fmt.Println(len(runes))
截取的值为ASCII码.
如果要得到字符串的字符数,可使用 “unicode/utf8” 包中的 RuneCountInString(str string) (n int)
str2 := "A♥C中"
fmt.Println(utf8.RuneCountInString(str2),len(str2)) // 4,8
char := "é" //法语
fmt.Println(len(char)) // 2
fmt.Println(utf8.RuneCountInString(char)) // 1
fmt.Println("cafe\u0301") 法语café