Datawhale go語言學習 4 字典 字串

2021-10-12 08:06:36 字數 4388 閱讀 2699

go語言的字典(map)型別其實是雜湊表(hash table)的乙個實現。字典用於儲存鍵-元素對(更通俗的說法是鍵-值對)的無序集合。注意,同乙個字典中的每個鍵都是唯一的。如果我們在向字典中放入乙個鍵值對的時候其中已經有相同的鍵的話,那麼與此鍵關聯的那個值會被新值替換。

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)

)}

字串應該可以說是所有程式語言中最為常用的一種資料型別,接下來我們就一起探索下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 =

100func

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-

868277

18431 ns/op

benchmarkstringbuilder-

81302448

922 ns/op

benchmarkbytesbuf-

8884354

1264 ns/op

benchmarkstringadd-

8208486

5703 ns/op

可以看到通過strings.builder拼接字串是最高效的。

Datawhale go語言學習 8 包管理

go語言通過包管理來封裝模組和復用 這裡我們只介紹go modules管理方法 go modules於go語言1.11版本時引入,在1.12版本正式支援,是由go語言官方提供的包管理解決方案 modules是相關go包的集合,是源 交換和版本控制的單元。go命令直接支援使用modules,包括記錄和...

語言學習 Python學習

1.關於識別符號 python 中的識別符號是區分大小寫的。以下劃線開頭的識別符號是有特殊意義的。以單下劃線開頭 foo 的代表不能直接訪問的類屬性,需通過類提供的介面進行訪問,不能用 from import 而匯入 以雙下劃線開頭的 foo 代表類的私有成員 以雙下劃線開頭和結尾的 foo 代表 ...

SQL 語言學習

一.插入刪除索引,測速 declare d datetime set d getdate select from cvtuser select 語句執行花費時間 毫秒 datediff ms,d,getdate update testrelation set dif4 0,dif5 0 drop i...