1. 程式人生 > >GO-內建函式

GO-內建函式

[toc] # 1、列印資訊print各個區別 ```go 1. Println 列印的每一項之間都會有回車空行,Print 沒有 2. Printf是格式化輸出 func main() { a:=10 b:=20 c:=30 fmt.Println("a=", a , ",b=" , b , ",c=" , c) fmt.Printf("a=%d,b=%d,c=%d" , a , b , c) } 不加fmt,轉成ascill碼 ``` ## **1.1格式說明** | **格式** | **含義** | | :------- | :----------------------------------------------------------- | | %% | 一個%字面量 | | %b | 一個二進位制整數值(基數為2),或者是一個(高階的)用科學計數法表示的指數為2的浮點數 | | %c | 字元型。可以把輸入的數字按照ASCII碼相應轉換為對應的字元 | | %d | 一個十進位制數值(基數為10) | | %e | 以科學記數法e表示的浮點數或者複數值 | | %E | 以科學記數法E表示的浮點數或者複數值 | | %f | 以標準記數法表示的浮點數或者複數值 | | %g | 以%e或者%f表示的浮點數或者複數,任何一個都以最為緊湊的方式輸出 | | %G | 以%E或者%f表示的浮點數或者複數,任何一個都以最為緊湊的方式輸出 | | %o | 一個以八進位制表示的數字(基數為8) | | %p | 以十六進位制(基數為16)表示的一個值的地址,字首為0x,字母使用小寫的a-f表示 | | %q | 使用Go語法以及必須時使用轉義,以雙引號括起來的字串或者位元組切片[]byte,或者是以單引號括起來的數字 | | %s | 字串。輸出字串中的字元直至字串中的空字元(字串以'\0‘結尾,這個'\0'即空字元) | | %t | 以true或者false輸出的布林值 | | %T | 使用Go語法輸出的值的型別 | | %U | 一個用Unicode表示法表示的整型碼點,預設值為4個數字字元 | | %v | 使用預設格式輸出的內建或者自定義型別的值,或者是使用其型別的String()方式輸出的自定義值,如果該方法存在的話 | | %x | 以十六進位制表示的整型值(基數為十六),數字a-f使用小寫表示 | | %X | 以十六進位制表示的整型值(基數為十六),數字A-F使用小寫表示 | ## **1.2輸出** ```go //整型 a := 15 fmt.Printf("a = %b\n", a) //a = 1111 fmt.Printf("%%\n") //只輸出一個% //字元 ch := 'a' fmt.Printf("ch = %c, %c\n", ch, 97) //a, a //浮點型 f := 3.14 fmt.Printf("f = %f, %g\n", f, f) //f = 3.140000, 3.14 fmt.Printf("f type = %T\n", f) //f type = float64 //複數型別 v := complex(3.2, 12) fmt.Printf("v = %f, %g\n", v, v) //v = (3.200000+12.000000i), (3.2+12i) fmt.Printf("v type = %T\n", v) //v type = complex128 //布林型別 fmt.Printf("%t, %t\n", true, false) //true, false //字串 str := "hello go" fmt.Printf("str = %s\n", str) //str = hello go ``` ## **1.3輸人** ```go var v int fmt.Println("請輸入一個整型:") fmt.Scanf("%d", &v) //fmt.Scan(&v) fmt.Println("v = ", v) ``` # 2、檢視型別-TypeOf ```go reflect.TypeOf(num) ``` # 3、檢視長度-len ```go fmt.Println(len(a)) ``` # 4、String-int相互轉換 ```go string轉成int: int, err := strconv.Atoi(string) string轉成int64: int64, err := strconv.ParseInt(string, 10, 64) int轉成string: string := strconv.Itoa(int) int64轉成string: string := strconv.FormatInt(int64,10) ``` ## 4.1型別轉換 Go語言中不允許隱式轉換,所有型別轉換必須顯式宣告,而且轉換隻能發生在兩種相互相容的型別之間。 ```go var ch byte = 97 //var a int = ch //err, cannot use ch (type byte) as type int in assignment var a int = int(ch) ``` ## 4.2類型別名 ```go type bigint int64 //int64型別改名為bigint var x bigint = 100 type ( myint int //int改名為myint mystr string //string改名為mystr ) ``` # 5、檢視容量-cap ```go test:=[3]int{1,2,3} fmt.Println(test) fmt.Println(cap(test)) //3 ``` # 6、Map ```go 如下定義:只能儲存string型別的value。 mapStr := make(map[string]string) 如下定義:只能儲存int型別的value。 mapInt := make(map[string]int) 如下定義:可以儲存string、int等不同型別的value。 mapInterface := make(map[string]interface{}) 注意: 但是最後一種方法定義的map通過key取出來的value是一個interface{}型別,需要轉化才能直接使用。 eg: user := make(map[string]interface{})//可以存放string的key和任意型別的value user["age"] = 18 user["name"] = "jeff" //fmt.Println(user["id"]+1) 會報錯(mismatched types interface {} and int) fmt.Println(Args["id"].(int) +1) # 轉換 ``` # 7、iota列舉 常量宣告可以使用iota常量生成器初始化,它用於生成一組以相似規則初始化的常量,但是不用每行都寫一遍初始化表示式。 **在一個const宣告語句中,在第一個宣告的常量所在的行,iota將會被置為0,然後在每一個有常量宣告的行加一。** ```go const ( x = iota // x == 0 y = iota // y == 1 z = iota // z == 2 w // 這裡隱式地說w = iota,因此w == 3。其實上面y和z可同樣不用"= iota" ) const v = iota // 每遇到一個const關鍵字,iota就會重置,此時v == 0 const ( h, i, j = iota, iota, iota //h=0,i=0,j=0 iota在同一行值相同 ) const ( a = iota //a=0 b = "B" c = iota //c=2 d, e, f = iota, iota, iota //d=3,e=3,f=3 g = iota //g = 4 ) const ( x1 = iota * 10 // x1 == 0 y1 = iota * 10 // y1 == 10 z1 = iota * 10 // z1 == 20 ) ``` # 8、Constants ``` const ( true = 0 == 0 // Untyped bool. false = 0 != 0 // Untyped bool. ) ``` true and false are the two untyped boolean values. ``` const iota = 0 // Untyped int. ``` iota是一個預先宣告的識別符號,表示(通常帶括號的)const宣告中當前const規範的未型別化整數序號。 它是零索引的。 # 9、func append ``` func append(slice []Type, elems ...Type) []Type ``` append內建函式將元素追加到切片的末尾。 如果具有足夠的容量,則將目標切片為容納新元素。 如果沒有,將分配一個新的基礎陣列。 追加返回更新的切片。 因此,有必要將新增的結果儲存在通常包含切片本身的變數中: ``` slice = append(slice, elem1, elem2) slice = append(slice, anotherSlice...) ``` 作為一種特殊情況,將字串附加到位元組片是合法的,如下所示: ``` slice = append([]byte("hello "), "world"...) ``` # 10、func cap ``` func cap(v Type) int ``` cap內建函式根據其型別返回v的容量: ``` 陣列:v中的元素數(與len(v)相同)。 指向陣列的指標:* v中的元素數(與len(v)相同)。 切片:切片後可以達到的最大長度; 如果v為零,則cap(v)為零。 Channel:通道緩衝容量,以元素為單位; 如果v為零,則cap(v)為零。 ``` # 11、func close ``` func close(c chan<- Type) ``` close內建函式關閉一個通道,該通道必須為雙向或僅傳送。 它只能由傳送者執行,而不能由接收者執行,並且具有在接收到最後一個傳送的值之後關閉通道的作用。 從關閉的通道c接收到最後一個值之後,從c進行的任何接收都將成功完成而不會阻塞,返回通道元素的零值。 ``` x, ok := <-c ``` 對於關閉的頻道,也會將ok設定為false。 # 12、func complex ``` func complex(r, i FloatType) ComplexType func main() { //func complex(r, i FloatType) ComplexType x := complex(1,2) y := complex(3,4) fmt.Println(x) //(1+2i) fmt.Println(y) //(3+4i) fmt.Println(x*y) // (-5+10i) fmt.Println(real(x*y)) //-5 fmt.Println(imag(x*y)) //10 } ``` 複雜的內建函式根據兩個浮點值構造一個複雜的值。 實部和虛部必須具有相同的大小,即float32或float64(或可分配給它們),並且返回值將是對應的複數型別(對於float32,complex64,對於float64,complex128)。 # 13、func copy ``` func copy(dst, src []Type) int func main() { x := []int{1,2} y := []int{6,6,6,6,6} copy(x,y) //從y拷貝到x fmt.Println(x) // [6 6] fmt.Println(y) // [6 6 6 6 6] } ``` 內建複製功能將元素從源切片複製到目標切片。 (作為一種特殊情況,它還會將位元組從字串複製到位元組的一部分。)源和目標可能會重疊。 複製返回複製的元素數量,該數量將是len(src)和len(dst)的最小值。 # 14、func delete ``` func delete(m map[Type]Type1, key Type) ``` delete內建函式從map中刪除具有指定鍵(m [key])的元素。 如果m為nil或沒有這樣的元素,則delete為no-op。 # 15、func len ``` func len(v Type) int x := []int{1,2} fmt.Println(len(x)) //2 } ``` len內建函式根據其型別返回v的長度: ``` 陣列:v中的元素數。 指向陣列的指標:* v中的元素數(即使v為零)。 切片或map:v中的元素數量; 如果v為零,則len(v)為零。 字串:v中的位元組數。 Channel:在通道緩衝區中排隊(未讀)的元素數; 如果v為零,則len(v)為零。 ``` # 16、func make ``` func make(Type, size IntegerType) Type ``` make內建函式分配和初始化slice,map或chan型別的物件(僅)。 像new一樣,第一個引數是型別,而不是值。 與new不同,make的返回型別與其引數的型別相同,而不是指向它的指標。 結果的規格取決於型別: ``` 切片:大小指定長度。 切片的容量為等於它的長度。 可以提供第二個整數引數指定不同的容量; 它必須不小於長度,因此make([] int,0,10)分配長度為0的切片,容量10。 map:根據大小進行初始分配,但生成的map的長度為0。在這種情況下,可以省略大小 分配的起始大小較小。 Channel:使用指定的值初始化通道的緩衝區緩衝容量。 如果為零或忽略大小,則通道為 無緩衝的。 ``` # 17、func new ``` func new(Type) *Type ``` 新的內建函式分配記憶體。 第一個引數是型別,而不是值,返回的值是指向該型別新分配的零值的指標。 # 18、func panic ```go panic所定義的異常,是在程式執行到這裡才觸發,所以屬於執行時異常 我們在程式碼段中定義了一個error,這個error我們可以處理也可以不處理,它並不會影響程式繼續往下執行;但是如果在程式中定義了一個panic,那程式是一定不會往下執行。 ``` ``` Go語言追求簡潔優雅,所以,Go語言不支援傳統的 try…catch…finally 這種異常,因為Go語言的設計者們認為,將異常與控制結構混在一起會很容易使得程式碼變得混亂。因為開發者很容易濫用異常,甚至一個小小的錯誤都丟擲一個異常。在Go語言中,使用多值返回來返回錯誤。不要用異常代替錯誤,更不要用來控制流程。在極個別的情況下,也就是說,遇到真正的異常的情況下(比如除數為 0了)。才使用Go中引入的Exception處理:defer, panic, recover。 這幾個異常的使用場景可以這麼簡單描述:Go中可以丟擲一個panic的異常,然後在defer中通過recover捕獲這個異常,然後正常處理。 ``` ```go package main import "fmt" func main(){ defer func(){ // 必須要先宣告defer,否則不能捕獲到panic異常 fmt.Println("c") if err:=recover();err!=nil{ fmt.Println(err) // 這裡的err其實就是panic傳入的內容,55 } fmt.Println("d") }() //程式中斷,不會列印“b”,"f" f() } func f(){ fmt.Println("a") panic(55) fmt.Println("b") //程式中斷,不會走 fmt.Println("f") //程式中斷,不會走 } 輸出結果: a c 55 d ``` # 19、func imag ``` func imag(c ComplexType) FloatType ``` imag內建函式返回複數c的虛部。 返回值將是對應於c型別的浮點型別。 # 20、func real ``` func real(c ComplexType) FloatType ``` 實數內建函式返回複數c的實數部分。 返回值將是對應於c型別的浮點型別。 # 21、func recover ``` func recover() interface{} ``` 恢復內建功能允許程式管理緊急恐慌例程的行為。 在延遲函式(但不是由它呼叫的任何函式)中執行恢復呼叫將通過恢復正常執行來停止恐慌序列,並檢索傳遞給panic呼叫的錯誤值。 如果在延遲函式之外呼叫了restore,它將不會停止緊急處理序列。 在這種情況下,或者當goroutine沒有驚慌時,或者如果提供給panic的引數為nil,則restore返回nil。 因此,來自recovery的返回值將報告goroutine是否感到恐慌。 # 22、type ComplexType ``` type ComplexType complex64 ``` ComplexType在此處僅用於文件目的。 它是複雜型別(complex64或complex128)的替代。 # 23、type FloatType ``` type FloatType float32 ``` FloatType此處僅用於文件目的。 它是浮點型別的替代:float32或float64。 # 24、type IntegerType ``` type IntegerType int ``` IntegerType此處僅用於文件目的。 它是任何整數型別的替代:int,uint,int8等。 # 25、type Type ``` type Type int ``` 型別僅在此處用於文件目的。 它是任何Go型別的替代,但對於任何給定的函式呼叫都表示相同的型別。 ``` var nil Type // Type must be a pointer, channel, func, interface, map, or slice type ``` nil是預先宣告的識別符號,表示指標,通道,函式,介面,對映或切片型別的零值。 # 26、type Type1 ``` type Type1 int ``` Type1僅在此處用於文件目的。 它是任何Go型別的替代,但對於任何給定的函式呼叫都表示相同的型別。 # 27、type bool ``` type bool bool ``` bool是布林值(真和假)的集合。 # 28、type byte ``` type byte byte ``` byte是uint8的別名,在所有方面都等同於uint8。 按照慣例,它用於區分位元組值和8位無符號整數值。 # 29、type complex128 ``` type complex128 complex128 ``` complex128是具有float64實部和虛部的所有複數的集合。 # 30、type complex64 ``` type complex64 complex64 ``` complex64是具有float32實部和虛部的所有複數的集合。 # 31、type error ``` type error interface { Error() string } ``` 錯誤內建介面型別是用於表示錯誤情況的常規介面,其中nil值表示沒有錯誤。 # 32、type float32 ``` type float32 float32 ``` float32是所有IEEE-754 32位浮點數的集合。 # 33、type float64 ``` type float64 float64 ``` float64是所有IEEE-754 64位浮點數的集合。 # 34、type int ``` type int int ``` int是有符號整數型別,其大小至少為32位。 但是,它是一個獨特的型別,而不是int32的別名。 # 35、type int16 ``` type int16 int16 ``` int16是所有帶符號的16位整數的集合。 範圍:-32768至32767。 # 36、type int32 ``` type int32 int32 ``` int32是所有帶符號的32位整數的集合。 範圍:-2147483648至2147483647。 # 37、type int64 ``` type int64 int64 ``` int64是所有帶符號的64位整數的集合。 範圍:-9223372036854775808至9223372036854775807。 # 38、type int8 ``` type int8 int8 ``` int8是所有帶符號的8位整數的集合。 範圍:-128至127。 # 39、type rune ``` type rune rune ``` 符文是int32的別名,在所有方面都等同於int32。 按照慣例,它用於區分字元值和整數值。 # 40、type string ``` type string string ``` 字串是所有8位位元組字串的集合,通常是但不一定表示UTF-8編碼的文字。 字串可以為空,但不能為nil。 字串型別的值是不可變的。 # 41、type uint ``` type uint uint ``` uint是無符號整數型別,其大小至少為32位。 但是,它是一種獨特的型別,而不是uint32的別名。 # 42、type uint16 ``` type uint16 uint16 ``` uint16是所有無符號16位整數的集合。 範圍:0到65535。 # 43、type uint32 ``` type uint32 uint32 ``` uint32是所有無符號32位整數的集合。 範圍:0到4294967295。 # 44、type uint64 ``` type uint64 uint64 ``` uint64是所有無符號64位整數的集合。 範圍:0至18446744073709551615。 # 45、type uint8 ``` type uint8 uint8 ``` uint8是所有無符號的8位整數的集合。 範圍:0到255。 # 46、type uintptr ``` type uintptr uintptr ``` uintptr是一個整數型別,其大小足以容納任何指標的位