字典 字串

2021-10-12 09:59:54 字數 3049 閱讀 9126

4.字典、字串

4.1 字典

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。

對於乙個已經存在的字典,我們如何對其進行遍歷呢?可以使用下面這種方式:

如果已經存在與字典中的值已經沒有作用了,我們想將其刪除怎麼辦呢?可以使用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))

}4.2 字串

字串應該可以說是所有程式語言中最為常用的一種資料型別,接下來我們就一起探索下go語言中對於字串的常用操作方式。

4.2.1 字串定義

字串是一種值型別,在建立字串之後其值是不可變的,也就是說下面這樣操作是不允許的。

s := 「hello」

s[0] = 『t』

編譯器會提示cannot assign to s[0]。在c語言中字串是通過\0來標識字串的結束,而go語言中是通過長度來標識字串是否結束的。

如果我們想要修改乙個字串的內容,我們可以將其轉換為位元組切片,再將其轉換為字串,但是也同樣需要重新分配記憶體。

func main()

與其他資料型別一樣也可以通過len函式來獲取字串長度。

len(s)

但是如果字串中包含中文就不能直接使用byte切片對其進行操作,go語言中我們可以通過這種方式

func main() //helloä½ å¥½ä¸­å�½

fmt.println()

r := rune(s)

for i := 0; i < len(r); i++ //hello你好中國}

在go語言中字串都是以utf-8的編碼格式進行儲存的,所以每個中文佔三個位元組加上hello的5個位元組所以長度為17,如果我們通過utf8.runecountinstring函式獲得的包含中文的字串長度則與我們的直覺相符合。而且由於中文對於每個單獨的位元組來說是不可列印的,所以可以看到很多奇怪的輸出,但是將字串轉為rune切片則沒有問題。

4.2.2 strings包

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.buffer

func benchmarkbytesbuf(b *testing.b)

_ = buf.string()

}b.stoptimer()

}4.strings.builder拼接

func benchmarkstringbuilder(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拼接字串是最高效的。

字典,字串

1 在python中 不可變資料型別 整型,字串,元祖 可變資料型別 列表,字典 2 字典的特徵 無序 在字典中順序儲存的取出來卻不一定是順序的 鍵值不可變且唯一 3 建立字典 列表建立方式 a list 1,2,3 b list 1,2,3 print a print b 字典建立方式 c dic...

字串,字典

字串常見操作 去除左右兩邊空格 語法 string.strip 去除兩邊空格 string.lstrip 去除左邊空格 string.rstrip 去除右邊空格 字串分割 語法 string.split 按照空格字元分割,返回乙個列表 string.split 分隔符 按照指定分割符分割,返回乙個表...

Go 字典 字串

map是一種較為特殊的資料結構,在任何一種程式語言中都可以看見他的身影,它是一種鍵值對結構,通過給定的key可以快速獲得對應的value。4.1.1 如何定義字典var m1 map string int m2 make map int inte ce 100 m3 map string strin...