map 是一種較為特殊的資料結構,在任何一種程式語言中都可以看見它的身影,它是一種鍵值對結構,通過給定的 key 可以快速獲得對應的 value
4.1.1 如何定義字典
var m1 map[string]int
m2 := make(map[int]inte***ce{}, 100)
m3 := map[string]string
在定義字典時,不需要為其指定容量,因為 map 是可以動態增長的,但是在可以預知 map 容量的情況下為了提高程式的效率也最好提前標明程式的容量。需要注意的是,不能使用不能比較的元素作為額哦字典的 key,例如陣列、切片等。而 value 可以是任意型別的,如果使用 inte***ce{} 作為 value 型別,那麼就可以接受各種型別的值,只不過在具體使用的時候需要使用型別斷言來判斷型別
4.1.2 字典操作
向字典中放入元素也非常簡單
m3["key1"] = "v1"
m3["key2"] = "v2"
m3["key3"] = "v3"
你可以動手試一下,如果插入的兩個元素 key 相同會發生什麼?
與陣列和切片一樣,我們可以使用 len 來獲取字典的長度
len(m3)
在有些情況下,我們不能確定鍵值對是否存在,或者當前 value 儲存的是否就是空值,go 語言中我們可以通過下面這種方式很簡便的進行判斷
if value, ok := m3["name"]; ok
上面這段**的作用就是如果當前字典中存在 key 為 name 的字串取出對應的 value,並返回 true,否則返回 false
對於乙個已經存在的字典,我們如何對其進行遍歷呢?可以使用下面這種方式:
for key, value := range m3
如果存在於字典中的值已經沒有作用了,我們想將其刪除該怎麼辦呢?可以使用 go 的內建函式 delete 來實現
delete(m3, "key1")
除了上面的一些簡單操作,我們還可以宣告值型別為切片的字典以及字典型別的切片等等,你可以動手試試看。
不僅如此我們還可以將函式作為值型別存入到字典中
func main()
m["multi"] = func(a, b int) int
fmt.println(m["add"](3, 2))
fmt.println(m["multi"](3, 2))
}
字串是一種值型別,在建立字串之後其值是不可變的,也就是說下面這樣操作是不允許的。
s := "hello"
s[0] = "t"
編譯器會提示cannot assign to s[0]
。在 c 語言中字串通過\0
來標識字串的結束,而 go 語言中是通過長度來標識字串是否結束的
如果我們想要修改乙個字串的內容,我們可以將其轉換為位元組切片,再將其轉換為字串,但是也同樣需要重新分配記憶體
func main()
與其他資料型別一樣,也可以通過len()
函式來獲取字串長度
len(s)
但是如果字串中包含中文就不能直接使用 byte 切片對其進行操作,go 語言中我們可以通過這種方式
func main()//hello 你好中國
}
在 go 語言中字串都是以 utf-8 的編碼格式進行儲存的,所以每個中文佔三個位元組加上 hello 的 5 個位元組,所以長度為 17,如果我們通過utf8.runecountinstring
函式獲得的包含中文的字串長度則與我們的直覺想符合。而且由於中文對於每個單獨的位元組來收是不可列印的,所以可以看到很多奇怪的輸出,但是將字串轉為 rune 切片則沒有問題
4.2.2 string 包
strings 包提供了許多操作字串的函式。在這裡你可以看到都包含哪些函式:
下面演示幾個例子:
func main()
4.2.3 strconv 包
strconv 包實現了基本資料型別與字串之間轉換。在這裡你可以看到都包含哪些函式:
下面演示幾個例子:
i, err := strconv.atoi("-42") //將字串轉為 int 型別
s := strconv.itoa(-42) //將 int 型別轉為字串
若轉換失敗則返回對應的 error 值
4.2.4 字串拼接
除了以上的操作外,字串拼接也是很常用的一種操作,在 go 語言中有多種方式可以實現字串的拼接,但是每個方式的效率並不相同,下面就對這幾種方法進行對比。
1. sprintf
const numbers = 100
func benchmarksprintf(b *testing.b)
}b.stoptimer()
}
2. + 拼接func benchmarkstringadd(b *testing.b)
}b.stoptimer()
}
3. bytes.bufferfunc benchmarkbytesbuf(b *testing.b)
_ = buf.string()
}b.stoptimer()
}
4. strings.builder 拼接func benchmarkstringbulider(b *testing.b)
_ = builder.string()
}b.stoptimer()
}
5.benchmarksprintf-8 68277 18431 ns/op
benchmarkstringbuilder-8 1302448 922 ns/op
benchmarkbytesbuf-8 884354 1264 ns/op
benchmarkstringadd-8 208486 5703 ns/op
可以看到通過strings.builder
拼接字串是最高效的。 Task05 字典 集合和序列
可變型別與不可變型別 序列是以連續的整數為索引,與此不同的是,字典以 關鍵字 為索引,關鍵字可以是任意不可變型別,通常用字串或數值。字典是 python 唯一的乙個 對映型別,字串 元組 列表屬於序列型別。字典的定義 字典 是無序的 鍵 值 key value 對集合,鍵必須是互不相同的 在同乙個字...
05, 字典,集合
1.什麼是字典 字典是以key value的形式來儲存資料,用 表示.儲存的是key value 坑 字典儲存資料的時候是用的hash值來儲存.演算法不能變 python的 資料必須是不可變的 可雜湊 字典的key必須是可雜湊的 不可變 dic print dic jay 周杰倫 dic jay 麻...
街景字元編碼識別 Task05 模型整合
學習目標 模型整合 整合學習 ensemble learning 通過構建並結合多個弱學習器來綜合得到乙個強學習器的方法。機器學習領域的整合方法有bagging boosting stacking。bagging bootstrap aggregating,裝袋 bagging使用裝袋取樣來獲取資料...