golang類型判斷


_.ok:=interface{}(a).(B)

此語句用於判斷對象a是否是B類型

也可以判斷對象a是否實現了B接口

package main

import "fmt"

type Pet interface {
   SetName(name string)
   Name()string
   Category()string
}

type Dog struct {
   name string
}

func (dog *Dog) SetName(name string) {
   dog.name = name
}

func(dog Dog) Name()string{
   return dog.name
}

func (dog Dog)Category()string{
   return "dog"
}

func main() {
   dog:=Dog{"little pig"}

   _,ok:=interface{}(dog).(Pet)
   fmt.Printf("Dog implements interface Pet: %v\n", ok)
   _, ok = interface{}(&dog).(Pet)
   fmt.Printf("*Dog implements interface Pet: %v\n", ok)
   fmt.Println()

   var pet Pet = &dog
   fmt.Printf("This pet is a %s, the name is %q.\n",
      pet.Category(), pet.Name())
}

輸出為:

Dog implements interface Pet: false
*Dog implements interface Pet: true

This pet is a dog, the name is "little pig".

一個指針類型實現了某某接口類型,但它的基本類型卻不一定能夠作為該接口的實現類型。

怎樣判定一個數據類型的某一個方法實現的就是某個接口類型中的某個方法呢?

這有兩個充分必要條件,一個是“兩個方法的簽名需要完全一致”,另一個是“兩個方法的名稱要一模一樣”。顯然,這比判斷一個函數是否實現了某個函數類型要更加嚴格一些。

這就意味着,Dog類型本身的方法集合中只包含了 2 個方法, 也就是所有的值方法。而它的指針類型*Dog方法集合卻包含了 3 個方法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM