Go函數(shù)的使用示例教程
函數(shù)返回多個值
用法如下:
package main import ( "fmt" "strconv" ) // 返回多個返回值,無參數(shù)名 func MultFunc1(a int, b int) (int, string) { a = a + 1 b = b + 1 //數(shù)字轉(zhuǎn)字符串 itoa := strconv.Itoa(b) return a, itoa } // 返回多個返回值,有參數(shù)名 func MultFunc2(a int, b int) (r1 int, r2 int) { //形參有默認(rèn)值 是0 fmt.Println("形參r1: ", r1, "r2: ", r2) r1 = a + 1 r2 = b + 1 return } func MultFunc3(a int, b int) (int, int) { a = a + 1 b = b + 1 return a, b } func main() { var a, b = MultFunc1(1, 2) fmt.Println("a=", a, "b=", b) var c, d = MultFunc2(3, 4) fmt.Println("c=", c, "d=", d) var e, f = MultFunc3(5, 6) fmt.Println("e=", e, "f=", f) }
形參是有默認(rèn)值的 0 ""(空串) false
init函數(shù)和import
init函數(shù)
init函數(shù)可以在package main 中,可在其他package中,可在同一個package中出現(xiàn)多次
main函數(shù)
main 函數(shù)只能在package main中。
執(zhí)行順序
golang中有兩個保留的函數(shù):init函數(shù)(能夠應(yīng)用于所有的package)和main函數(shù)(只能用于package main)。這兩個函數(shù)在定義的時候不能有任何的返回值和參數(shù)
雖然package里面可以寫任意多個init函數(shù),但這無論是對于可讀性還是以后的可維護(hù)性來說都是不方便的,所以建議用戶在一個package中每個文件只寫一個init函數(shù)。
程序的初始化和執(zhí)行都始于main包
如果main包還導(dǎo)入了其它的包,那么就會在編譯時將它們依次導(dǎo)入。有時一個包會被多個包同時導(dǎo)入,那么它只會被導(dǎo)入一次(例如很多包可能都會用到fmt包,但它只會被導(dǎo)入一次,因?yàn)闆]有必要導(dǎo)入多次)。
當(dāng)一個包被導(dǎo)入時,如果該包還導(dǎo)入了其它的包,那么會先將其它包導(dǎo)入進(jìn)來,然后再對這些包中的包級常量和變量進(jìn)行初始化,接著執(zhí)行init函數(shù)(如果有的話),依次類推。
等所有被導(dǎo)入的包都加載完畢了,就會開始對main包中的包級常量和變量進(jìn)行初始化,然后執(zhí)行main包中的init函數(shù)(如果存在的話),最后執(zhí)行main函數(shù)。下圖詳細(xì)地解釋了整個執(zhí)行過程:
測試?yán)?/p>
代碼結(jié)構(gòu)如下
Lib1.go
package lib1 import "fmt" func init() { fmt.Print("我是lib1") } func Lib1Test() { fmt.Println("lib1Test") }
Lib2.go
package lib2 import ( "fmt" ) func init() { fmt.Print("我是Lib2") } func Lib2Test() { fmt.Println("lib2Test") }
main.go
注意:如果文中沒有使用,就需要家一個_
package main import ( "fmt" "goProject/aaa/lib1" "goProject/aaa/lib2" ) func init() { fmt.Print("我是Lib3.go") } func main() { lib1.Lib1Test() lib2.Lib2Test() }
注意看打印的結(jié)果
輸出的順序與我們上面圖給出的順序是一致的
函數(shù)的參數(shù)
函數(shù)如果使用參數(shù),該變量可稱為函數(shù)的形參
形參就像是定義在函數(shù)體內(nèi)的局部變量
調(diào)用函數(shù),可以通過兩種方式傳遞參數(shù):
值傳遞
值傳遞是指在調(diào)用函數(shù)的時候?qū)?shí)際的參數(shù)復(fù)制一份傳遞到函數(shù)中,這樣在函數(shù)中如果對參數(shù)進(jìn)行修改,則不會影響到實(shí)際的參數(shù)。
默認(rèn)情況下,Go 語言使用的是值傳遞,即在調(diào)用過程中不會影響到實(shí)際參數(shù)。
下面使用一個經(jīng)典的案例:兩數(shù)交換
package main import "fmt" // 值傳遞 func Swap1(a int, b int) { var temp = a a = b b = temp } // 引用傳遞 func Swap2(a *int, b *int) { var temp = *a *a = *b *b = temp } func main() { a := 1 b := 2 Swap1(a, b) fmt.Println("值傳遞 a=", a, "b=", b) Swap2(&a, &b) fmt.Println("引用傳遞 a=", a, "b=", b) }
執(zhí)行結(jié)果如下:
第一種值傳遞的方式交換失敗,是因?yàn)楦北究截?/p>
第一種是引用傳遞,他是傳遞地址,那么引出了指針
引用傳遞(指針)
指針在C++中有用到。引用傳遞是指在調(diào)用函數(shù)時將實(shí)際參數(shù)的地址傳遞到函數(shù)中,那么在函數(shù)中對參數(shù)所進(jìn)行的修改,將影響到實(shí)際參數(shù)。
詳情,可以去看看C++,我也去看看!
到此這篇關(guān)于Go函數(shù)的使用的文章就介紹到這了,更多相關(guān)Go函數(shù)使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go strconv包實(shí)現(xiàn)字符串和基本數(shù)據(jù)類型轉(zhuǎn)換的實(shí)例詳解
在Go語言(Golang)的編程實(shí)踐中,strconv包是一個非常重要的標(biāo)準(zhǔn)庫,它提供了在基本數(shù)據(jù)類型(如整型、浮點(diǎn)型、布爾型)和字符串之間的轉(zhuǎn)換功能,本文給大家介紹了關(guān)于Go語言字符串轉(zhuǎn)換strconv,需要的朋友可以參考下2024-09-09詳解Go語言如何實(shí)現(xiàn)中文簡繁轉(zhuǎn)換和拼音轉(zhuǎn)換
這篇文章主要為大家詳細(xì)介紹了在Go語言如何實(shí)現(xiàn)中文簡繁轉(zhuǎn)換和拼音轉(zhuǎn)換功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-02-02Golang實(shí)現(xiàn)SSH、SFTP操作小結(jié)
在日常的一些開發(fā)場景中,我們需要去和遠(yuǎn)程服務(wù)器進(jìn)行一些通信,本文主要介紹了Golang實(shí)現(xiàn)SSH、SFTP操作小結(jié),具有一定的參考價值,感興趣的可以了解一下2024-04-04Go?Error?嵌套實(shí)現(xiàn)創(chuàng)建方式
這篇文章主要介紹了Go?Error?嵌套到底是怎么實(shí)現(xiàn)的?大家都知道創(chuàng)建error有兩種方式分別是errors.new()另一種是fmt.errorf(),本文通過詳細(xì)例子給大家介紹,需要的朋友可以參考下2022-01-01