最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文帶你了解GO語言中方法的應(yīng)用

 更新時間:2023年09月04日 08:23:43   作者:阿兵云原生  
GO?語言中的方法實際上和函數(shù)是類似的,只不過在函數(shù)的基礎(chǔ)上多了一個參數(shù),這篇文章主要為大家介紹一下GO語言中方法的應(yīng)用,需要的可以參考下

GO 中的方法是什么?

前面我們有分享到 GO 語言的函數(shù),他是一等公民,那么 GO 語言中的方法和函數(shù)有什么區(qū)別呢?

GO 語言中的方法實際上和函數(shù)是類似的,只不過在函數(shù)的基礎(chǔ)上多了一個參數(shù),這個參數(shù)在 GO 語言中被稱為 receiver 參數(shù)

例如我們可以這么來申明一個方法:

func (xx T/*T) helloworld(入?yún)?shù)列表) (返回值列表) {
    // 具體實現(xiàn)
}

demo 中的 helloworld 方法就綁定到了 receiver T 類型上,這個 helloworld 方法,我們可以通過使用 T 類型或者 *T 來進行調(diào)用,例如:

var tt T
tt.helloworld(入?yún)?shù)列表)
var pt *T
pt.helloworld(入?yún)?shù)列表)

看著還是挺簡單的對嗎?對于使用的時候我們需要注意這些問題:

  • GO 語言中原生的類型,是不能作為上述的 receiver 的,例如 int,slice,map等等都是不行的,只能是我們自定義的類型
  • 方法只能有一個 receiver 參數(shù),只能綁定一個,不能綁定多個
  • receiver 參數(shù)類型本身不能是指針或者是接口類型,這里非常需要注意

如圖:receiver 參數(shù)類型本身不能是指針類型

如圖:receiver 參數(shù)類型本身不能是接口類型

對于方法,是綁定了一個 receiver 類型的參數(shù),那么這個參數(shù)是不是很像 C++ 里面的入?yún)⒛兀?/p>

func helloworld(xx T/*T, 其他入?yún)? (返回值列表){
    // 具體實現(xiàn)
}

所以在 GO 語言里面,我們能夠明白一個方法所綁定類型的實例,實際上就是一個普通函數(shù)的第一個參數(shù)

就像這樣

func (t T) helloworld()  ==  helloworld(t T)
func (pt *T) helloworld()  ==  helloworld(pt *T)

那么,**對于上述綁定的類型,有 T 也有 T ,如何去選擇呢?什么時候用 T 什么時候又用 T 呢?

此處 T 叫做值類型 , *T 叫做指針類型 ,選擇不同的類型,

  • 如果選擇 T 類型,那么這是一個值傳遞類型的,在調(diào)用 helloworld 方法的時候,實際上就是傳了一個 T 類型實例的副本,那么如果在 helloworld 方法中對 t 做了一些變動,那么只會影響副本,對于原來的 T 類型實例,是不會有影響的
  • 如果選擇了 *T 類型,那么這就是一個指針類型的,調(diào)用 helloworld 方法的時候,傳的就是類型 T 的實例地址,這個時候 helloworld 內(nèi)部如果對 t 做了一些變動,都會體現(xiàn)到原來的 T 的實例上

這個理解方式實際上就和咱們普通函數(shù)中傳入的參數(shù)是一樣的,傳值和傳地址的區(qū)別

一個簡單的 demo ,再來加深一下:

  • 定義個 TT 類型的結(jié)構(gòu),成員有 Name
  • 定義 Hello1 方法綁定 TT,定義 hello2 方法綁定 *TT
  • 新建一個 TT 類型的變量 t,分別去調(diào)用 hello1 和 hello2
  • 新建一個 *TT 類型的變量 pt,分別去調(diào)用 hello1 和 hello2

可以看到上述程序的結(jié)果如下:

name ==
name ==  hello2
name ==
name ==  hello2

從上述 demo 中就可以看出,實際上 GO 語言對于我們調(diào)用方法的時候是做了隱式轉(zhuǎn)換,無論是值類型的實例,還是指針類型的實例,都是可以去調(diào)用綁定了值類型的方法,也可以去調(diào)用綁定了指針類型的方法

只不過得到的結(jié)果,就要看具體方法是綁定的值類型,還是指針類型了

所以我們?nèi)绾稳ミx擇 receiver 的類型到此就很清楚了吧?

如果我們期望要去修改 receiver 類型的實例,那么就用指針類型,如果不期望修改,則使用值類型

當(dāng)然,如果我們是要考慮到性能,就要使用傳地址的方式較好

方法的集合

GO 里面雖然沒有類,沒有對象,沒有繼承,但是關(guān)于面向?qū)ο罄锩娴膬?nèi)容在 GO 里面完全可以使用組合的方式來進行實現(xiàn)

所以對于GO 里面是如何組合的的基本知識我們要搞清楚,前提我們就先要弄明白方法的集合是如何玩的

在 GO 語言里面,我們在給接口變量復(fù)制,使用結(jié)構(gòu)體嵌入或者接口嵌入,使用 類型別名的時候,都是會涉及到方法集合的,但是具體要看某一個實例包含哪些方法集合,我們就可以來演練一下

  • 定義 ITT 接口,里面有 2 個方法 Hello1() , Hello2()
  • 定義 TT 結(jié)構(gòu)體,實現(xiàn)上述接口,其中 Hello1() 綁定 TT , Hello2() 綁定 *TT
  • 查看 nil 轉(zhuǎn)成 ITT 的方法集合,TT 的方法集合,*TT 的方法集合
type ITT interface{
   Hello1()
   Hello2()
}
type TT struct{}
func (t TT)Hello1(){}
func (pt *TT)Hello2(){}
// 打印方法集合
func GetMethodSet(i interface{}){
   v := reflect.TypeOf(i)
   et := v.Elem()
    num := et.NumMethod()
    if num == 0 {
      fmt.Println(et, "methond num is 0" )
      return
    }
   // 有方法集合
   fmt.Println(et,"mthond set is :")
   for i:=0;i<num;i++{
      fmt.Println("---",et.Method(i).Name)
   }
}
func main(){
   var t TT
   var pt * TT
   // 先查看 nil 接口的方法集合
   GetMethodSet((*ITT)(nil))
   // 查看 TT 的方法集合
   GetMethodSet(&t)
   // 查看 *TT 的方法集合
   GetMethodSet(&pt)
}

運行結(jié)果如下:

可以查看到上述案例,綁定類型為 TT 的,方法集合只有 1 個,綁定類型為 *TT 的方法集合有 2 個,可以看得出來

**T 類型的方法集合是包含了 T 類型和 T 類型

T 類型的方法集合是包含了 T 類型

對于 GO 語言里面的組合,總的來說有三種,這個可以多多嘗試和寫 demo 練習(xí):

1.接口中嵌入接口

type ITT interface{
    hello1()
}
type ITT2 interface{
    hello2()
}
type ITT3 interface{
    ITT 
    ITT2 
}

接口中嵌入接口,最終的接口方法個數(shù)是取和數(shù),此處我們要注意的地方就是方法名如果重復(fù),也是可以正常得到方法集合,具體使用接口中的方法,還是要看實例是如何實現(xiàn)的

2.結(jié)構(gòu)體中嵌入接口

type ITT interface{
    hello1()
    hello2()
}
type ITT2 interface{
    hello2()
    hello3()
}
type TT struct{
    ITT 
    ITT2
}
// 此時 TT  的方法集合就存在 hello2() 是沖突的,因此此處就需要 TT 去實現(xiàn)自己的 hello2()
func (TT)hello2(){}

結(jié)構(gòu)體中嵌入接口,如果遇到同名的方法,GO 語言會優(yōu)先選擇結(jié)構(gòu)體自己實現(xiàn)的方法,如果結(jié)構(gòu)體自己未實現(xiàn),則會將接口中的同名方法提升到自己的結(jié)構(gòu)體中來

3.結(jié)構(gòu)體中嵌入結(jié)構(gòu)體

結(jié)構(gòu)體中嵌入結(jié)構(gòu)體,就要注意嵌入的結(jié)構(gòu)體是值類型的還是指針類型的,例如:

type TT struct{
    TT1
    *TT2
}

那么 TT 的方法集合是什么? *TT 的方法集合是什么?

TT 的方法集合就是按照正常值傳遞的來,等于 TT1 的方法集合 加上 *TT2 的方法集合

*TT 的方法集合按照地址傳遞的來,等于 *TT1的方法集合 加上 *TT2 的方法集合

那么類型別名的方法集合又是如何去查看的,有什么需要注意的地方嗎?

那么還是上述方法集合中的案例,我們分別給結(jié)構(gòu)體 TT 定一個別名,TTB,給接口類型 ITT 定義一個 ITTB ,此時來查看別名的方法集合,與其原有類型的方法集合是否有差距

上述程序運行結(jié)果如下:

main.ITT mthond set is :
--- Hello1
--- Hello2
main.ITT mthond set is :
--- Hello1
--- Hello2
main.TT mthond set is :
--- Hello1
main.TT mthond set is :
--- Hello1
*main.TT mthond set is :
--- Hello1
--- Hello2
*main.TT mthond set is :
--- Hello1
--- Hello2

通過打印結(jié)果,我們可以看到,類型別名的方法集合與原有類型的方法集合是一樣的,無論是結(jié)構(gòu)體類型還是接口類型

知道 receiver 能夠調(diào)用的方法集合有哪些, 那么在具體使用的時候,就避免出錯,避免誤解,對于后續(xù)的接口組合就會理解的更加明白和清晰了

到此這篇關(guān)于一文帶你了解GO語言中方法的應(yīng)用的文章就介紹到這了,更多相關(guān)go方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 4個場景教會你Go中Goroutine和通道是怎么用的

    4個場景教會你Go中Goroutine和通道是怎么用的

    本篇給出了4個在運維開發(fā)工作中較為常見的且也是比較典型的場景,通過這些場景來帶大家掌握Go中Goroutine和通道是怎么使用的,需要的可以學(xué)習(xí)一下
    2023-05-05
  • 深入解析Go語言編程中的遞歸使用

    深入解析Go語言編程中的遞歸使用

    這篇文章主要介紹了Go語言編程中的遞歸使用,是Go語言入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-11-11
  • Golang內(nèi)存管理之內(nèi)存逃逸分析

    Golang內(nèi)存管理之內(nèi)存逃逸分析

    逃逸分析是指由編譯器決定內(nèi)存分配的位置,不需要程序員指定,這篇文章主要為大家詳細介紹了Golang中內(nèi)存逃逸分析的幾種方法,需要的可以參考一下
    2023-07-07
  • golang中g(shù)ob的實現(xiàn)示例

    golang中g(shù)ob的實現(xiàn)示例

    本文介紹了Go語言的Gob格式,它是Go以二進制形式序列化和反序列化程序數(shù)據(jù)的格式,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-11-11
  • Go語言在終端打開實現(xiàn)進度條處理數(shù)據(jù)方法實例

    Go語言在終端打開實現(xiàn)進度條處理數(shù)據(jù)方法實例

    這篇文章主要介紹了Go語言在終端打開實現(xiàn)進度條處理數(shù)據(jù)方法實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • golang切片擴容規(guī)則實現(xiàn)

    golang切片擴容規(guī)則實現(xiàn)

    這篇文章主要介紹了golang切片擴容規(guī)則實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Go垃圾回收提升內(nèi)存管理效率優(yōu)化最佳實踐

    Go垃圾回收提升內(nèi)存管理效率優(yōu)化最佳實踐

    這篇文章主要為大家介紹了Go垃圾回收提升內(nèi)存管理效率優(yōu)化最佳實踐,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • 在Golang中使用Redis的方法示例

    在Golang中使用Redis的方法示例

    這篇文章主要介紹了在Golang中使用Redis的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • Go語言基于Goroutine的超時控制方案設(shè)計與實踐

    Go語言基于Goroutine的超時控制方案設(shè)計與實踐

    Go語言因其并發(fā)特性而備受青睞,尤其是goroutine和channel的組合,像一對默契的搭檔,為開發(fā)者提供了輕量、高效的并發(fā)工具,下面我們來看看基于goroutine的超時控制方案吧
    2025-05-05
  • golang語言中wasm 環(huán)境搭建的過程詳解

    golang語言中wasm 環(huán)境搭建的過程詳解

    將 golang 打包為 WASM,通常有兩種打包方式,一種是 golang 自帶的,另外是使用 tinygo ,接下來通過本文給大家介紹golang語言中wasm 環(huán)境搭建的過程,感興趣的朋友一起看看吧
    2021-11-11

最新評論

偃师市| 台东市| 寿宁县| 祥云县| 富裕县| 菏泽市| 泰兴市| 开化县| 金湖县| 中阳县| 秀山| 杂多县| 游戏| 延安市| 永福县| 高邑县| 穆棱市| 新泰市| 浪卡子县| 宁陵县| 攀枝花市| 岳普湖县| 喜德县| 交口县| 宜春市| 山西省| 巧家县| 阿荣旗| 多伦县| 内丘县| 新宾| 辽阳市| 达尔| 平顺县| 申扎县| 哈密市| 郑州市| 塘沽区| 临武县| 兴化市| 盐亭县|