函數(shù)屬于包,通過包調(diào)用函數(shù)。方法屬于結(jié)構(gòu)體,通過結(jié)構(gòu)體變量調(diào)用
如果方法的修改內(nèi)容需要調(diào)用者跟隨變化,接收者使用指針
函數(shù)不支持重載,嵌套和默認(rèn)參數(shù)
一個指針類型擁有它以及它的基底類型為接收者類型的所有方法,而它的基底類型卻只能擁有以它本身為接收者類型的方法
一.函數(shù)的定義
- 1 表達(dá)式作為返回值
func minus(a int,b int) int{
return a-b
}
- 2 定義變量接收返回值
func minus(a int,b int) int{
result:=a-b
return result
}
- 3 在函數(shù)定義時定義接收變量
func minus(a int,b int) (result int){
result=a-b
return
}
- 4.不定參函數(shù)
...
func minus(args ...int){
//1.
//for i := 0; i < len(args); i++ {
// fmt.Println("下標(biāo)",i,"值",args[i])
result:=0
for i := 0; i < len(args); i++ {
result+=args[i]
}
//第2種for循環(huán)
for _,data:=range args{
result+=data
}
fmt.Println(result)
}
func main() {
minus(1,2,3)
minus(1)
}
不定參函數(shù)傳遞它的不定參給函數(shù)時,傳遞方式為a[0:]...(傳遞所有參數(shù)),a[:3]...(從0開始傳遞到第3位(不含第3位))
二.函數(shù)的類型
- 1 無參有返回值.
func minus()(a,b,c int){
a,b,c=1,2,3
return
}
func main() {
//函數(shù)的返回值可以為主調(diào)函數(shù)賦值,可以通過返回值改變實參數(shù)據(jù)
a,b,c:=minus()
fmt.Println(a,b,c)
}
- 2 type自定義函數(shù)類型
package main
import "fmt"
func test1(){
fmt.Println("hello")
}
func test2(a int, b int) {
fmt.Println(a+b)
}
func test3(){
fmt.Println("你好")
}
//type定義函數(shù)類型
type NULL func()
type YOU func(int,int)
func main() {
//定義函數(shù)類型變量
var f NULL
f= test1
//通過函數(shù)變量調(diào)用函數(shù)
f()
var f1 YOU
f1=test2
f1(10,20)
//相同類型函數(shù),無需再次定義函數(shù)類型
f2:=test3
f2()
}
- defer函數(shù)屬延遲執(zhí)行,延遲到調(diào)用者函數(shù)執(zhí)行 return 命令前被執(zhí)行。多個defer之間按LIFO先進(jìn)后出順序執(zhí)行。通常用于釋放資源
- Go中可以拋出一個panic的異常,然后在defer中通過recover捕獲這個異常,然后正常處理。
- 如果同時有多defer,那么異常會被最近的recover()捕獲并正常處理。
4.無參匿名函數(shù)可以簡寫,如
{fmt.Println("hello")}
三、閉包
func test() func() int {
var a int
return func() int {
a++
return a * a
}
}
func main() {
f := test()
fmt.Println(f()) //1
fmt.Println(f()) //4
fmt.Println(f()) //9
fmt.Println(f()) //16
fmt.Println(f()) //25
}
a := 10
str := "lucy"
func() {
a = 666
str = "go"
fmt.Println(a, str) //666,"go"
}()
fmt.Println(a, str) //666,"go"
4. 擴(kuò)展方法
type A int
func (a *A) print() {
fmt.Println("A")
}
func main() {
var a A
a.print() //Method Value
(*A).print(&a) //Method Expressions
}