Go 常用函数
#### Go 常用函數,錯誤處理
這一節我們來學習一下Go 常用的函數,這些函數有些是內置的,有些是官方標準庫內的, 熟悉這些函數對程序開發來講還是很重要的;
1. len("abc") 統計字符串的字節長度 fmt.Println(len("abc,我")) // 4 + 3 = 7 中文字符占三個字節
2. strconv.Atoi("11") 將字符串轉為整數 var str = "11"s,err := strconv.Atoi(str)fmt.Println(s,err) // 11 nil , 默認如果沒有錯誤,返回nil
3. strconv.Itoa(11) 將整數轉為字符串 var a = 11s := strconv.Itoa(a)fmt.Println(s) // 11,默認情況下,如果轉換不成功返回空字符串
4. strconv.FormatInt(11,2) 將int64 類型的整數轉為2,8,16 進制的字符串 var a int64 = 11fmt.Println(strconv.FormatInt(a,10)) // 11fmt.Println(strconv.FormatInt(a,2)) // 1011fmt.Println(strconv.FormatInt(a,8)) // 13fmt.Println(strconv.FormatInt(a,16)) // b
5. []byte("abc") 將字符串轉為字節切片 var a = "abc"fmt.Println([]byte(a)) // [97 98 99]
6. []rune("你好") 將包含中文或其它語言的字符串轉為rune 字節切片 var a = "你好"fmt.Println([]rune(a)) // [20320 22909] unicode 編碼
7. strings.Contains("abc","a") 判斷字符串是否包含目標字符 fmt.Println(strings.Contains("abc","a")) // true
8. strings.Count("abc","a") 統計字符串中出現目標字符的個數 fmt.Println(strings.Count("abaac","a")) // 3
9. strings.EqualFold("abc","ABC") 不區分大小寫的字符串比較 fmt.Println(strings.EqualFold("abc","ABC")) // true
10. strings.Index("aabbcc","a") 查詢目標字符中字符串中首次出現的索引(下標)值 fmt.Println(strings.Index("aabbcc","a")) // 0
11. strings.LastIndex("aabbcc","a") 查詢目標字符中字符串中最后一次出現的索引(下標)值 fmt.Println(strings.LastIndex("aabbcc","a")) // 1
12. strings.Replace("aabbcc","a","d",-1) 將指定的字符串替換為另一個字符串,可以指定替換個數 // -1 表示替換所有的目標字符fmt.Println(strings.Replace("aabbcc","a","d",-1)) // ddbbcc
13. strings.Split("aa,bb,cc",",") 將字符串按指定的字符轉換成***字符串切片*** fmt.Println(strings.Split("aa,bb,cc",",")) // [aa bb cc]
14. strings.ToUpper("aa") 將字符串轉為大寫 fmt.Println(strings.ToUpper("aa")) // AA
15. strings.ToLower("AA") 將字符串轉為小寫 fmt.Println(strings.ToUpper("AA")) // aa
16. strings.TrimSpace(" aa bb cc ") 將字符串左右兩邊的空格去掉 fmt.Println(strings.TrimSpace(" aa bb cc ")) // aa bb cc
17. strings.Trim(",aa,bb,cc,",",") 將字符串左右兩邊指定的字符去掉 fmt.Println(strings.Trim(",aa,bb,cc,",",")) // aa,bb,cc
18. strings.TrimLeft(",aa,bb,cc,",",") 將字符串左邊指定的字符去掉 fmt.Println(strings.TrimLeft(",aa,bb,cc,",",")) // aa,bb,cc,
19. strings.TrimRight(",aa,bb,cc,",",") 將字符串右邊指定的字符去掉 fmt.Println(strings.TrimRight(",aa,bb,cc,",",")) // ,aa,bb,cc
20. strings.HasPrefix("http://127.0.0.1","http") 判斷字符串是否以指定的字符開頭 fmt.Println(strings.HasPrefix("http://127.0.0.1","http")) // true
21. strings.HasSuffix("abc.jpg","jpg") 判斷字符串是否以指定的字符結尾 fmt.Println(strings.HasSuffix("abc.jpg","jpg")) // true
---
##### 時間和日期相關的函數
時間和日期相關的函數需要導入time 包
時間的類型為: time.Time
時間常量: const (Nanosecond Duration = 1 // 納秒Microsecond = 1000 * Nanosecond // 微秒Millisecond = 1000 * Microsecond // 毫秒Second = 1000 * Millisecond // 秒Minute = 60 * Second // 分Hour = 60 * Minute // 小時 )
---
###### 內置函數
Go 中提供了一些函數, 這些函數可以直接使用,稱為內置函數
1. len: 用來求長試, 如: string,array,slice,map,channel ;
2. new: 用來分配內存主要用來分配值類型的,如: int,float64,struct 等, 返回的是對應值類型的指針;
3. make: 用來分配內存,主要用來分配引用類型,如: channel,map,slice.
4. make 的作用,稍后學習到復合數據類型時再詳細學習,這里先學習一下用法 package mainimport "fmt" func main(){var a *int // 定義變量a 的類型為 *int , int 類型的指針a = new(int) // 用new 來分配內存fmt.Printf("a value is %p\n",a) // 變量的a 的值, 實際是上一步new 出來的地址: 0xc000010098fmt.Printf("a address is %p\n",&a) // 變量a 的地址, 變量a 本身的自己的地址: 0xc000006028*a = 100 // 將a 的地址指向值100fmt.Println(*a)// 對比一下傳統的變量聲明var b intb = 100fmt.Printf("b value is %d\n",b)fmt.Printf("b address is %p\n",&b)// 用new 方式// a --> 0xc000010098 --> 100// 用普通方式// b --> 100//// makevar c []intc = make([]int,1) // 為引用類型c(切片),分配內存,如果不分配內存(聲明的方式)是不可以使用的// 這里重新強調一下變量的幾種聲明方式// 1. 顯示聲明變量的類型,再賦值,var b int , b = 100 ;此種方式聲明的引用類型的變量必須make,否則變量無法使用 // 2. 直接為變量賦值, 編譯器為推斷變量的類型, var b = 100; 此種方式聲明的引用類型的變量也必須make,否則變量無法使用// 3. 短變量聲明,只適用為函數內部, b := 100c[1] = 10fmt.Println(c) }
---
##### 錯誤處理
1. 默認情況下,當程序發生panic 錯誤后,程序就會退出;
2. 實際上有的錯誤并不需要退出,為了保證程序能正常的運行,我們可以捕捉錯誤,并進行錯誤處理;
3. Go 中不支持傳統的try...catch...finally 這種語法, 它的錯誤捕捉處理方式為: defer panic,recover; package mainimport "fmt"func test01(){// 使用defer recover 來捕捉錯誤defer func() {r := recover()if r != nil {fmt.Println("捕捉到了錯誤,需要處理")fmt.Println(r)}}()a := 10var b intres := a / b // 除數不能為0, 所以這個地方會導致程序panic , 也就是崩潰,加入錯誤處理機制后可保證程序正常運行// 如果沒有defer recover 程序到這里就退出了; fmt.Println(res)} func main(){test01()fmt.Println("錯誤處理后,還能正常運行") }
---
##### 自定義錯誤
自定義錯誤,需要用來errors 包和panic 函數;
errors.New("string") 返回一個錯誤類型的值,表示一個錯誤
panic 是一個內置函數,接收一個interface 的值(可以接收任意值),輸出錯誤信息,并退出程序; package mainimport ("errors""fmt" )func test01()(err error){defer func() {r := recover()if r != nil {// 自定義錯誤err = errors.New("something is wrong")return}}()var a = 10var b intres := a / bfmt.Println(res)return nil } func main() {err := test01()if err != nil {panic("test01 is wrong") // 報出錯誤,并退出程序}fmt.Println("main is running") }
這一節我們來學習一下Go 常用的函數,這些函數有些是內置的,有些是官方標準庫內的, 熟悉這些函數對程序開發來講還是很重要的;
1. len("abc") 統計字符串的字節長度 fmt.Println(len("abc,我")) // 4 + 3 = 7 中文字符占三個字節
2. strconv.Atoi("11") 將字符串轉為整數 var str = "11"s,err := strconv.Atoi(str)fmt.Println(s,err) // 11 nil , 默認如果沒有錯誤,返回nil
3. strconv.Itoa(11) 將整數轉為字符串 var a = 11s := strconv.Itoa(a)fmt.Println(s) // 11,默認情況下,如果轉換不成功返回空字符串
4. strconv.FormatInt(11,2) 將int64 類型的整數轉為2,8,16 進制的字符串 var a int64 = 11fmt.Println(strconv.FormatInt(a,10)) // 11fmt.Println(strconv.FormatInt(a,2)) // 1011fmt.Println(strconv.FormatInt(a,8)) // 13fmt.Println(strconv.FormatInt(a,16)) // b
5. []byte("abc") 將字符串轉為字節切片 var a = "abc"fmt.Println([]byte(a)) // [97 98 99]
6. []rune("你好") 將包含中文或其它語言的字符串轉為rune 字節切片 var a = "你好"fmt.Println([]rune(a)) // [20320 22909] unicode 編碼
7. strings.Contains("abc","a") 判斷字符串是否包含目標字符 fmt.Println(strings.Contains("abc","a")) // true
8. strings.Count("abc","a") 統計字符串中出現目標字符的個數 fmt.Println(strings.Count("abaac","a")) // 3
9. strings.EqualFold("abc","ABC") 不區分大小寫的字符串比較 fmt.Println(strings.EqualFold("abc","ABC")) // true
10. strings.Index("aabbcc","a") 查詢目標字符中字符串中首次出現的索引(下標)值 fmt.Println(strings.Index("aabbcc","a")) // 0
11. strings.LastIndex("aabbcc","a") 查詢目標字符中字符串中最后一次出現的索引(下標)值 fmt.Println(strings.LastIndex("aabbcc","a")) // 1
12. strings.Replace("aabbcc","a","d",-1) 將指定的字符串替換為另一個字符串,可以指定替換個數 // -1 表示替換所有的目標字符fmt.Println(strings.Replace("aabbcc","a","d",-1)) // ddbbcc
13. strings.Split("aa,bb,cc",",") 將字符串按指定的字符轉換成***字符串切片*** fmt.Println(strings.Split("aa,bb,cc",",")) // [aa bb cc]
14. strings.ToUpper("aa") 將字符串轉為大寫 fmt.Println(strings.ToUpper("aa")) // AA
15. strings.ToLower("AA") 將字符串轉為小寫 fmt.Println(strings.ToUpper("AA")) // aa
16. strings.TrimSpace(" aa bb cc ") 將字符串左右兩邊的空格去掉 fmt.Println(strings.TrimSpace(" aa bb cc ")) // aa bb cc
17. strings.Trim(",aa,bb,cc,",",") 將字符串左右兩邊指定的字符去掉 fmt.Println(strings.Trim(",aa,bb,cc,",",")) // aa,bb,cc
18. strings.TrimLeft(",aa,bb,cc,",",") 將字符串左邊指定的字符去掉 fmt.Println(strings.TrimLeft(",aa,bb,cc,",",")) // aa,bb,cc,
19. strings.TrimRight(",aa,bb,cc,",",") 將字符串右邊指定的字符去掉 fmt.Println(strings.TrimRight(",aa,bb,cc,",",")) // ,aa,bb,cc
20. strings.HasPrefix("http://127.0.0.1","http") 判斷字符串是否以指定的字符開頭 fmt.Println(strings.HasPrefix("http://127.0.0.1","http")) // true
21. strings.HasSuffix("abc.jpg","jpg") 判斷字符串是否以指定的字符結尾 fmt.Println(strings.HasSuffix("abc.jpg","jpg")) // true
---
##### 時間和日期相關的函數
時間和日期相關的函數需要導入time 包
時間的類型為: time.Time
時間常量: const (Nanosecond Duration = 1 // 納秒Microsecond = 1000 * Nanosecond // 微秒Millisecond = 1000 * Microsecond // 毫秒Second = 1000 * Millisecond // 秒Minute = 60 * Second // 分Hour = 60 * Minute // 小時 )
package mainimport ("fmt""math""time" )func main() {now := time.Now()fmt.Printf("now value is %v,now type is %T\n", now, now)// 獲得到具體的時間fmt.Println(now.Year()) // 年fmt.Println(now.Month()) // 月fmt.Println(now.Day()) // 日fmt.Println(now.Hour()) // 時fmt.Println(now.Minute()) // 分fmt.Println(now.Second()) // 秒fmt.Println(now.Date()) // 日期// 格式化日期// 2006-01-02 15:04:05 這6個數字是固定的,必須這樣寫, 位置可以隨意更改,其中15,也可以寫成03,代表24時制和12小時制fmt.Println(now.Format("2006-01-02 15:04:05"))fmt.Println(now.Unix()) // 從1970-01-01 到現在經過的的時間: 秒fmt.Println(now.UnixNano()) // 從1970-01-01 到現在經過的的時間: 納秒, 如果超過int64 表示的范圍,結果將溢出fmt.Println(math.MaxInt64) // int64 能表示的最大范圍 }
---
###### 內置函數
Go 中提供了一些函數, 這些函數可以直接使用,稱為內置函數
1. len: 用來求長試, 如: string,array,slice,map,channel ;
2. new: 用來分配內存主要用來分配值類型的,如: int,float64,struct 等, 返回的是對應值類型的指針;
3. make: 用來分配內存,主要用來分配引用類型,如: channel,map,slice.
4. make 的作用,稍后學習到復合數據類型時再詳細學習,這里先學習一下用法 package mainimport "fmt" func main(){var a *int // 定義變量a 的類型為 *int , int 類型的指針a = new(int) // 用new 來分配內存fmt.Printf("a value is %p\n",a) // 變量的a 的值, 實際是上一步new 出來的地址: 0xc000010098fmt.Printf("a address is %p\n",&a) // 變量a 的地址, 變量a 本身的自己的地址: 0xc000006028*a = 100 // 將a 的地址指向值100fmt.Println(*a)// 對比一下傳統的變量聲明var b intb = 100fmt.Printf("b value is %d\n",b)fmt.Printf("b address is %p\n",&b)// 用new 方式// a --> 0xc000010098 --> 100// 用普通方式// b --> 100//// makevar c []intc = make([]int,1) // 為引用類型c(切片),分配內存,如果不分配內存(聲明的方式)是不可以使用的// 這里重新強調一下變量的幾種聲明方式// 1. 顯示聲明變量的類型,再賦值,var b int , b = 100 ;此種方式聲明的引用類型的變量必須make,否則變量無法使用 // 2. 直接為變量賦值, 編譯器為推斷變量的類型, var b = 100; 此種方式聲明的引用類型的變量也必須make,否則變量無法使用// 3. 短變量聲明,只適用為函數內部, b := 100c[1] = 10fmt.Println(c) }
---
##### 錯誤處理
1. 默認情況下,當程序發生panic 錯誤后,程序就會退出;
2. 實際上有的錯誤并不需要退出,為了保證程序能正常的運行,我們可以捕捉錯誤,并進行錯誤處理;
3. Go 中不支持傳統的try...catch...finally 這種語法, 它的錯誤捕捉處理方式為: defer panic,recover; package mainimport "fmt"func test01(){// 使用defer recover 來捕捉錯誤defer func() {r := recover()if r != nil {fmt.Println("捕捉到了錯誤,需要處理")fmt.Println(r)}}()a := 10var b intres := a / b // 除數不能為0, 所以這個地方會導致程序panic , 也就是崩潰,加入錯誤處理機制后可保證程序正常運行// 如果沒有defer recover 程序到這里就退出了; fmt.Println(res)} func main(){test01()fmt.Println("錯誤處理后,還能正常運行") }
---
##### 自定義錯誤
自定義錯誤,需要用來errors 包和panic 函數;
errors.New("string") 返回一個錯誤類型的值,表示一個錯誤
panic 是一個內置函數,接收一個interface 的值(可以接收任意值),輸出錯誤信息,并退出程序; package mainimport ("errors""fmt" )func test01()(err error){defer func() {r := recover()if r != nil {// 自定義錯誤err = errors.New("something is wrong")return}}()var a = 10var b intres := a / bfmt.Println(res)return nil } func main() {err := test01()if err != nil {panic("test01 is wrong") // 報出錯誤,并退出程序}fmt.Println("main is running") }
個人微信公眾號上有最新文章: 歡迎大家關注一同學習交流
轉載于:https://www.cnblogs.com/Mail-maomao/p/11411793.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
- 上一篇: Go 函数,包(二)
- 下一篇: Go 数组与切片