golang中接口對象的轉型兩種方式

接口對象的轉型有兩種方式:

1. 方式一:instance,ok:=接口對象.(實際類型)

  如果該接口對象是對應的實際類型,那麼instance就是轉型之後對象,ok的值為true
  配合if…else if…使用

2. 方式二:

  接口對象.(type)
  配合switch…case語句使用

示例:

package main
 
import (
    "fmt"
    "math"
)
 
type shape interface {
    perimeter() int
    area() int
}
 
type rectangle struct {
    a int  // 長
    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("長方形的長:%d,長方形的寬是:%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("長方形的長:%d,長方形的寬是:%d\n", i.a, i.b)
    case circle:
        fmt.Printf("圓形的半徑是:%d\n", i.radios)
    }
}
 
func getResult(s shape) {
    fmt.Printf("圖形的周長是:%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()函數改為:

func getType(s shape) {
 switch i := s.(type) {
 case rectangle:
  fmt.Printf("圖形的長:%.2f,圖形的寬:%.2f \n", i.a, i.b)
 case triangle:
  fmt.Printf("圖形的第一個邊:%.2f,圖形的第二個邊:%.2f,圖形的第三個邊:%.2f \n",i.a,i.b,i.c)
 case circular:
  fmt.Printf("圖形的半徑:%.2f \n",i.radius)
 }
}

PS:上面求三角形面積使用瞭海倫公式求三角形的面積,公式為:

三角形的面積=平方根[三角形周長的一半×(三角形周長的一半減去第一個邊)×(三角形周長的一半減去第二個邊)×(三角形周長的一半減去第三個邊)]

到此這篇關於golang中接口對象的轉型的文章就介紹到這瞭,更多相關golang接口對象內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: