詳解Go函數(shù)和方法之間有什么區(qū)別
基礎(chǔ)知識(shí)
在了解兩者不同之前,還是簡(jiǎn)單的回顧一下基礎(chǔ)語法知識(shí)。下面的實(shí)例,定義一個(gè)函數(shù)和方法,然后調(diào)用函數(shù)和方法。
package main
import "fmt"
// 函數(shù)和方法
func function1() {
fmt.Println("我是一個(gè)名字叫做function1的函數(shù)")
}
type User struct {
name string
age uint
}
func (u User) function1() {
fmt.Println("我是一個(gè)名字叫做function1的方法")
}
func main() {
// 調(diào)用函數(shù)
function1()
// 調(diào)用方法
User{}.function1()
}執(zhí)行上述代碼,go run main,會(huì)打印出如下的結(jié)果:
kert@kertdeMBP ~/c/p/w/l/g/b/demo1 (master)> go run demo5.go
我是一個(gè)名字叫做function1的函數(shù)
我是一個(gè)名字叫做function1的方法
通過上面示例代碼,我們可以大致得出幾點(diǎn)結(jié)論。
1、調(diào)用函數(shù)時(shí),直接使用函數(shù)名即可(如果調(diào)用者和被調(diào)用者都在同一個(gè)包名下);調(diào)用方法,需要實(shí)例化結(jié)構(gòu)體,然后通過結(jié)構(gòu)體的方式去調(diào)用方法(結(jié)構(gòu)體實(shí)例化有多種,示例代碼使用的是字面量的方式)。
2、函數(shù)在定義時(shí),直接使用 func + 函數(shù)名()即可;方法在定義時(shí),需要使用 func (方法的接收者) + 函數(shù)名()才可以。
3、方法是通過"."的方式進(jìn)行調(diào)用,而函數(shù)是直接使用函數(shù)名。
使用指針
接下來,在函數(shù)和方法中使用指針大佬修改值的效果。
package main
import "fmt"
// 函數(shù)和方法
func function1(a *int) {
*a = 19
}
type User struct {
name string
age uint
}
func (u *User) function1() {
u.age = 10
}
func main() {
a := 10
function1(&a)
fmt.Println("函數(shù)function1運(yùn)行結(jié)果為", a)
user := User{age: 12, name: "張三"}
user.function1()
fmt.Println("結(jié)構(gòu)體user的結(jié)果是", user.age)
}運(yùn)行上訴代碼,查看一下執(zhí)行效果。go run main。
kert@kertdeMBP ~/c/p/w/l/g/b/demo1 (master)> go run demo5.go
函數(shù)function1運(yùn)行結(jié)果為 19
結(jié)構(gòu)體user的結(jié)果是 10
上面代碼中,通過給函數(shù)傳入一個(gè)指針,修改形參a的值;通過方法接收一個(gè)指針類型的接收者。都能夠修改原值,這一點(diǎn)不管是函數(shù)還是方法,都沒是一樣的。
是否同名
接下來,通過下面的實(shí)例代碼,來演示函數(shù)和方法是否支持定義相同的名稱。
package main
import "fmt"
// 函數(shù)和方法
func function1(a *int) {
*a = 19
}
func function1() {
fmt.Println("隨便打印一點(diǎn)東西")
}
type User struct {
name string
age uint
}
func (u *User) function1() {
u.age = 10
}
type Animal struct {
name string
age uint
}
func (u *Animal) function1() {
u.age = 10
}仍然是運(yùn)行上訴代碼,查看一下執(zhí)行結(jié)果是怎么樣的。go run main。
kert@kertdeMBP ~/c/p/w/l/g/b/demo1 (master)> go run demo5.go
# command-line-arguments
./demo5.go:10:6: function1 redeclared in this block
./demo5.go:6:6: other declaration of function1
可以通過運(yùn)行結(jié)果得出如何結(jié)論。
1、函數(shù)的名稱是不能重復(fù)的,不管是傳遞的參數(shù)還是返回的參數(shù)是否相同,函數(shù)名稱都不允許重復(fù)定義。
2、方法的名稱是可以重復(fù)的,前提是方法的接收者不能相同。
總結(jié)
含義不同
1、函數(shù)function是?段具有獨(dú)?功能的代碼,可以被反復(fù)多次調(diào)?,從?實(shí)現(xiàn)代碼復(fù)?。??法method是?個(gè)類的?為功能,只有該類的對(duì)象才能調(diào)?。
?法有接受者,?函數(shù)?接受者
1、Go語?的?法method是?種作?于特定類型變量的函數(shù),這種特定類型變量叫做Receiver(接受者、接收者、接收器); 2、接受者的概念類似于傳統(tǒng)?向?qū)ο笳Z?中的this或self關(guān)鍵字; 3、Go語?的接受者強(qiáng)調(diào)了?法具有作?對(duì)象,?函數(shù)沒有作?對(duì)象; 4、?個(gè)?法就是?個(gè)包含了接受者的函數(shù); 5、Go語?中, 接受者的類型可以是任何類型,不僅僅是結(jié)構(gòu)體, 也可以是struct類型外的其他任何類型。
函數(shù)不可以重名,??法可以重名
1、只要接受者不同,則?法名可以?樣。
調(diào)用方式不一樣
1、方法是struct對(duì)象通過.點(diǎn)號(hào)+名稱來調(diào)用,而函數(shù)是直接使用名稱來調(diào)用。
到此這篇關(guān)于詳解Go函數(shù)和方法之間有什么區(qū)別的文章就介紹到這了,更多相關(guān)Go函數(shù)和方法區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go協(xié)程和channel的實(shí)現(xiàn)
本文主要介紹了GO利用channel協(xié)調(diào)協(xié)程的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05
使用go連接clickhouse的實(shí)戰(zhàn)操作
這篇文章主要給大家介紹了關(guān)于使用go連接clickhouse的實(shí)戰(zhàn)操作,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用go具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-03-03

