golang 函數(shù)以及函數(shù)和方法的詳解及區(qū)別
golang 函數(shù)以及函數(shù)和方法的區(qū)別
在接觸到go之前,我認為函數(shù)和方法只是同一個東西的兩個名字而已(在我熟悉的c/c++,python,java中沒有明顯的區(qū)別),但是在golang中者完全是兩個不同的東西。官方的解釋是,方法是包含了接收者的函數(shù)。到底什么意思呢。
首先函數(shù)的格式是固定的,func+函數(shù)名+ 參數(shù) + 返回值(可選) + 函數(shù)體。例
func main()
{
fmt.Println("Hello go")
}
在golang中有兩個特殊的函數(shù),main函數(shù)和init函數(shù),main函數(shù)不用介紹在所有語言中都一樣,它作為一個程序的入口,只能有一個。init函數(shù)在每個package是可選的,可有可無,甚至可以有多個(但是強烈建議一個package中一個init函數(shù)),init函數(shù)在你導入該package時程序會自動調用init函數(shù),所以init函數(shù)不用我們手動調用,l另外它只會被調用一次,因為當一個package被多次引用時,它只會被導入一次。
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)
}
運行結果:

我們可以看到,程序為我們自動調用了兩個init函數(shù),并且是按照順序調用的。
下面來看方法。
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)
}
運行結果:

我們可以看到方法和函數(shù)的區(qū)別,方法在func關鍵字后是接收者而不是函數(shù)名,接收者可以是自己定義的一個類型,這個類型可以是struct,interface,甚至我們可以重定義基本數(shù)據(jù)類型。我們可以給他一些我們想要的方法來滿足我們的實際工程中的需求,就像上面一樣我重定義了int并給了它一個乘2和平法的方法,這里我們要注意一個細節(jié),接收者是指針和非指針的區(qū)別,我們可以看到當接收者為指針式,我們可以通過方法改變該接收者的屬性,但是非指針類型缺做不到。
這里的接收者和c++中的this指針有一些相似,我們可以把接受者當作一個class,而這些方法就是類的成員函數(shù),當接收者為指針類型是就是c++中的非const成員函數(shù),為非指針時就是const成員函數(shù),不能通過此方法改變累的成員變量。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關文章
使用client-go工具調用kubernetes API接口的教程詳解(v1.17版本)
這篇文章主要介紹了使用client-go工具調kubernetes API接口(v1.17版本),本文通過圖文實例相結合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-08-08
Golang教程之不可重入函數(shù)的實現(xiàn)方法
這篇文章主要給大家介紹了關于Golang教程之不可重入函數(shù)的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2018-09-09
詳解go-zero如何使用validator進行參數(shù)校驗
這篇文章主要介紹了如何使用validator庫做參數(shù)校驗的一些十分實用的使用技巧,包括翻譯校驗錯誤提示信息、自定義提示信息的字段名稱、自定義校驗方法等,感興趣的可以了解下2024-01-01

