golang中接口對(duì)象的轉(zhuǎn)型兩種方式
接口對(duì)象的轉(zhuǎn)型有兩種方式:
1. 方式一:instance,ok:=接口對(duì)象.(實(shí)際類型)
如果該接口對(duì)象是對(duì)應(yīng)的實(shí)際類型,那么instance就是轉(zhuǎn)型之后對(duì)象,ok的值為true
配合if...else if...使用
2. 方式二:
接口對(duì)象.(type)
配合switch...case語(yǔ)句使用
示例:
package main import ( "fmt" "math" ) type shape interface { perimeter() int area() int } type rectangle struct { a int // 長(zhǎng) b int // 寬 } func (r rectangle) perimeter() int { return (r.a + r.b) * 2 } func (r rectangle) area() int { return r.a * r.b } type circle struct { radios int } func (c circle) perimeter() int { return 2 * c.radios * int(math.Round(math.Pi)) } func (c circle) area() int { return int(math.Round(math.Pow(float64(c.radios), 2) * math.Pi)) } func getType(s shape) { if i, ok := s.(rectangle); ok { fmt.Printf("長(zhǎng)方形的長(zhǎng):%d,長(zhǎng)方形的寬是:%d\n", i.a, i.b) } else if i, ok := s.(circle); ok { fmt.Printf("圓形的半徑是:%d\n", i.radios) } } func getType2(s shape) { switch i := s.(type) { case rectangle: fmt.Printf("長(zhǎng)方形的長(zhǎng):%d,長(zhǎng)方形的寬是:%d\n", i.a, i.b) case circle: fmt.Printf("圓形的半徑是:%d\n", i.radios) } } func getResult(s shape) { fmt.Printf("圖形的周長(zhǎng)是:%d,圖形的面積是:%d\n", s.perimeter(), s.area()) } func main() { r := rectangle{a: 10, b: 20} getType(r) getResult(r) c := circle{radios: 5} getType2(c) getResult(c) }
上面的例子使用的是方式一,如果要使用方式2,可以將getType()函數(shù)改為:
func getType(s shape) { switch i := s.(type) { case rectangle: fmt.Printf("圖形的長(zhǎng):%.2f,圖形的寬:%.2f \n", i.a, i.b) case triangle: fmt.Printf("圖形的第一個(gè)邊:%.2f,圖形的第二個(gè)邊:%.2f,圖形的第三個(gè)邊:%.2f \n",i.a,i.b,i.c) case circular: fmt.Printf("圖形的半徑:%.2f \n",i.radius) } }
PS:上面求三角形面積使用了海倫公式求三角形的面積,公式為:
三角形的面積=平方根[三角形周長(zhǎng)的一半×(三角形周長(zhǎng)的一半減去第一個(gè)邊)×(三角形周長(zhǎng)的一半減去第二個(gè)邊)×(三角形周長(zhǎng)的一半減去第三個(gè)邊)]
到此這篇關(guān)于golang中接口對(duì)象的轉(zhuǎn)型的文章就介紹到這了,更多相關(guān)golang接口對(duì)象內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang極簡(jiǎn)入門教程(四):編寫第一個(gè)項(xiàng)目
這篇文章主要介紹了Golang極簡(jiǎn)入門教程(四):編寫第一個(gè)項(xiàng)目,本文講解了workspace、包路徑、第一個(gè)可執(zhí)行命令等內(nèi)容,需要的朋友可以參考下2014-10-10使用Go語(yǔ)言實(shí)現(xiàn)心跳機(jī)制
心跳最典型的應(yīng)用場(chǎng)景是是探測(cè)服務(wù)是否存活,這篇文章主要來(lái)和大家介紹一下如何使用Go語(yǔ)言實(shí)現(xiàn)一個(gè)簡(jiǎn)單的心跳程序,感興趣的可以了解下2024-01-01GoFrame框架Scan類型轉(zhuǎn)換實(shí)例
這篇文章主要為大家介紹了GoFrame框架Scan類型轉(zhuǎn)換的實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06Go語(yǔ)言非main包編譯為靜態(tài)庫(kù)并使用的示例代碼
本文以Windows為例,介紹一下如何將Go的非main包編譯為靜態(tài)庫(kù),用戶又將如何使用。通過(guò)實(shí)際項(xiàng)目創(chuàng)建常規(guī)工程,通過(guò)示例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2021-07-07Go并發(fā)控制WaitGroup的使用場(chǎng)景分析
WaitGroup,可理解為Wait-Goroutine-Group,即等待一組goroutine結(jié)束,本文通過(guò)具體場(chǎng)景結(jié)合實(shí)際例子給大家介紹使用WaitGroup控制的實(shí)現(xiàn)方法,感興趣的朋友跟隨小編一起看看吧2021-07-07深入string理解Golang是怎樣實(shí)現(xiàn)的
這篇文章主要為大家介紹了深入string理解Golang是怎樣實(shí)現(xiàn)的原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04go web 預(yù)防跨站腳本的實(shí)現(xiàn)方式
這篇文章主要介紹了go web 預(yù)防跨站腳本的實(shí)現(xiàn)方式,文中給大家介紹XSS最佳的防護(hù)應(yīng)該注意哪些問(wèn)題,本文通過(guò)實(shí)例代碼講解的非常詳細(xì),需要的朋友可以參考下2021-06-06