1. 程式人生 > >golang 函式以及函式和方法的區別

golang 函式以及函式和方法的區別

golang 函式以及函式和方法的區別

2016年12月11日 20:12:54 D_Guco 閱讀數:10426更多

個人分類: golang

所屬專欄: golang學習

版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/D_Guco/article/details/53575067

在接觸到go之前,我認為函式和方法只是同一個東西的兩個名字而已(在我熟悉的c/c++,python,java中沒有明顯的區別),但是在golang中者完全是兩個不同的東西。官方的解釋是,方法是包含了接收者的函式。到底什麼意思呢。

首先函式的格式是固定的,func+函式名+ 引數 + 返回值(可選) + 函式體。例 

func main() 

{

fmt.Println("Hello go")

}

在golang中有兩個特殊的函式,main函式和init函式,main函式不用介紹在所有語言中都一樣,它作為一個程式的入口,只能有一個。init函式在每個package是可選的,可有可無,甚至可以有多個(但是強烈建議一個package中一個init函式),init函式在你匯入該package時程式會自動呼叫init函式,所以init函式不用我們手動呼叫,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函式,並且是按照順序呼叫的。

下面來看方法。

 

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)
}

執行結果:

我們可以看到方法和函式的區別,方法在func關鍵字後是接收者而不是函式名,接收者可以是自己定義的一個型別,這個型別可以是struct,interface,甚至我們可以重定義基本資料型別。我們可以給他一些我們想要的方法來滿足我們的實際工程中的需求,就像上面一樣我重定義了int並給了它一個乘2和平法的方法,這裡我們要注意一個細節,接收者是指標和非指標的區別,我們可以看到當接收者為指標式,我們可以通過方法改變該接收者的屬性,但是非指標型別缺做不到。

這裡的接收者和c++中的this指標有一些相似,我們可以把接受者當作一個class,而這些方法就是類的成員函式,當接收者為指標型別是就是c++中的非const成員函式,為非指標時就是const成員函式,不能通過此方法改變累的成員變數