• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

go面向对象3

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

类型断言

.(type)   来实现    其中  type 对应的就是要断言的类型

接口类型断言

var  num1 Number = 1

var num2 Number2  = &num1

if num3,ok := num2.(Number1);ok {

  fmt.Println(num3.Equal(1))

}

 

结构体类型断言

type IAnimal interface {

  GetName() string

  Call() string

  FavorFood() string

}

var animal = NewAnimal("蓝猫")

var  pet = new Pet("蓝白")

var ianimal INamial = NewDog(&animal,pet)

if dog,ok := ianimal.(Dog); ok {

  fmt.Println(dog.GetName())

}

 

基于反射动态断言类型

func  myPrintf(args ...interface{}) {

  for _,arg := range args {

    swich reflect.TypeOf(arg).kind(){

    case reflect.Int:

      fmt.Println(arg,"is an int value")

    case reflect.Array:

      fmt.Println()

    default :

    }

  }

}

如果要获取 ianimal的实际类型 可以使用   reflect.Typeof(ianimal)   获取

 

对于基本数据类型  比如int  string  bool 不必通过反射 直接使用variable.(type)

  switch arg.(type)

 

 

空接口,反射  和泛型

interface{}    

空接口和接口零值不是一个概念      前者是interface{}     后者是nil

 

空接口基本使用

空接口可以是指向任意类型变量

var v1  interface{} = 1

var v2  interface{} = true

复合类型

var v3 interface{} = struct{

  id int,

  name string

}{1,"fly"}

 

声明任意类型参数

func Printf(ftm string ,args ...interface{})

 

func Println(args ...interface{})  ...

 

func (p *pp) PrintArg(arg interface{},verb rune)

 

实现更灵活的类型断言

var animal = NewAnimal("蓝猫")

var  pet = NewPet("蓝白猫")

var any  interface{} = NewDog(&animal,pet)

if dog,ok := any.(Dog);ok {

  

}

 

反射 

通过反射 可以在运行时动态的获取变量的类型和结构信息

非常典型的应用场景是ioc容器

 

reflect

reflect.TypeOf(dog)

reflect.TypeOf(&dog).Elem()

reflect.ValueOf(dog)

 

 

基于空接口和反射实现泛型

interface{} 本身可以表示任何类型   因此他是一个泛型 

例子  自定义容器类型的实现来演示实现一个泛型

package  main

import (

  "fmt"

  "reflect"

)

 

type Container struct {

  s reflect.Value

}

func NewContainer( t reflect.Type,size int) *Container {

  if size <= 0 {

    szie = 64

  }

  return &Container{

    s:reflect.MakeSlice(reflect.SliceOf(t) ,0 ,szie)

  }

}

func (c *Container)  Put(val interface{}) error {

  if reflect.ValueOf(val).Type() != c.s.Type().Elem(){

    return fmt.Errorf("put error :can not  put a %T into a slice of %s",val,c.s.Type().Elem())

  }

  c.s =  reflect.Append(c.s,reflect.ValueOf(val))

  return nil

}

 

if err :=c.Put("s");err != nil{

  panic(err)

}

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
3、Go Exit发布时间:2022-07-10
下一篇:
让我们一起Go(三)发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap