函数,包及错误处理
#### Go 函數,包(一)
***天行健,兩儀遵道恒長***
##### 函數
是為了完成某一功能的程序語句的集合, 在Go 中函數分為自定義函數,系統函數
函數語法:
func 函數名(形參列表)(返回值列表){
函數語句
return 返回值列表
}
案例: package mainimport "fmt"func add(a,b int) int{return a + b } func main() {var sum intsum = add(10,20)fmt.Println(sum) }
##### 包
在開發中, 我們往往需要去調用其它文件中定義的函數;包的本質實際上就是創建不同的文件夾,來存放程序文件;
go 的每一個程序文件都屬于一個包,也可以說go 是以包的形式管理文件及項目目錄結構;
###### 包的作用:
1. 區分相同名字的函數,變量等標識符;
2. 可以很好的管理項目;
3. 控制函數,變量等訪問函數,也就是作用域;
package mainimport ("ReadingNovels/src/utils""fmt" )func main() {var sum intsum = utils.Add(10,20)fmt.Println(sum) }
包的注意事項:
在給一個文件打包時,該包對應一個文件夾,比如utils 文件對應的包名就是utils,文件的包名通常和文件所在的文件夾名一致,一般為小寫字母;
當一個文件夾要使用其它包函數或變量時,需要先引入包
1. 引入方式1: import "包名"
2. 引入方式2: import (
"包名"
"包名"
)
3. package 指令必須在第一行
4. 如果希望其它包訪問本包中的函數或變量,***函數名或變量需要首字母大寫***
5. 訪問時語法為包名.函數名或包名.變量名
6. 如果名包較長,可以給包取別名: 取完別名后,原來的包名將不能使用,必須使用新的包名;
7. 在同一包下不能有相同的函數名和全局變量名
8. 如果要編譯成一個可執行程序,需要將這個包聲明為main, 如果是一個庫,包名可以自定義; package main import (util "ReadingNovels/src/utils""fmt" )
---
###### 函數調用機制 package mainimport ("fmt" ) func add(a int){a += 10fmt.Println(a) // 11 }func main() {var sum = 1add(sum)fmt.Println(sum)//1 }
說明:
1. 在調用一個函數時,會給該函數分配一個新的空間,編譯器會通過自身的處理讓這個新的空間與其它空間分開;
2. 在每個函數對應的空間中,數據空間是獨立的,不是混淆;
3. 當一個函數調用完畢后,程序會銷毀這個函數對應的空間;
4. 對于上述例子: add 函數內部值變了, main 函數中值未改變
---
###### return
Go 中函數支持返回多個值
func 函數名(形參列表)(返回值列表){
函數體
return 返回值列表
}
1. 如果返回多個值,在接收時希望忽略某個值,使用"_"符號表示占位忽略;
2. 如果返回值只有一個,返回值列表可以不需要(); package mainimport ("fmt" ) func calc(a ,b int)(int,int){return a+b,a-b }func main() {var a = 1var b = 3sum,sub := calc(a,b)fmt.Println(sum,sub) //4,-2// 如果希望忽略某個值可以使用_sum,_ = calc(a,b) }
---
###### 遞歸函數
如果一個函數在函數體內又調用了本身,我們稱這個函數為遞歸函數; import "fmt"func recurse(n int){if n > 2 {n--recurse(n)fmt.Println(n)} } func main() {recurse(5) }
遞歸函數需要遵守的重要原則:
1. 遞歸必須向退出遞歸條件逼近, 否則就是無限遞歸;
2. 當一個函數執行完畢或者遇到return 就會返回,遵守誰調用就將結果返回給誰, 同時當函數執行完畢或者返回時,函數本身也會被系統銷毀; package mainimport "fmt"func recurse(n int)int{if n ==1 || n==2 {return 1}else {return recurse(n-1) + recurse(n-2)} } func main() {fmt.Println(recurse(8)) }
---
函數使用注意事項和細節
1. 函數的形參列表可以是多個,返回值列表也可以是多個;
2. 形參列表和返回值列表的數據類型可以是值類型,也可以是引用類型;
3. 函數的命名遵守標識符命名規范,首字母大寫表示該函數可以被本包文件和其它包文件使用,首字母小寫表示只能被本包文件使用;
4. 函數中的變量是局部的,函數外不生效;
5. 基本數據類型和數組默認都是值傳遞: 進行值拷貝,在函數內修改不影響原來的值;
6. 如果默認的數據類型希望在函數內修改,可以傳入變量的地址&,函數內以指針的方式 操作變量,類似引用;
7. Go 中函數不支持函數重載;
8. ***Go 中函數也是一種數據類型***,可以將函數賦值給一個變量,可以通過該變量對函數進行調用 ;
9. 函數可以做為形參傳入函數,并用調用;
10. 函數支持對返回值命名;
11. 支持可變參數; package mainimport "fmt"func test01(){var a intfmt.Println(a) // 0 } func test02(n int){n += 10fmt.Println(n) // 10 } func test03(n *int){*n += 10fmt.Println(*n) // 11 } func test04(n func()) {n() } func test05(n int)(res int){res += nreturn } func test06(a ...int){var count intfor _,v := range a {count += v}fmt.Println(count) } func main(){// fmt.Println(a)// 1. 函數是局部的,test01函數外沒有變量a// 2. 基本數據類型是值傳遞, 在函數內修改不影響原來的值var b inttest02(b)fmt.Println(b) // 0// 3. 基本數據類型希望在函數內修改,可以傳變量的地址;var c = 1test03(&c)fmt.Println(c) // 11// 4. 函數也是一種數據類型,可以賦值給一個變量var d func()d = test01d() // 0// 5. 函數可以作為形參傳入函數test04(d) // 0// 6. 函數支持對返回值命名res := test05(10) // 10fmt.Println(res)// 7. 函數支持可變參數test06(1,2,3,4,5,6) // 21// 切片可以作為可參數傳入函數,后面學習到切片時會詳細介紹var f = []int{1,2,3,4,5,6}test06(f...) //21 }
***天行健,兩儀遵道恒長***
##### 函數
是為了完成某一功能的程序語句的集合, 在Go 中函數分為自定義函數,系統函數
函數語法:
func 函數名(形參列表)(返回值列表){
函數語句
return 返回值列表
}
案例: package mainimport "fmt"func add(a,b int) int{return a + b } func main() {var sum intsum = add(10,20)fmt.Println(sum) }
##### 包
在開發中, 我們往往需要去調用其它文件中定義的函數;包的本質實際上就是創建不同的文件夾,來存放程序文件;
go 的每一個程序文件都屬于一個包,也可以說go 是以包的形式管理文件及項目目錄結構;
###### 包的作用:
1. 區分相同名字的函數,變量等標識符;
2. 可以很好的管理項目;
3. 控制函數,變量等訪問函數,也就是作用域;
package mainimport ("ReadingNovels/src/utils""fmt" )func main() {var sum intsum = utils.Add(10,20)fmt.Println(sum) }
包的注意事項:
在給一個文件打包時,該包對應一個文件夾,比如utils 文件對應的包名就是utils,文件的包名通常和文件所在的文件夾名一致,一般為小寫字母;
當一個文件夾要使用其它包函數或變量時,需要先引入包
1. 引入方式1: import "包名"
2. 引入方式2: import (
"包名"
"包名"
)
3. package 指令必須在第一行
4. 如果希望其它包訪問本包中的函數或變量,***函數名或變量需要首字母大寫***
5. 訪問時語法為包名.函數名或包名.變量名
6. 如果名包較長,可以給包取別名: 取完別名后,原來的包名將不能使用,必須使用新的包名;
7. 在同一包下不能有相同的函數名和全局變量名
8. 如果要編譯成一個可執行程序,需要將這個包聲明為main, 如果是一個庫,包名可以自定義; package main import (util "ReadingNovels/src/utils""fmt" )
---
###### 函數調用機制 package mainimport ("fmt" ) func add(a int){a += 10fmt.Println(a) // 11 }func main() {var sum = 1add(sum)fmt.Println(sum)//1 }
說明:
1. 在調用一個函數時,會給該函數分配一個新的空間,編譯器會通過自身的處理讓這個新的空間與其它空間分開;
2. 在每個函數對應的空間中,數據空間是獨立的,不是混淆;
3. 當一個函數調用完畢后,程序會銷毀這個函數對應的空間;
4. 對于上述例子: add 函數內部值變了, main 函數中值未改變
---
###### return
Go 中函數支持返回多個值
func 函數名(形參列表)(返回值列表){
函數體
return 返回值列表
}
1. 如果返回多個值,在接收時希望忽略某個值,使用"_"符號表示占位忽略;
2. 如果返回值只有一個,返回值列表可以不需要(); package mainimport ("fmt" ) func calc(a ,b int)(int,int){return a+b,a-b }func main() {var a = 1var b = 3sum,sub := calc(a,b)fmt.Println(sum,sub) //4,-2// 如果希望忽略某個值可以使用_sum,_ = calc(a,b) }
---
###### 遞歸函數
如果一個函數在函數體內又調用了本身,我們稱這個函數為遞歸函數; import "fmt"func recurse(n int){if n > 2 {n--recurse(n)fmt.Println(n)} } func main() {recurse(5) }
遞歸函數需要遵守的重要原則:
1. 遞歸必須向退出遞歸條件逼近, 否則就是無限遞歸;
2. 當一個函數執行完畢或者遇到return 就會返回,遵守誰調用就將結果返回給誰, 同時當函數執行完畢或者返回時,函數本身也會被系統銷毀; package mainimport "fmt"func recurse(n int)int{if n ==1 || n==2 {return 1}else {return recurse(n-1) + recurse(n-2)} } func main() {fmt.Println(recurse(8)) }
---
函數使用注意事項和細節
1. 函數的形參列表可以是多個,返回值列表也可以是多個;
2. 形參列表和返回值列表的數據類型可以是值類型,也可以是引用類型;
3. 函數的命名遵守標識符命名規范,首字母大寫表示該函數可以被本包文件和其它包文件使用,首字母小寫表示只能被本包文件使用;
4. 函數中的變量是局部的,函數外不生效;
5. 基本數據類型和數組默認都是值傳遞: 進行值拷貝,在函數內修改不影響原來的值;
6. 如果默認的數據類型希望在函數內修改,可以傳入變量的地址&,函數內以指針的方式 操作變量,類似引用;
7. Go 中函數不支持函數重載;
8. ***Go 中函數也是一種數據類型***,可以將函數賦值給一個變量,可以通過該變量對函數進行調用 ;
9. 函數可以做為形參傳入函數,并用調用;
10. 函數支持對返回值命名;
11. 支持可變參數; package mainimport "fmt"func test01(){var a intfmt.Println(a) // 0 } func test02(n int){n += 10fmt.Println(n) // 10 } func test03(n *int){*n += 10fmt.Println(*n) // 11 } func test04(n func()) {n() } func test05(n int)(res int){res += nreturn } func test06(a ...int){var count intfor _,v := range a {count += v}fmt.Println(count) } func main(){// fmt.Println(a)// 1. 函數是局部的,test01函數外沒有變量a// 2. 基本數據類型是值傳遞, 在函數內修改不影響原來的值var b inttest02(b)fmt.Println(b) // 0// 3. 基本數據類型希望在函數內修改,可以傳變量的地址;var c = 1test03(&c)fmt.Println(c) // 11// 4. 函數也是一種數據類型,可以賦值給一個變量var d func()d = test01d() // 0// 5. 函數可以作為形參傳入函數test04(d) // 0// 6. 函數支持對返回值命名res := test05(10) // 10fmt.Println(res)// 7. 函數支持可變參數test06(1,2,3,4,5,6) // 21// 切片可以作為可參數傳入函數,后面學習到切片時會詳細介紹var f = []int{1,2,3,4,5,6}test06(f...) //21 }
個人微信公眾號上有最近文章,歡迎大家關注,一同交流學習;
轉載于:https://www.cnblogs.com/Mail-maomao/p/11411754.html
總結
- 上一篇: app.vue添加子组件
- 下一篇: Go 函数,包(二)