函数、包,字符串处理,错误处理
函數的基本概率
為完成某一功能的程序指令(語句)的集合,稱為函數。
在Go中,函數分為:自定義函數,系統函數(Go編程手冊中的package builtin包中,可以直接使用,不需要引包)
函數的基本語法
func 函數名 (形參列表)(返回值列表){
執行語句…
return 返回值列表
}
1)形參列表:表示函數的輸入
2)函數中的語句:表示為了實現某一功能代碼塊
3)函數可以有返回值,也可以沒有
包的三大作用
包使用的注意事項和細節討論
1)在給一個文件打包時,該包對應一個文件夾,比如這里的utils文件夾對應的包名就是utils文件的包名通常和文件所在的文件夾名一致,一般為小寫字母。
2)當一個文件要使用其它包函數或變量時,需要引入對應的包
引入方式1: import “包名”
引入方式2:import(
“包名”
“包名”
)
package 指令在文件第一行,然后是import指令。
在import包,路徑從$GOPATH的src下開始,不用帶src,編譯器會自動從src下開始引入。
3)為了讓其它包的文件,可以訪問到本包的函數,則該函數名的首字母需要大寫,類似其它語言的public修飾符,這樣才能跨包訪問。
4)在訪問其它包函數,變量時,其語法是 包名.函數名
5)如果包名較長,Go支持給包取別名,注意細節:取別名后,原來的包名就不能使用 了。
6)在同一包下,不能有相同的函數名(也不能有相同的全局變量名)否則報重復定義。
7)如果你要編譯一個可執行程序文件,就需要將這個包聲明為main,即package main這個就是一個語法規范,如果你是寫一個庫,包名可以自定義。
函數使用的注意事項和細節討論
1)函數的形參列表可以是多個,返回值列表也可以是多個。
2)形參列表和返回值列表的數據類型可以是值類型和引用類型。
3)函數的命名遵循標識符命名規范,首字母不能是數字,首字母大寫該函數可以被本包文件和其它包文件使用,類似public,首字母小寫,只能被本包文件使用,其它包文件不能使用,類似privat.
4)函數中的變量是局部的,函數外不生效。
5)基本數據類型和數組默認都是值傳遞,即進行值拷貝,在函數內修改,不會影響到原來的值。
6)如果希望函數內的變量能修改函數外的變量(指的是默認以值傳遞的數據類型)可以傳入變量的地址&,函數內以指針的方式操作變量。
7)Go函數不支持函數重載。
8)在Go中,函數也是一種數據類型,可以賦值給一個變量,則該變量就是一個函數類型的變量了,通過該變量可以對函數調用。
9)函數既然是一種數據類型,因此在Go中,函數可以作為形參,并且調用
10)為了簡化數據類型定義,Go支持自定義數據類型
基本語法: type 自定義數據類型名 數據類型 //相等于一個別名
案例 : type myInt int //這時myInt 就等價int 來使用了
11)支持對函數返回值命名
12)使用 _ 標識符,忽略返回值
13)Go支持可變參數
//支持0到多個參數
func sum(args… int)sum int {
}
//支持1到多個參數
func sum(n1 int,args… int)sum int{
}
(1)args是slice切片,通過args[index]可以訪問到各個值
(2)如果一個函數的形參列表中有可變參數,則可變參數需要放到形參列表最后。
init函數
每一個源文件都可以包含一個init函數,該函數會在main函數執行前,被Go運行框架調用,也就是說init會在main函數前被調用。
閉包
基本介紹:閉包就是一個函數和與其相關的引用環境組合的一個整體(實體)
1)AddUpper是一個函數,返回的數據類型是fun(int) int
2)閉包的說明:返回的是一個匿名函數,但是這個匿名函數引用到函數外的n,因此這個匿名函數就和n形成一個整體,構成閉包。
3)閉包是類,函數是操作,n是字段。函數和它使用到n構成閉包。
4)當我們反復的調用f函數時,因為n是初始化一次,因此每調用一次就累加。
5)閉包的關鍵就是,分析出返回的函數它使用(引用)到那些變量,因為函數和它引用到的變量共同構成閉包。
體會閉包的好處,如果使用傳統的方法,需要每次都傳入后綴名。
函數的defer
為什么需要defer
在函數中,程序員經常需要創建資源,(比如:數據連接,文件句柄,鎖等),為了在函數執行完畢后,及時的釋放資源,Go的設計者提供defer(延時機制)
函數參數傳遞方式
1)值傳遞
2)引用傳遞
不管是值傳遞還是引用傳遞,傳遞給函數的都是變量的副本,不同的是,值傳遞的是值的拷貝,引用傳遞的是傳遞地址的是拷貝,一般類來說,地址拷貝效率高,因為數據量小,而值拷貝決定拷貝的數據大小,數據越大,效率越低。
(1)值類型:基本數據類型 int 系列,float系列,bool,string,數組和結構體struct
(2)引用類型: 指針,slice切片,map,管道chan,interface等都是引用類型
字符串常用的系統函數
1)統計字符串的長度,按字節 len(str)
2)字符串遍歷,同時處理有中文的問題 r := []rune(str)
3)字符串轉整數 n,err := strconv.Atoi(“12”)
4)整數轉字符串 str = strconv.Itoa(12345)
5)字符串轉 []byte var bytes = []byte(“hello go”)
6) []byte 轉 字符串 str = string([]byte{97,98,99})
7)10進制 轉 2 , 8 , 16進制 str = strconv.FormatInt(123,2) //2代表二進制
8)查找子串是否在指定的字符串中 strings.Contains(“seafood”,“foo”) //true
9)統計一個字符串有幾個指定的子串 strings.Count(“ceheese”,“e”)
10)不區分大小寫的字符串比較 (==是區分字母大小寫的)strings.EqualFold(“abc”,“Abc”) //true
11)返回子串在字符串第一次出現的index值,如果沒有返回-1 ,strings.Index(“NLT_abc”,“abc”) //4
12)返回子串在字符串最后一次出現的index,如沒有返回-1 strings.LastIndex(“go golang”,“go”) //3
13)將指定的子串替換成 另外一個子串 strings.Replace(“go go hello”,“go”,“go語言”,n) n可以指定你希望替換幾個,n= -1 全部替換
14)按照指定的某個字符,為分割標識,將一個字符串分成字符串數組: strings.Split(“hello,wrold,ok”,“,”)
15)將字符串的字母進行大小寫的轉換 strings.ToLower(“Go”) strings.ToUpper(“Go”)
16)將字符串左右兩邊的空格去掉 strings.TrimSpace(“tn a lone go peh nte “)
17)將字符串左右兩邊指定的字符串去掉 strings.Trim(”!hello!”,“!”)
18)將字符串左邊的指定的字符去掉 strings.TrimLeft(“!hello!”,“!”)
19)將字符串右邊的指定的字符去掉 strings.TrimRight(“!hello!”,“!”)
20)判斷字符串是否以指定的字符串開頭 strings.HasPrefix(“ftp://192.168”,“ftp”)
21)判斷字符串是否以指定的字符串結束 strings.HasSuffix(“NLT_abc.jpg”,“jpg”)
時間和日期相關的函數
1)time.Time 類型 ,用于表示時間
2)獲取當前時間 time.Now()
3)格式化日期時間
“2006/01/02 15:04:05” 這個字符串的各個數字是固定的,必須是這樣寫
常用的作用:在程序中可用于獲取指定時間單位的時間,比如想得到100毫秒100*time.Millisecond
time的Unix和UnixNano的方法
錯誤處理
總結
以上是生活随笔為你收集整理的函数、包,字符串处理,错误处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2019第七次作业
- 下一篇: 函数的参数、返回、调用、递归