欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Go語言接口和類型如的轉(zhuǎn)換方法-創(chuàng)新互聯(lián)

小編給大家分享一下Go語言接口和類型如的轉(zhuǎn)換方法,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

專業(yè)從事成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作,高端網(wǎng)站制作設(shè)計(jì),小程序制作,網(wǎng)站推廣的成都做網(wǎng)站的公司。優(yōu)秀技術(shù)團(tuán)隊(duì)竭力真誠服務(wù),采用H5開發(fā)+CSS3前端渲染技術(shù),響應(yīng)式網(wǎng)站設(shè)計(jì),讓網(wǎng)站在手機(jī)、平板、PC、微信下都能呈現(xiàn)。建站過程建立專項(xiàng)小組,與您實(shí)時(shí)在線互動,隨時(shí)提供解決方案,暢聊想法和感受。

Go語言中使用接口斷言(type assertions)將接口轉(zhuǎn)換成另外一個(gè)接口,也可以將接口轉(zhuǎn)換為另外的類型。接口的轉(zhuǎn)換在開發(fā)中非常常見,使用也非常頻繁。

類型斷言的格式

類型斷言是一個(gè)使用在接口值上的操作。語法上它看起來像 i.(T) 被稱為斷言類型,這里 i 表示一個(gè)接口的類型和 T 表示一個(gè)類型。一個(gè)類型斷言檢查它操作對象的動態(tài)類型是否和斷言的類型匹配。

類型斷言的基本格式如下:

t := i.(T)

其中,i 代表接口變量,T 代表轉(zhuǎn)換的目標(biāo)類型,t 代表轉(zhuǎn)換后的變量。

這里有兩種可能。第一種,如果斷言的類型 T 是一個(gè)具體類型,然后類型斷言檢查 i 的動態(tài)類型是否和 T 相同。如果這個(gè)檢查成功了,類型斷言的結(jié)果是 i 的動態(tài)值,當(dāng)然它的類型是 T。換句話說,具體類型的類型斷言從它的操作對象中獲得具體的值。如果檢查失敗,接下來這個(gè)操作會拋出 panic。例如:

var w io.Writer

w = os.Stdout

f := w.(*os.File) // 成功: f == os.Stdout

c := w.(*bytes.Buffer) // 死機(jī):接口保存*os.file,而不是*bytes.buffer

第二種,如果相反斷言的類型 T 是一個(gè)接口類型,然后類型斷言檢查是否 i 的動態(tài)類型滿足 T。如果這個(gè)檢查成功了,動態(tài)值沒有獲取到;這個(gè)結(jié)果仍然是一個(gè)有相同類型和值部分的接口值,但是結(jié)果有類型 T。換句話說,對一個(gè)接口類型的類型斷言改變了類型的表述方式,改變了可以獲取的方法集合(通常更大),但是它保護(hù)了接口值內(nèi)部的動態(tài)類型和值的部分。

在下面的第一個(gè)類型斷言后,w 和 rw 都持有 os.Stdout 因此它們每個(gè)有一個(gè)動態(tài)類型 *os.File,但是變量 w 是一個(gè) io.Writer 類型只對外公開出文件的 Write 方法,然而 rw 變量也只公開它的 Read 方法。

var w io.Writer

w = os.Stdout

rw := w.(io.ReadWriter) // 成功:*os.file具有讀寫功能

w = new(ByteCounter)

rw = w.(io.ReadWriter) // 死機(jī):*字節(jié)計(jì)數(shù)器沒有讀取方法

如果斷言操作的對象是一個(gè) nil 接口值,那么不論被斷言的類型是什么這個(gè)類型斷言都會失敗。幾乎不需要對一個(gè)更少限制性的接口類型(更少的方法集合)做斷言,因?yàn)樗憩F(xiàn)的就像賦值操作一樣,除了對于 nil 接口值的情況。

如果 i 沒有完全實(shí)現(xiàn) T 接口的方法,這個(gè)語句將會觸發(fā)宕機(jī)。觸發(fā)宕機(jī)不是很友好,因此上面的語句還有一種寫法:

t,ok := i.(T)

這種寫法下,如果發(fā)生接口未實(shí)現(xiàn)時(shí),將會把 ok 置為 false,t 置為 T 類型的 0 值。正常實(shí)現(xiàn)時(shí),ok 為 true。這里 ok 可以被認(rèn)為是:i 接口是否實(shí)現(xiàn) T 類型的結(jié)果。

將接口轉(zhuǎn)換為其他接口

實(shí)現(xiàn)某個(gè)接口的類型同時(shí)實(shí)現(xiàn)了另外一個(gè)接口,此時(shí)可以在兩個(gè)接口間轉(zhuǎn)換。

鳥和豬具有不同的特性,鳥可以飛,豬不能飛,但兩種動物都可以行走。如果使用結(jié)構(gòu)體實(shí)現(xiàn)鳥和豬,讓它們具備自己特性的 Fly() 和 Walk() 方法就讓鳥和豬各自實(shí)現(xiàn)了飛行動物接口(Flyer)和行走動物接口(Walker)。

將鳥和豬的實(shí)例創(chuàng)建后,被保存到 interface{} 類型的 map 中。interface{} 類型表示空接口,意思就是這種接口可以保存為任意類型。對保存有鳥或豬的實(shí)例的 interface{} 變量進(jìn)行斷言操作,如果斷言對象是斷言指定的類型,則返回轉(zhuǎn)換為斷言對象類型的接口;如果不是指定的斷言類型時(shí),斷言的第二個(gè)參數(shù)將返回 false。例如下面的代碼:

var obj interface = new(bird)

f, isFlyer := obj.(Flyer)

代碼中,new(bird) 產(chǎn)生 *bird 類型的 bird 實(shí)例,這個(gè)實(shí)例被保存在 interface{} 類型的 obj 變量中。使用 obj.(Flyer) 類型斷言,將 obj 轉(zhuǎn)換為 Flyer 接口。f 為轉(zhuǎn)換成功時(shí)的 Flyer 接口類型,isFlyer 表示是否轉(zhuǎn)換成功,類型就是 bool。

下面是詳細(xì)的代碼(代碼1):

package main
  import "fmt"
  // 定義飛行動物接口
  type Flyer interface {
  Fly()
  }
  // 定義行走動物接口
  type Walker interface {
  Walk()
  }
  // 定義鳥類
  type bird struct {
  }
  // 實(shí)現(xiàn)飛行動物接口
  func (b *bird) Fly() {
  fmt.Println("bird: fly")
  }
  // 為鳥添加Walk()方法, 實(shí)現(xiàn)行走動物接口
  func (b *bird) Walk() {
  fmt.Println("bird: walk")
  }
  // 定義豬
  type pig struct {
  }
  // 為豬添加Walk()方法, 實(shí)現(xiàn)行走動物接口
  func (p *pig) Walk() {
  fmt.Println("pig: walk")
  }
  func main() {
  // 創(chuàng)建動物的名字到實(shí)例的映射
  animals := map[string]interface{}{
  "bird": new(bird),
  "pig": new(pig),
  }
  // 遍歷映射
  for name, obj := range animals {
  // 判斷對象是否為飛行動物
  f, isFlyer := obj.(Flyer)
  // 判斷對象是否為行走動物
  w, isWalker := obj.(Walker)
  fmt.Printf("name: %s isFlyer: %v isWalker: %v\n", name, isFlyer, isWalker)
  // 如果是飛行動物則調(diào)用飛行動物接口
  if isFlyer {
  f.Fly()
  }
  // 如果是行走動物則調(diào)用行走動物接口
  if isWalker {
  w.Walk()
  }
  }
  }
  代碼說明如下:
  第 6 行定義了飛行動物的接口。
  第 11 行定義了行走動物的接口。
  第 16 和 30 行分別定義了鳥和豬兩個(gè)對象,并分別實(shí)現(xiàn)了飛行動物和行走動物接口。
  第 41 行是一個(gè) map,映射對象名字和對象實(shí)例,實(shí)例是鳥和豬。
  第 47 行開始遍歷 map,obj 為 interface{} 接口類型。
  第 50 行中,使用類型斷言獲得 f,類型為 Flyer 及 isFlyer 的斷言成功的判定。
  第 52 行中,使用類型斷言獲得 w,類型為 Walker 及 isWalker 的斷言成功的判定。
  第 57 和 62 行,根據(jù)飛行動物和行走動物兩者是否斷言成功,調(diào)用其接口。
  代碼輸出如下:
  name: pig isFlyer: false isWalker: true
  pig: walk
  name: bird isFlyer: true isWalker: true
  bird: fly
  bird: walk
  將接口轉(zhuǎn)換為其他類型
  在代碼 1 中,可以實(shí)現(xiàn)

將接口轉(zhuǎn)換為普通的指針類型。例如將 Walker 接口轉(zhuǎn)換為 *pig 類型,請參考下面的代碼:


p1 := new(pig)var a Walker = p1p2 := a.(*pig)fmt.Printf("p1=%p p2=%p", p1, p2)

對代碼的說明如下:

第 3 行,由于 pig 實(shí)現(xiàn)了 Walker 接口,因此可以被隱式轉(zhuǎn)換為 Walker 接口類型保存于 a 中。

第 4 行,由于 a 中保存的本來就是 *pig 本體,因此可以轉(zhuǎn)換為 *pig 類型。

第 6 行,對比發(fā)現(xiàn),p1 和 p2 指針是相同的。

如果嘗試將上面這段代碼中的 Walker 類型的 a 轉(zhuǎn)換為 *bird 類型,將會發(fā)出運(yùn)行時(shí)錯(cuò)誤,請參考下面的代碼:

p1 := new(pig)var a Walker = p1p2 := a.(*bird)

運(yùn)行時(shí)報(bào)錯(cuò):

panic: interface conversion: main.Walker is *main.pig, not *main.bird

報(bào)錯(cuò)意思是:接口轉(zhuǎn)換時(shí),main.Walker 接口的內(nèi)部保存的是 *main.pig,而不是 *main.bird。

因此,接口在轉(zhuǎn)換為其他類型時(shí),接口內(nèi)保存的實(shí)例對應(yīng)的類型指針,必須是要轉(zhuǎn)換的對應(yīng)的類型指針。

以上是“Go語言接口和類型如的轉(zhuǎn)換方法”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

網(wǎng)站標(biāo)題:Go語言接口和類型如的轉(zhuǎn)換方法-創(chuàng)新互聯(lián)
標(biāo)題網(wǎng)址:http://chinadenli.net/article8/djjgop.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計(jì)Google、網(wǎng)站維護(hù)、面包屑導(dǎo)航、品牌網(wǎng)站設(shè)計(jì)、App開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化
国产精品一区二区视频成人| 婷婷九月在线中文字幕| 久久精品免费视看国产成人| 老熟妇乱视频一区二区| 国产精品一区二区三区黄色片| 国产欧美日韩精品自拍| 国产午夜福利一区二区| 午夜激情视频一区二区| 国产户外勾引精品露出一区| 日韩人妻精品免费一区二区三区| 久久亚洲国产视频三级黄| 91日韩欧美在线视频| 在线九月婷婷丁香伊人| 91人人妻人人爽人人狠狠| 麻豆最新出品国产精品| 国内九一激情白浆发布| 日本欧美一区二区三区在线播| 国产精品偷拍视频一区| 国产精品一区二区有码| 日本精品啪啪一区二区三区| 亚洲精品有码中文字幕在线观看| 女人精品内射国产99| 久久精品a毛片看国产成人| 成人你懂的在线免费视频| 欧美一二三区高清不卡| 日韩国产亚洲欧美激情| 99热在线精品视频观看| 激情亚洲内射一区二区三区| 国产精品欧美激情在线| 大香蕉久草网一区二区三区| 视频在线观看色一区二区| 在线观看国产午夜福利| 国产高清在线不卡一区| 人人妻在人人看人人澡| 欧美日韩无卡一区二区| 五月天丁香婷婷一区二区| 久久国产成人精品国产成人亚洲| 经典欧美熟女激情综合网| 一区二区欧美另类稀缺| 欧美国产日本免费不卡| 亚洲午夜精品视频观看|