go語(yǔ)言實(shí)現(xiàn)接口查詢
一句話總結(jié):如果接口A實(shí)現(xiàn)了接口B中所有方法,那么A可以轉(zhuǎn)化為B接口。
package options
type IPeople interface {
GetName() string
}
type IPeople2 interface {
GetName() string
GetAge() int
}
package main
import (
"fmt"
"options"
)
type person struct {
name string
}
func (p *person) GetName() string {
return p.name
}
type person2 struct {
name string
age int
}
func (p *person2) GetName() string {
return p.name
}
func (p *person2) GetAge() int {
return p.age
}
func main() {
//p不可以轉(zhuǎn)化為options.IPeople2接口,沒(méi)有實(shí)現(xiàn)options.IPeople2接口中的GetAge()
var p options.IPeople = &person{"jack"}
if p2, ok := p.(options.IPeople2); ok {
fmt.Println(p2.GetName(), p2.GetAge())
} else {
fmt.Println("p不是Ipeople2接口類(lèi)型")
}
//p2可以轉(zhuǎn)化為options.IPeople接口,因?yàn)閷?shí)現(xiàn)了options.IPeople接口的所有方法
var p2 options.IPeople2 = &person2{"mary", 23}
if p, ok := p2.(options.IPeople); ok {
fmt.Println(p.GetName())
}
var pp options.IPeople = &person{"alen"}
if pp2, ok := pp.(*person); ok {
fmt.Println(pp2.GetName()) //pp接口指向的對(duì)象實(shí)例是否是*person類(lèi)型,*不能忘
}
switch pp.(type) {
case options.IPeople:
fmt.Println("options.IPeople") //判斷接口的類(lèi)型
case options.IPeople2:
fmt.Println("options.IPeople2")
default:
fmt.Println("can't found")
}
var ii interface{} = 43 //默認(rèn)int類(lèi)型
switch ii.(type) {
case int:
fmt.Println("int")
default:
fmt.Println("can't found")
}
}
補(bǔ)充:golang中Any類(lèi)型使用及空接口中類(lèi)型查詢
1.Any類(lèi)型
GO語(yǔ)言中任何對(duì)象實(shí)例都滿足空接口interface{},空接口可以接口任何值
var v1 interface{} = 1
var v2 interface{} = "abc"
var v3 interface{} = 2.345
var v4 interface{} = make(map[..]...)
....
2.1 關(guān)于空接口的類(lèi)型查詢方式一,使用ok
package main
import "fmt"
//空接口可以接受任何值
//interface { }
func main() {
var v1 interface{ }
v1 = 6.78
//賦值一個(gè)變量v判斷其類(lèi)型是否為float64,是則為真,否則,為假
if v, ok := v1.(float64);ok{
fmt.Println(v, ok)
}else {
fmt.Println(v,ok)
}
}
2.2 關(guān)于空接口類(lèi)型查詢方式二,switch語(yǔ)句結(jié)合 var.type()
package main
import "fmt"
//空接口可以接受任何值
//interface { }
func main() {
var v1 interface{ }
v1 = "張三"
switch v1.(type) {
case float32:
case float64:
fmt.Println("this is float64 type")
case string:
fmt.Println("this is string type")
}
}
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
Go語(yǔ)言中make和new函數(shù)的用法與區(qū)別
這篇文章介紹了Go語(yǔ)言中make和new函數(shù)的用法與區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07
golang?pprof監(jiān)控memory?block?mutex統(tǒng)計(jì)原理分析
這篇文章主要為大家介紹了golang?pprof監(jiān)控memory?block?mutex統(tǒng)計(jì)原理分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
Golang并發(fā)編程中Context包的使用與并發(fā)控制
Golang的context包提供了在并發(fā)編程中傳遞取消信號(hào)、超時(shí)控制和元數(shù)據(jù)的功能,本文就來(lái)介紹一下Golang并發(fā)編程中Context包的使用與并發(fā)控制,感興趣的可以了解一下2024-11-11
Go語(yǔ)言學(xué)習(xí)之運(yùn)算符使用詳解
這篇文章主要介紹了Go語(yǔ)言中常用運(yùn)算符的使用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04
用Go寫(xiě)一個(gè)輕量級(jí)的ssh批量操作工具的方法
這篇文章主要介紹了用Go寫(xiě)一個(gè)輕量級(jí)的ssh批量操作工具的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-02-02
利用Go語(yǔ)言搭建WebSocket服務(wù)端方法示例
這篇文章主要給大家介紹了利用Go語(yǔ)言搭建WebSocket服務(wù)端方法,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們可以參考借鑒,下面來(lái)一起看看吧。2017-04-04
Go map底層實(shí)現(xiàn)與擴(kuò)容規(guī)則和特性分類(lèi)詳細(xì)講解
這篇文章主要介紹了Go map底層實(shí)現(xiàn)與擴(kuò)容規(guī)則和特性,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2023-03-03
如何控制Go編碼JSON數(shù)據(jù)時(shí)的行為(問(wèn)題及解決方案)
今天來(lái)聊一下我在Go中對(duì)數(shù)據(jù)進(jìn)行 JSON 編碼時(shí)遇到次數(shù)最多的三個(gè)問(wèn)題以及解決方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2020-02-02

