詳解Go函數(shù)和方法之間有什么區(qū)別
基礎(chǔ)知識(shí)
在了解兩者不同之前,還是簡(jiǎn)單的回顧一下基礎(chǔ)語(yǔ)法知識(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語(yǔ)?的?法method是?種作?于特定類型變量的函數(shù),這種特定類型變量叫做Receiver(接受者、接收者、接收器); 2、接受者的概念類似于傳統(tǒng)?向?qū)ο笳Z(yǔ)?中的this或self關(guān)鍵字; 3、Go語(yǔ)?的接受者強(qiáng)調(diào)了?法具有作?對(duì)象,?函數(shù)沒有作?對(duì)象; 4、?個(gè)?法就是?個(gè)包含了接受者的函數(shù); 5、Go語(yǔ)?中, 接受者的類型可以是任何類型,不僅僅是結(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)文章
Golang中處理import自定義包出錯(cuò)問題的解決辦法
最近開始使用Go/GoLand在import自定義包時(shí)出現(xiàn)各種狀況,下面這篇文章主要給大家介紹了關(guān)于Golang中處理import自定義包出錯(cuò)問題的解決辦法,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11Go語(yǔ)言開發(fā)redis封裝及簡(jiǎn)單使用詳解
這篇文章主要為大家介紹了Go語(yǔ)言開發(fā)redis的封裝及簡(jiǎn)單使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2021-11-11golang中兩個(gè)協(xié)程交替打印數(shù)字和字母的實(shí)現(xiàn)
這篇文章給大家介紹了golang中兩個(gè)協(xié)程交替打印數(shù)字和字母的實(shí)現(xiàn),文中通過代碼示例講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-01-01GO語(yǔ)言基本類型String和Slice,Map操作詳解
這篇文章主要為大家介紹了GO語(yǔ)言基本類型String和Slice,Map操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08淺析Golang中調(diào)度器的關(guān)鍵機(jī)制與性能
Golang的調(diào)度器是其并發(fā)模型的核心組件,負(fù)責(zé)管理Goroutine的調(diào)度和執(zhí)行,本文將從理論和代碼層面分析Golang調(diào)度器的關(guān)鍵機(jī)制,感興趣的可以了解下2025-03-03詳解golang函數(shù)多返回值錯(cuò)誤處理與error類型
這篇文章主要為大家詳細(xì)介紹了golang中函數(shù)多返回值錯(cuò)誤處理與error類型的相關(guān)知識(shí),文中的示例代碼簡(jiǎn)潔易懂,感興趣的小伙伴快跟隨小編一起學(xué)習(xí)吧2023-10-10go gin中間件關(guān)于 c.next()、c.abort()和return的使用小結(jié)
中間件的執(zhí)行順序是按照注冊(cè)順序執(zhí)行的,中間件可以通過 c.abort() + retrurn 來中止當(dāng)前中間件,后續(xù)中間件和處理器的處理流程,?這篇文章給大家介紹go gin中間件關(guān)于 c.next()、c.abort()和return的使用小結(jié),感興趣的朋友跟隨小編一起看看吧2024-03-03golang定時(shí)任務(wù)cron項(xiàng)目實(shí)操指南
Go實(shí)現(xiàn)的cron 表達(dá)式的基本語(yǔ)法跟linux 中的 crontab基本是類似的,下面這篇文章主要給大家介紹了關(guān)于golang定時(shí)任務(wù)cron項(xiàng)目實(shí)操的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12