今天我们来说一说GO语言中的字典与字符串
字典
map是一种较为特殊的数据结构,在任何一种编程语言中都可以看见他的身影,它是一种键值对结构,通过给定的key可以快速获得对应的value。
字典的定义
var m1 map[string]int
m2 := make(map[int]interface{}, 100)
m3 := map[string]string{
"name": "james",
"age": "35",
}
在定义字典时不需要为其指定容量,因为map是可以动态增长的,但是在可以预知map容量的情况下为了提高程序的效率也最好提前标明程序的容量。
需要注意的是,不能使用不能比较的元素作为字典的key,例如数组,切片等。而value可以是任意类型的,如果使用interface{}作为value类型,那么就可以接受各种类型的值,只不过在具体使用的时候需要使用类型断言来判断类型。
字典的操作
字典的插入操作如下:
m3["key1"] = "v1"
m3["key2"] = "v2"
m3["key3"] = "v3"
我们也可以与数组和切片一样,我们可以使用len来获取字典的长度。
len(m3)
在有些情况下,我们不能确定键值对是否存在,或者当前value存储的是否就是空值,go语言中我们可以通过下面这种方式很简便的进行判断。
if value, ok := m3["name"]; ok {
fmt.Println(value)
}
上面这段代码的作用就是如果当前字典中存在key为name的字符串则取出对应的value,并返回true,否则返回false。
对于一个已经存在的字典,我们如何对其进行遍历呢?可以使用下面这种方式:
for key, value := range m3 {
fmt.Println("key: ", key, " value: ", value)
}
不仅如此我们还可以将函数作为值类型存入到字典中。
func main() {
m := make(map[string]func(a, b int) int)
m["add"] = func(a, b int) int {
return a + b
}
m["multi"] = func(a, b int) int {
return a * b
}
fmt.Println(m["add"](3, 2))
fmt.Println(m["multi"](3, 2))
}
字符串
字符串应该可以说是所有编程语言中最为常用的一种数据类型,接下来我们就一起探索下go语言中对于字符串的常用操作方式。
字符串的定义
字符串是一种值类型,在创建字符串之后其值是不可变的,所以不能对其进行改变。
s := "hello"
s[0] = 'T'
编译器会提示cannot assign to s[0]。在C语言中字符串是通过\0来标识字符串的结束,而go语言中是通过长度来标识字符串是否结束的。与其他数据类型一样也可以通过len函数来获取字符串长度。
如果我们想要修改一个字符串的内容,我们可以将其转换为字节切片,再将其转换为字符串,但是也同样需要重新分配内存。
func main() {
s := "hello"
b := []byte(s)
b[0] = 'g'
s = string(b)
fmt.Println(s) //得到gello
}
但是如果字符串中包含中文就不能直接使用byte切片对其进行操作,go语言中我们可以通过这种方式
func main() {
s := "hello你好中国"
fmt.Println(len(s)) //17
fmt.Println(utf8.RuneCountInString(s)) //9
b := []byte(s)
for i := 0; i < len(b); i++ {
fmt.Printf("%c", b[i])
} //helloä½ å¥½ä¸å�½
fmt.Println()
r := []rune(s)
for i := 0; i < len(r); i++ {
fmt.Printf("%c", r[i])
} //hello你好中国
}
在go语言中字符串都是以utf-8的编码格式进行存储的,所以每个中文占三个字节加上hello的5个字节所以长度为17,如果我们通过utf8.RuneCountInString函数获得的包含中文的字符串长度则与我们的直觉相符合。而且由于中文对于每个单独的字节来说是不可打印的,所以可以看到很多奇怪的输出,但是将字符串转为rune切片则没有问题。