go语言类型判断

一句话总结:利用类型判断可以判断接口是否属于某个具体的接口或者类型,另外.(type)仅用于switch语句。

注意主体是接口类型,

另外待判断对象的类型跟:

接收方法若为值,判断对象可以是值或者指针;接收方法若为指针,判断对象也要是指针;接收方法若为值和指针,判断对象也要是指针。

对象若未实现全部接口的方法,则该对象不属于该接口。

方法的接收对象是值

package main
 
import (
	"fmt"
)
 
type Biology interface {
	getName() string
	getAge() int
}
type person struct {
	name string
	age  int
}
 
func (p person) getName() string {
	return p.name
}
func (p person) getAge() int {
	return p.age
}
 
func do(i interface{}) {
	o, ok := i.(Biology)
	fmt.Println(o, ok)
}
 
func main() {
	var p person = person{"jack", 33}
	k, v := (interface{})(p).(Biology)
	fmt.Println(k, v) //{jack 33} true
	k, v = (interface{})(&p).(Biology)
	fmt.Println(k, v) //&{jack 33} true
	do(p)             //{jack 33} true
	do(&p)            //&{jack 33} true
}

方法接收的对象是指针、指针和值结果是一样的

package main
 
import (
	"fmt"
)
 
type Biology interface {
	getName() string
	getAge() int
}
type person struct {
	name string
	age  int
}
 
func (p *person) getName() string {
	return p.name
}
func (p *person) getAge() int {
	return p.age
}
 
func do(i interface{}) {
	o, ok := i.(Biology)
	fmt.Println(o, ok)
}
 
func main() {
	var p person = person{"jack", 33}
	k, v := (interface{})(p).(Biology)
	fmt.Println(k, v) //<nil> false
	k, v = (interface{})(&p).(Biology)
	fmt.Println(k, v) //&{jack 33} true
	do(p)             //<nil> false
	do(&p)            //&{jack 33} true
}
 

对象未实现接口的全部方法

package main
 
import (
	"fmt"
)
 
type Biology interface {
	getName() string
	getAge() int
}
type person struct {
	name string
	age  int
}
 
func (p *person) getName() string {
	return p.name
}
 
func do(i interface{}) {
	o, ok := i.(Biology)
	fmt.Println(o, ok)
}
 
func main() {
	var p person = person{"jack", 33}
	k, v := (interface{})(p).(Biology)
	fmt.Println(k, v) //<nil> false
	k, v = (interface{})(&p).(Biology)
	fmt.Println(k, v) //<nil> false
	do(p)             //<nil> false
	do(&p)            //<nil> false
}


.(type)仅用于switch语句

package main
 
import (
	"fmt"
)
 
type person struct {
	name string
}
 
func (p person) getname() string {
	return p.name
}
 
func getType(i interface{}) {
	switch v := i.(type) {
	case int:
		fmt.Println("int", v)
	case string:
		fmt.Println("string", v)
	case person:
		fmt.Println("person", v)
	default:
		fmt.Println("none")
	}
}
 
func main() {
	p := person{"jack"}
 
	switch (interface{})(p).(type) {
	case person:
		fmt.Println("person") //person
	case *person:
		fmt.Println("*person")
	default:
		fmt.Println("none")
	}
 
	switch (interface{})(&p).(type) {
	case person:
		fmt.Println("person")
	case *person:
		fmt.Println("*person") //*person
	default:
		fmt.Println("none")
	}
 
	getType(p) //person {jack}
 
	var i int = 12
	getType(i) //int 12
	var s string = "hello"
	getType(s) //string hello
 
	k, v := (interface{})(s).(string)
	fmt.Println(k, v) //hello true
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值