接口/类型断言

  

1。定义
接口是类型可以定义一组方法,但是这些不需要实现,并且界面不能包含任何变量。
比如:

  
 <代码>类型{界面示例
  
  Method1(参数列表)返回值列表
  Method2(参数列表)返回值列表
  …
  } 
  

2.接口类型默认是一个指针

  
 <代码>类型{界面示例
  
  Method1(参数列表)返回值列表
  Method2(参数列表)返回值列表
  …
  }
  var的例子
  a.Method1()  
  

3。接口实现
。Golang中的接口,不需要显示的实现。只要一个变量,含有接口类型中的所有方法,那么这个变量就实现这个接口,因此,Golang中没有实现类似的关键字
b。如果一个变量含有了多个接口类型的方法,那么这个变量就实现了多个接口。
c。如果一个变量只含有了1个接口的方部分方法,那么这个变量没有实现这个接口。
4 .多态
一种事物的多种形态,都可以按照统一的接口进行操作
5。接口嵌套
一个接口可以嵌套在另外的接口,如下所示:

  
 <代码>{读写接口类型
  bool读取缓冲区(b)
  bool写缓冲区(b)
  }
  {锁接口类型
  Lock ()
  解锁()
  }
  类型文件接口{
  读写
  锁
  Close ()
  } 
     <李>类型断言,由于接口是一般类型,不知道具体类型,如果要转成具体类型可以采用以下方法进行转换:李      
 <代码> var t int
  var x接口{}
  x=t
  y=x。(int)//转成int
  
  var t int
  var x接口{}
  x=t
  y=x。(int)//转成int,带检查
   
  

7。练习,写一个函数判断传入参数的类型

  
 <代码>函数分类器(物品…接口{}){
  对于我来说,x:={范围项目
  开关x。(类型){
  案例bool: fmt。Printf("参数# % d是一个bool \ n”,我)
  案例float64: fmt。Printf("参数# % d float64 \ n”,我)
  int, int64: fmt。Printf (" # % d参数是int \ n”,我)
  情况下零:fmt。Printf("参数# % d是nil \ n”,我)
  案例字符串:fmt。Printf (" # % d参数是一个字符串\ n”,我)
  默认值:fmt。Printf("参数# % d类型是未知\ n”,我)
  }
  } 
  

8。类型断言,采用方型开关式

  
 <代码>切换t:=areaIntf。{案例*广场:fmt(类型)。Printf (" % % v T和价值类型广场\ n”, T, T)
  案例*圆:fmt。Printf("型圆% T和v值% \ n”, T, T)
  案例float32: fmt。Printf("类型float32与值% v \ n”, t)案例nil: fmt。Println (nil值:什么检查?)
  默认值:fmt。Printf(意想不到的类型% T, T)}
   
  

接口/类型断言“> <br/> 9。空接口,接口{}<br/>空接口没有任何方法,所以所有类型都实现了空接口。</p>
  <pre> <代码> var int
  var b接口{}
  b=</代码> </pre>
  <p> 10。判断一个变量是否实现了指定接口<br/>判断一个变量是否实现了指定接口</p>
  <pre> <代码>{斯特林格接口类型
  字符串()字符串
  }
  var v MyStruct
  如果sv,好的:=v (Stringer);好{
  fmt。Printf (   <人力资源/>   

 <代码>包主要
  
  进口“fmt”//没有方法的空接口,任何类型都可以
  类型测试接口{}
  
  函数main () {
  var一个接口{}
  一个=666
  fmt.Println (a)
  fmt。Printf("的类型是:% T”, a)
  } 
  

输出:
666
的类型是:int
过程完成退出代码0

  
 <代码>包主要
  
  进口“fmt”//接口里的方法必须全部实现!
  {护理员接口类型
  GetName()字符串
  Run ()
  迪迪()
  }
  
  宝马struct类型{
  名称字符串
  }
  
  字符串函数(p *宝马)GetName () {
  返回p.Name
  }
  
  func (p *宝马)Run () {
  fmt。Printf (" % s \ n”运行,p.Name)
  }
  
  func (p *宝马)迪迪(){
  fmt。Printf (" % s是迪迪\ n”, p.Name)
  }
  
  函数main () {
  var汽车护理人//如果接口中的方法只声明不实现,则是零//fmt.Println(汽车)//不实现运行方法而调用会报的错//car.Run ()
  var bmw宝马
  宝马。Name=" x6 "//因为struct宝马是指针类型,所以宝马要引用传递
  车=和宝马
  car.Run ()
  } 
  

输出:
x6运行

接口/类型断言