婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Golang 使用接口實現泛型的方法示例

Golang 使用接口實現泛型的方法示例

熱門標簽:廣州呼叫中心外呼系統 浙江高速公路地圖標注 西部云谷一期地圖標注 學海導航地圖標注 南通如皋申請開通400電話 江西轉化率高的羿智云外呼系統 高德地圖標注口訣 中國地圖標注省會高清 地圖標注的汽車標

在C/C++中我們可以使用泛型的方法使代碼得以重復使用,最常見例如stl functions:vectorint> vint or vectorfloat> vfloat等。這篇文章將使用interface{...}接口使Golang實現泛型。

interface{...}是實現泛型的基礎。如一個數組元素類型是interface{...}的話,那么實現了該接口的實體都可以被放置入數組中。注意其中并不一定必須是空接口(簡單類型我們可以通過把他轉化為自定義類型后實現接口)。為什么interface中要聲明方法:因為當我們需要對數組內數據進行操作時(如比較大?。?,我們需要為這個操作聲明一個自定義的方法。換言之,只有實現了這個方法的實體才允許被加入進數組中。

基礎Demo

在下面演示的Demo中,我們將實現一個最簡單的vector,并實現插入時排序的功能。

type Comper interface{
  Lessthan (Comper) bool
}
type Sdata struct{
  data []Comper
}

func (t *Sdata) Push (item Comper){
  t.data = append(t.data, item)
  for k,v:=range t.data{
    if item.Lessthan(v) {  //調用接口定義的方法
      //排序操作
      break
    }
  }
}

如此便實現了一個最簡單的Demo,使用Sdata的數組元素必須先實現Lessthan方法:

type Myint int

func (t Myint) Lessthan (x Comper) bool {
  return tx.(Myint)
}
func main() {
  mydata := Sdata{make([]Comper, 0)}
  for i:=10;i>0;i--{
    mydata.Push((Myint(i)))
  }
  fmt.Println(mydata)
}

但這個Demo的缺點也有許多,一是簡單類型元素無法使用Sdata進行排序,二是不支持并發,在并發的情況下會產生不可預料的結果。

通過Reflect支持簡單類型的Demo

為要支持簡單類型,我們只能使用空接口作為數組元素類型。這時候我們的程序邏輯應該是這樣:如果這是一個簡單類型,那么我們直接調用內置的""與">"進行比較;如果這不是一個簡單類型,那么我們仍舊調用Lessthan方法:

type Comper interface{
  Lessthan (Comper) bool
}
type Sdata struct{
  data []interface{}
}

func (t *Sdata) Push (item interface{}){
  for _,v:=range t.data{
    if reflect.TypeOf(item).Implements(reflect.TypeOf(new(Comper)).Elem()) {
      citem:=item.(Comper)
      cv:=v.(Comper)
      if citem.Lessthan(cv) {
        //要執行的操作
        break
      }
    }else{
      x,v:=reflect.ValueOf(item),reflect.ValueOf(v)
      switch x.Kind() {
      case reflect.Int:
      case reflect.Int8:
      case reflect.Int16:
        /*...*/
        //x, y:=x.Int(), y.Int()
        /*...*/
        break
      case reflect.Uint:
        /*...*/
      }
    }
  }
}

利用reflect判斷item的類型:

reflect.TypeOf(item).Implements(reflect.TypeOf(new(comper)).Elem()),即item類型是否實現了comper接口類型。TypeOf(new(comper))是一個指針ptr,Elem()將指針轉為值。如果該函數返回值為true,則可將item和v從interface{}強制轉為Comper接口,調用Lessthan(...);當然你也可以使用類型斷言,那種方式更簡單也更常用,我在這兒只是嘗試一下使用反射的方法:if v,ok:=item.(comper); ok{...}

不能直接對value類型進行大小比較:

value類型不能通過">"與""直接比較大小,即使我們知道他是簡單類型。作者還沒有找到簡單的方法能直接轉化值為簡單類型并比較,因此采用了枚舉的方法。若有更簡便的方法,也請告知。

如果使用實例指針實現接口:

這是一個比較難以發現的問題,涉及到golang的類型系統。也就是說,如果我們實現Lessthen的方法是這樣func (t*Myint) Lessthan (x Comper) bool,那么很有可能你的斷言item類型就要失敗了。我們可以看一下此時item的類型:

fmt.Println(reflect.TypeOf(t.data[0])) //main.XXX

這不是我們期待的,因為我們知道只有*T類型的方法集才是S和*S,而T類型的方法集只有S。很明顯,main.XXX的方法集里不包括Lessthan方法,只有*main.XXX才包括。所以正確的使用方法是,在最初賦值的時候就賦值給指針類型:

mi := Myint(i)
mydata.Push(mi)

多接口分層Demo

空接口其實只是一個特殊用例,我們將其推廣后即可發現,我們可以定義多個接口,聲明多種方法,實體實現了若干種方法便有權限調用若干函數:

例如我們可以賦予讀取權限,寫入權限與刪除權限,來對應不同需求:

type Reader interface {
  Read () interface{}
}
type Writer interface {
  Write (Writer)
}
type ReadWriter interface {
  Reader
  Writer
}
type Remover interface {
  Remove ()
}

type Sdata struct {
  data []interface{}
}

func (t *Sdata)Get(i int)interface{}{
  if len(t.data) == 0{return nil}
  if reflect.TypeOf(t.data[0]).Implements(reflect.TypeOf(new(Reader)).Elem()) == true{
    return t.data[i].(Reader).Read()
  }
}

func (t *Sdata)Modify(i int, w Writer){
  // if reflect.TypeOf(t.data[0]).Implements(reflect.TypeOf(new(ReadWriter)).Elem()) == true
  if _,ok:=t.data[0].(ReadWriter);ok{
    t.data[i].(Writer).Write(w)
  }
}
//......

自定義Myint類型并實現Reader,Writer接口:

type Readint int
func (t Readint) Read() interface{}{
  return int(t)
}
//---------------------------------------------
type Myint int
func (t Myint) Read() interface{}{
  return int(t)
}
func (t *Myint) Write(w Writer){
  *t = *w.(*Myint)
  return
}

func main() {
  mydata := Sdata{make([]interface{}, 1)}
  var u,v Myint = 5,6
  mydata.data[0] = u
  fmt.Println("Myint is ", mydata.Get(0))
  mydata.Modify(0,v)
  fmt.Println("Myint is ", mydata.Get(0))

  var ru Readint = 100
  readdata := Sdata{make([]interface{}, 1)}
  readdata.data[0] = ru
  fmt.Println("Readint is ", readdata.Get(0))
  //var rv Readint = 101
  readdata.Modify(0,v) //事實上,如果傳遞rv則編譯根本不會通過。
  fmt.Println("Readint is ", readdata.Get(0))
}

運行結果:
Myint is  5
Myint is  6
Readint is  100
Readint is  100

說明:如果因為認為上述代碼傳遞rv根本不會通過編譯而不去作類型檢查,這是不可取的。因為對于空接口interface{}而言,無所謂實體的類型,只在乎是否實現方法,因此傳遞v是合情合理的。另外,因為該Demo是一個簡易版本,所以判斷權限部分僅僅根據判斷第0個元素的權限。事實上,判斷權限應該在初始化時完成并將其存儲在結構體變量中。

最后關于并發的問題,套用讀寫鎖即可。過于簡單不再通過Demo驗證。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • golang分層測試之http接口測試入門教程
  • golang基礎之Interface接口的使用
  • golang中interface接口的深度解析
  • 初步解讀Golang中的接口相關編寫方法
  • golang中接口對象的轉型兩種方式

標簽:曲靖 德宏 吐魯番 常州 貴州 保定 許昌 東營

巨人網絡通訊聲明:本文標題《Golang 使用接口實現泛型的方法示例》,本文關鍵詞  Golang,使用,接口,實現,泛型,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Golang 使用接口實現泛型的方法示例》相關的同類信息!
  • 本頁收集關于Golang 使用接口實現泛型的方法示例的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产美女一区二区| 99riav久久精品riav| 亚洲成av人片一区二区梦乃| 91视频www| 日韩高清在线观看| 亚洲与欧洲av电影| 国产精品国产三级国产有无不卡| 成人高清在线视频| 日本怡春院一区二区| 国产午夜亚洲精品理论片色戒 | 精品国精品国产尤物美女| 久久超碰97中文字幕| 狠狠色狠狠色综合日日91app| 天堂一区二区在线| 国产精品国产自产拍高清av| 2023国产精品视频| 亚洲精品在线观| 欧美www视频| 91麻豆123| 国产一区二区三区香蕉| 九九**精品视频免费播放| 亚洲影视在线播放| 亚洲欧洲成人精品av97| 精品少妇一区二区三区免费观看| 91猫先生在线| 国产精品系列在线观看| 韩国精品主播一区二区在线观看| 老汉av免费一区二区三区| 理论片日本一区| 国产成人免费视频网站| www.成人网.com| 91麻豆精东视频| 色国产精品一区在线观看| 91麻豆成人久久精品二区三区| 在线观看不卡视频| 精品视频一区三区九区| 欧美日韩精品一区二区天天拍小说 | 免费成人av在线| 一区二区三区免费在线观看| 亚洲自拍偷拍九九九| 亚洲成人第一页| 国产精品第四页| 亚洲欧美另类在线| 亚洲精品自拍动漫在线| 亚洲综合色噜噜狠狠| 亚洲一区二区三区不卡国产欧美| 亚洲国产日韩精品| 亚洲一区二区三区视频在线| 五月婷婷色综合| 日韩极品在线观看| 国产v日产∨综合v精品视频| aaa国产一区| 色婷婷国产精品| 精品人在线二区三区| 久久婷婷成人综合色| 国产欧美日韩不卡免费| 亚洲影视资源网| 国产91在线观看丝袜| 欧美精品三级在线观看| 欧美大胆人体bbbb| 亚洲精品福利视频网站| 极品少妇xxxx偷拍精品少妇| 91老司机福利 在线| 欧美老女人在线| 国产精品久久综合| 美国一区二区三区在线播放| 国产成人综合精品三级| 一本大道av一区二区在线播放| www.视频一区| 337p粉嫩大胆噜噜噜噜噜91av| 狠狠色狠狠色综合日日91app| 色8久久人人97超碰香蕉987| 懂色av中文字幕一区二区三区 | 国产精品久久久久影院亚瑟| 日本一区中文字幕| 色激情天天射综合网| 日本一区二区三区视频视频| 亚洲二区在线视频| 91蜜桃婷婷狠狠久久综合9色| 久久久三级国产网站| 秋霞电影网一区二区| 99精品视频在线免费观看| 久久伊99综合婷婷久久伊| 亚洲国产一区二区在线播放| 色综合久久中文综合久久牛| 久久久www成人免费毛片麻豆| 日韩二区三区在线观看| 91污片在线观看| 亚洲视频图片小说| 极品少妇xxxx偷拍精品少妇| 日韩精品在线看片z| 亚洲资源在线观看| 91浏览器打开| 亚洲成人av资源| 欧美一二区视频| 精品一区二区三区不卡| 69p69国产精品| 一区二区三区中文字幕精品精品 | 1024精品合集| 狠狠色丁香九九婷婷综合五月| 欧美成人vr18sexvr| 美日韩一区二区三区| 日韩一级精品视频在线观看| 久久99国产乱子伦精品免费| 久久综合国产精品| 国产精品一二一区| 国产精品久久久久久久久久免费看 | 成人高清视频在线观看| 国产精品午夜在线| 99久久久精品免费观看国产蜜| 中文字幕一区二区视频| av在线这里只有精品| 亚洲欧美区自拍先锋| 在线观看亚洲一区| 亚洲日本在线看| 制服.丝袜.亚洲.中文.综合| 国内精品伊人久久久久av一坑| 国产亚洲人成网站| 色一区在线观看| 蜜桃av噜噜一区| 中文字幕一区二区三区在线不卡| 欧美色图激情小说| 亚洲午夜久久久久中文字幕久| 欧美一区二区三区公司| 国产成人免费在线观看| 亚洲国产精品一区二区www在线| 日韩欧美另类在线| 99久久免费视频.com| 三级不卡在线观看| 国产精品视频第一区| 欧美在线免费观看视频| 精品一区二区在线看| 欧美一区二区性放荡片| 成人自拍视频在线| 夜夜嗨av一区二区三区网页 | 欧美日韩一本到| 国产精品白丝jk黑袜喷水| 亚洲人成影院在线观看| 日韩精品一区二区三区视频播放 | 91精品国产欧美一区二区| 亚洲国产美国国产综合一区二区| 日韩午夜在线影院| 色偷偷88欧美精品久久久| 久久精品国产99国产| 最新成人av在线| 日韩欧美第一区| 欧美视频在线不卡| 波多野结衣中文字幕一区| 日韩av在线免费观看不卡| 中文字幕一区二区不卡| 日韩精品一区二区三区老鸭窝| 成人午夜看片网址| 美洲天堂一区二卡三卡四卡视频| 亚洲综合色区另类av| 国产精品久久久久aaaa| 精品久久久久99| 欧美色老头old∨ideo| 99久久婷婷国产| 高清不卡一二三区| 精品一区二区三区久久久| 日韩成人免费电影| 亚洲成在线观看| 一区二区三区中文免费| 综合激情网...| 国产精品青草久久| 国产欧美日韩视频一区二区| 欧美mv和日韩mv的网站| 欧美日韩精品欧美日韩精品一综合| 成人免费视频一区二区| 国产福利视频一区二区三区| 久久国产精品色婷婷| 日韩国产精品大片| 日日夜夜精品视频天天综合网| 亚洲成人av免费| 亚洲电影在线免费观看| 亚洲一区二区三区四区五区黄| 亚洲最大成人网4388xx| 一区二区三区在线观看动漫| 欧美三级三级三级爽爽爽| 自拍偷拍亚洲欧美日韩| 亚洲色图欧洲色图婷婷| 欧美日韩三级视频| 国产毛片精品一区| 亚洲在线视频网站| 亚洲激情av在线| 又紧又大又爽精品一区二区| 亚洲精品免费一二三区| 亚洲国产日日夜夜| 久久精品国产99久久6| 成人自拍视频在线| 日韩欧美一区二区三区在线| 欧美中文字幕不卡| 欧美一区国产二区| 中文字幕不卡在线观看| 一二三区精品视频| 亚洲一区二区三区影院| 成人h动漫精品一区二| 成人精品在线视频观看| 欧美日韩你懂的| 精品国产一区二区三区久久久蜜月 |