1. 程式人生 > 其它 >Go從入門到精通——常用的輔助性內建函式

Go從入門到精通——常用的輔助性內建函式

Go 常用的輔助性內建函式

  Go 語言中的一些函式在安裝了 Go 語言後可以直接在程式碼中使用,無須引用任何包,這些函式叫作內建函式(built-in function)。內建函式往往是程式設計時大多數情況下都會使用到的函式。

1、 內建的輸出資訊函式 print 與 println

package main

// 內建函式 println

func main() {
	a := 10
	println("a=", a)
}

  上述程式碼使用了內建函式 println 代替了我們常用的 fmt.Println 函式。兩者功能基本相同,都會將其中的引數逐個輸出,輸出的各個引數之間會有一個空格字元。

另外,與此類似,內建的 print 函式與 fmt.Print 函式功能也是基本相同,區別是內建的 print 函式不會在最後多輸出一個回車換行符

  使用內建函式 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)
}