golang 函數(shù)以及函數(shù)和方法的詳解及區(qū)別
golang 函數(shù)以及函數(shù)和方法的區(qū)別
在接觸到go之前,我認(rèn)為函數(shù)和方法只是同一個(gè)東西的兩個(gè)名字而已(在我熟悉的c/c++,python,java中沒有明顯的區(qū)別),但是在golang中者完全是兩個(gè)不同的東西。官方的解釋是,方法是包含了接收者的函數(shù)。到底什么意思呢。
首先函數(shù)的格式是固定的,func+函數(shù)名+ 參數(shù) + 返回值(可選) + 函數(shù)體。例
func main() { fmt.Println("Hello go") }
在golang中有兩個(gè)特殊的函數(shù),main函數(shù)和init函數(shù),main函數(shù)不用介紹在所有語言中都一樣,它作為一個(gè)程序的入口,只能有一個(gè)。init函數(shù)在每個(gè)package是可選的,可有可無,甚至可以有多個(gè)(但是強(qiáng)烈建議一個(gè)package中一個(gè)init函數(shù)),init函數(shù)在你導(dǎo)入該package時(shí)程序會(huì)自動(dòng)調(diào)用init函數(shù),所以init函數(shù)不用我們手動(dòng)調(diào)用,l另外它只會(huì)被調(diào)用一次,因?yàn)楫?dāng)一個(gè)package被多次引用時(shí),它只會(huì)被導(dǎo)入一次。
package mypackage import ( "fmt" ) var I int func init() { I = 0 fmt.Println("Call mypackage init1") } func init() { I = 1 fmt.Println("Call mypackage init2") }
package main import ( "demo/mypackage" "fmt" ) func main() { fmt.Println("Hello go.... I = ", mypackage.I) }
運(yùn)行結(jié)果:
我們可以看到,程序?yàn)槲覀冏詣?dòng)調(diào)用了兩個(gè)init函數(shù),并且是按照順序調(diào)用的。
下面來看方法。
package main import "fmt" type myint int //乘2 func (p *myint) mydouble() int { *p = *p * 2 return 0 } //平方 func (p myint) mysquare() int { p = p * p fmt.Println("mysquare p = ", p) return 0 } func main() { var i myint = 2 i.mydouble() fmt.Println("i = ", i) i.mysquare() fmt.Println("i = ", i) }
運(yùn)行結(jié)果:
我們可以看到方法和函數(shù)的區(qū)別,方法在func關(guān)鍵字后是接收者而不是函數(shù)名,接收者可以是自己定義的一個(gè)類型,這個(gè)類型可以是struct,interface,甚至我們可以重定義基本數(shù)據(jù)類型。我們可以給他一些我們想要的方法來滿足我們的實(shí)際工程中的需求,就像上面一樣我重定義了int并給了它一個(gè)乘2和平法的方法,這里我們要注意一個(gè)細(xì)節(jié),接收者是指針和非指針的區(qū)別,我們可以看到當(dāng)接收者為指針式,我們可以通過方法改變?cè)摻邮照叩膶傩裕欠侵羔橆愋腿弊霾坏健?br />
這里的接收者和c++中的this指針有一些相似,我們可以把接受者當(dāng)作一個(gè)class,而這些方法就是類的成員函數(shù),當(dāng)接收者為指針類型是就是c++中的非const成員函數(shù),為非指針時(shí)就是const成員函數(shù),不能通過此方法改變累的成員變量。
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
Go實(shí)現(xiàn)簡(jiǎn)單的數(shù)據(jù)庫表轉(zhuǎn)結(jié)構(gòu)體詳解
這篇文章主要為大家介紹了Go實(shí)現(xiàn)簡(jiǎn)單的數(shù)據(jù)庫表轉(zhuǎn)結(jié)構(gòu)體詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01GoFrame框架Scan類型轉(zhuǎn)換實(shí)例
這篇文章主要為大家介紹了GoFrame框架Scan類型轉(zhuǎn)換的實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06go?打包運(yùn)行文件在windows,liunx運(yùn)行
這篇文章主要介紹了go?打包運(yùn)行文件在windows,liunx運(yùn)行的相關(guān)資料,需要的朋友可以參考下2023-11-11Go標(biāo)準(zhǔn)庫http?server的優(yōu)雅關(guān)閉深入理解
這篇文章主要為大家介紹了Go標(biāo)準(zhǔn)庫http?server的優(yōu)雅有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪關(guān)閉深入理解2024-01-01golang jwt+token驗(yàn)證的實(shí)現(xiàn)
這篇文章主要介紹了golang jwt+token驗(yàn)證的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10go數(shù)據(jù)結(jié)構(gòu)和算法BitMap原理及實(shí)現(xiàn)示例
這篇文章主要為大家介紹了go數(shù)據(jù)結(jié)構(gòu)和算法BitMap原理及實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07go從指定的URL下載圖片并保存到本地的代碼實(shí)現(xiàn)
這段代碼定義了一個(gè)名為 downloadImage 的函數(shù),其目的是從指定的URL下載圖片并保存到本地文件系統(tǒng),本文是對(duì)代碼功能的詳細(xì)描述,對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-08-08Go語言高效I/O并發(fā)處理雙緩沖和Exchanger模式實(shí)例探索
這篇文章主要介紹了Go語言高效I/O并發(fā)處理雙緩沖和Exchanger模式實(shí)例探索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01