Go從入門到精通——常用的輔助性內建函式
Go 常用的輔助性內建函式
Go 語言中的一些函式在安裝了 Go 語言後可以直接在程式碼中使用,無須引用任何包,這些函式叫作內建函式(built-in function)。內建函式往往是程式設計時大多數情況下都會使用到的函式。
1、 內建的輸出資訊函式 print 與 println
package main // 內建函式 println func main() { a := 10 println("a=", a) }
上述程式碼使用了內建函式 println 代替了我們常用的 fmt.Println 函式。兩者功能基本相同,都會將其中的引數逐個輸出,輸出的各個引數之間會有一個空格字元。
使用內建函式 println 和 print 的好處顯而易見:不用引用任何包,並且程式碼編譯更簡單;但是也有一定的風險,因為 Go 語言官方文件中宣告的這幾個函式一般用於內部測試,不保證隨著 Go 語言的版本升級會始終提供。一旦不提供,將意味著大量的程式碼修改工作,因此建議大家使用 fmt 包中的 Println 或 Print 函式。
2、 獲取資料長度的 len 函式
len 函式一般用於獲取字串資料的長度或者切片(陣列)、對映等複合結構中資料項的個數。
例如:
package main import ( "fmt" ) func main() { fmt.Println(len("How are you?")) }
len 的引數也可以是一個變數,比如:
package main import ( "fmt" ) func main() { var s string s = "How are you?" c := len(s) fmt.Println(c) }
但是,如果 len("我們都是中國人!"),len 函式中傳入的中文字串作為引數,會發現結果與我們預期的不同。
程式示例如下:
package main import ( "fmt" ) func main() { fmt.Println(len("我們都是中國人!")) }
執行該程式碼會發現,雖然該字串中共有 7 個漢子 + 1箇中文標點符號,但是輸出的結果卻是24。這是因為 len 函式獲得的字串長度是按其所佔的位元組數量,而 Go 語言中的字串預設為 UTF-8 編碼,漢子一般都需要佔用 3 個字元,8 * 3 = 24。因此實際長度是 24。如果想要獲得實際漢字字元的長度,需要將字串轉換為 rune 型別的切片變數。
package main import ( "fmt" ) func main() { fmt.Println(len([]rune("我們都是中國人!"))) }
將上面的字串轉換成 []rune 型別,也就是 rune 型別的切片,因此可以正確地輸出結果 8。
3、 獲取變數容量的 cap 函式
內建函式 cap 與 len 函式用法類似,但是不能用於字串和對映變數,只能用於切片變數,返回的結果是該切片的容量,而非目前實際已有的資料項數。
4、 用於複合型別資料的操作函式
對於切片型別和對映型別等複合型別資料,可以使用 make 函式進行記憶體分配和初始化,make 函式就是處理複合型別資料重要的內建函式之一。
另外,對於結構型別和自定義資料型別的資料,還可以使用 new 函式新建資料型別變數(指標)。
copy 函式主要用於複製切片:
package main import ( "fmt" ) func main() { var slice1 = []int{1, 2, 3, 4, 5} slice2 := make([]int, 6) fmt.Println(slice2) copy(slice2, slice1) fmt.Println(slice2) }
- 宣告定義 slice1 是一個 int 型別的切片,並且在宣告的同時為它賦予了 5 個數字項的初值;
- slice2 也是 int 型別的切片,使用 make 函式分配了 6 個數值項的空間;
- 向終端列印 slice2 值;
- copy 函式第一個引數是複製動作的目標,第二個引數是複製動作的源,因此 copy(slice2,slice1)這條語句的作用是將 slice1 中的所有數值複製到 slice2 中,由於 slice1 比 slice2的長度小,因此將只複製 slice1 中 5 個數值到 slice2 中,並從 sliace2 的第一個位置開始。slice2 的最後一個項將保持初始化時的零值(對於 int 型別即整數 0)。
- 向終端列印 slice2 值,可以對比看到,在用 copy 函式前全是零值,這是用 make 函式初始化分配空間之後的正常情況;在用 copy 函式複製 slice1 中內容之後,slice2 的前 5 項與 slice1 中的內容相同,而最後一項還是 0,這說明 copy 函式正常完成了複製。
copy 函式也可以直接複製一個子切片到複製目標中,因為子切片也是切片:
package main import ( "fmt" ) func main() { var slice1 = []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} slice2 := make([]int, 6) fmt.Println(slice2) n := copy(slice2, slice1[6:]) fmt.Println(n) fmt.Println(slice2) }