這篇文章主要介紹“Go語言函數(shù)和指針的概念是什么”的相關(guān)知識(shí),小編通過實(shí)際案例向大家展示操作過程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“Go語言函數(shù)和指針的概念是什么”文章能幫助大家解決問題。
創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括玉林網(wǎng)站建設(shè)、玉林網(wǎng)站制作、玉林網(wǎng)頁制作以及玉林網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,玉林網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到玉林省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!函數(shù)就是一段基本的代碼塊,一般用來對(duì)需要重復(fù)執(zhí)行的代碼進(jìn)行復(fù)用。在 go 中,函數(shù)是『一等公民』,這與 js 類似,也就是可以將函數(shù)當(dāng)做一個(gè)變量進(jìn)行傳遞。
由于是強(qiáng)類型語言,與 js 不同,在函數(shù)聲明的過程中,需要指定參數(shù)與返回值的類型。
func max (n1, n2 int) int { var result int if n1 >= n2 { result = n1 } if n1 < n2 { result = n2 } return result }
在聲明函數(shù)參數(shù)和類型的時(shí)候,與聲明變量類似,可以一次性指定多個(gè)參數(shù)的類型,也可以分別指定多個(gè)參數(shù)為不同類型。
func max (n1 int, n2 int) int { …… }
如果函數(shù)返回值有多個(gè),在指定返回類型的時(shí)候,需要指定每個(gè)返回值的類型。
func max (n1 int, n2 int) (error, int) { …… return errors.New(""), result }
上面的代碼,表示返回的時(shí)候需要返回兩個(gè)值,第一個(gè)值為 error 對(duì)象,用來表示執(zhí)行期間是否出現(xiàn)異常。這種方式也是 Node.js 中常見的 error-first callback 的寫法。
在 go 中,有兩個(gè)特殊函數(shù):main、init,這兩個(gè)函數(shù)聲明之后,一般不需要主動(dòng)調(diào)用,會(huì)有自動(dòng)執(zhí)行的機(jī)制。
func main()
main 函數(shù)是 go 語言中默認(rèn)的入口函數(shù),只能應(yīng)用于 package main 中,如果在其他的 package 中不會(huì)執(zhí)行。main 函數(shù)有如下幾點(diǎn)需要注意:
不能定義參數(shù);
不能定義返回值;
必須在 package main 中聲明;
func init()
init 函數(shù)所有的包啟動(dòng)的時(shí)候都會(huì)執(zhí)行,執(zhí)行時(shí)機(jī)比 main 函數(shù)早,與 main 函數(shù)一樣,不能定義參數(shù)和返回值。
package main import "fmt" func init() { fmt.Println("執(zhí)行 init 函數(shù)\n") } func main() { fmt.Println("執(zhí)行 main 函數(shù)\n") }
函數(shù)的調(diào)用比較簡(jiǎn)單,和其他編程語言類似,只需要將函數(shù)需要接受的參數(shù)傳入其中,在執(zhí)行結(jié)束后,就能得到對(duì)應(yīng)的返回值。
// 定義 max 函數(shù) func max (n1, n2 int) int { var result int if n1 >= n2 { result = n1 } if n1 < n2 { result = n2 } return result } func main () { var result = max(5, 100) fmt.Println("max return", result) }
匿名函數(shù)就是一個(gè)沒有定義函數(shù)名的函數(shù),匿名函數(shù)可以當(dāng)成一個(gè)值,將其賦值放到某個(gè)變量中。這也是之前為什么說函數(shù)是『一等公民』,就是可以將函數(shù)當(dāng)成一個(gè)變量。
var max = func (n1, n2 int) int { var result int if n1 >= n2 { result = n1 } if n1 < n2 { result = n2 } return result } var result = max(5, 100) fmt.Println("max return", result)
由于 go 中的函數(shù)是 『一等公民』,可以在聲明之后立即執(zhí)行,就是在函數(shù)聲明結(jié)束后,直接加上一個(gè)括號(hào),表示該函數(shù)會(huì)立即執(zhí)行,執(zhí)行之后的結(jié)果可以通過變量進(jìn)行接收。
import "math" var Pi = func () float64 { return math.Pi }() fmt.Println("PI =",Pi)
“閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)。在本質(zhì)上,閉包是將函數(shù)內(nèi)部和函數(shù)外部連接起來的橋梁。 ——百度百科
上面的描述來自百度百科,初次看概念比較難理解,如果站在使用的角度來說,閉包就是在一個(gè)函數(shù)調(diào)用后,返回另一個(gè)匿名函數(shù),并保持當(dāng)前函數(shù)內(nèi)的局部變量,可以給匿名函數(shù)引用。
下面我們可以簡(jiǎn)單實(shí)現(xiàn)一個(gè)迭代器函數(shù),該函數(shù)接受一個(gè)切片,返回一個(gè)匿名函數(shù),該匿名函數(shù)每次執(zhí)行,都會(huì)取出切片的一個(gè)值,直到全部讀取。
func generate(slice []int) func() (bool, int) { i := 0 length := len(slice) return func () (bool, int) { if i >= length { return true, 0 } var result = slice[i] i++ return false, result } } func main() { slice := []int{1, 2, 3, 4, 5} nextNum := generate(slice) done, result := nextNum() // 直到 done 不等于 false,才停止 for done == false { fmt.Println(result, done) done, result = nextNum() } fmt.Println(result, done) }
我們前面常說的變量指的一般是一個(gè)值,指針是指向該變量存儲(chǔ)在內(nèi)存的位置。指針也可以存儲(chǔ)在一個(gè)變量中,該變量稱為『指針變量』。
聲明指針變量時(shí),需要指針指向哪一種類型,因?yàn)椴煌愋偷闹翟趦?nèi)存占用的空間大小不一樣,僅僅知道內(nèi)存地址還是不夠,還需要知道該變量在內(nèi)存中占用多大空間。聲明指針變量只需要在類型前,加上 * 即可。
var point *int // 聲明 int 類型的指針
給指針變量賦值,需要在對(duì)應(yīng)類型的變量前加上&符號(hào),表示取出該變量的地址。
var i = 1 var point *int point = &i
一般情況下,我們傳入函數(shù)的參數(shù)僅為變量的值,這樣的傳遞被稱為值傳遞,在函數(shù)內(nèi)對(duì)參數(shù)修改也不會(huì)影響到外部變量。
func addOne(slice []int, number int) { slice = append(slice, number) fmt.Println("inner slice =", slice) } slice := []int{1, 2, 3} addOne(slice, 100) fmt.Println("outer slice =", slice)
上述代碼中,我們寫了一個(gè)函數(shù),會(huì)對(duì)傳入的切片追加一個(gè)值,調(diào)用之后,我們會(huì)發(fā)現(xiàn)外部切片的值并沒有發(fā)生變量。
如果需要外部變量的值會(huì)跟隨函數(shù)調(diào)用發(fā)生變化,就需要將變量的指針傳入函數(shù)中,這樣的傳遞被稱為引用傳遞。這樣在函數(shù)中修改參數(shù)就會(huì)影響到外部的變量了。
// 此時(shí) slice 為指針變量 func addOne(slice *[]int, number int) { // 通過 *slice 可以取出 slice 指針對(duì)應(yīng)的值 *slice = append(*slice, number) fmt.Println("inner slice =", *slice) } slice := []int{1, 2, 3} addOne(&slice, 100) fmt.Println("outer slice =", slice)
關(guān)于“Go語言函數(shù)和指針的概念是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。