在线咨询
QQ咨询
服务热线
服务热线:13125520620
TOP

GO开发:接口

发布时间:2018-2-24 浏览:2882

接口
接口定义
Interface类型可以定义一组方法,但是这些不需要实现。并且interface不能包含任何变量。
 
type example interface{
        Method1(参数列表) 返回值列表
        Method2(参数列表) 返回值列表
        …
        var a example
        a.Method1()
}
interface类型默认是一个指针
 
接口实现:
a. Golang中的接口,不需要显示的实现。只要一个变量,含有接口类型中的所有方法,那么这个变量就实现这个接口。因此,golang中没有implement类似的关键字
 
b. 如果一个变量含有了多个interface类型的方法,那么这个变量就实现了多个接口。
 
c.如果一个变量只含有了1个interface的方部分方法,那么这个变量没有实现这个接口。
 
接口嵌套
一个接口可以嵌套在另外的接口,如下所示
 
 type ReadWrite interface {
               Read(b Buffer) bool
               Write(b Buffer) bool
type Lock interface {
               Lock()
               Unlock() 
type File interface {
               ReadWrite
               Lock 
               Close() 
实例:
 
package main
 
import "fmt"
 
type Reader interface {
   Read()
}
 
type Writer interface {
   Write()
}
 
type ReadWriter interface {
   Reader
   Writer
}
 
type File struct {
}
 
func (f *File) Read() {
   fmt.Println("read data")
}
 
func (f *File) Write() {
   fmt.Println("write data")
}
 
func Test(rw ReadWriter) {
   rw.Read()
   rw.Write()
}
 
func main() {
   var f *File
   Test(f)
 
   var b interface{}
   b = f
   v, ok := b.(ReadWriter)
   fmt.Println(v, ok)
}
类型断言
由于接口是一般类型,不知道具体类型,如果要转成具体类型,可以采用以下方法进行转换:
 
/*
var t int
var x interface{}
x = t
y = x.(int)   //转成int
 
var t int
var x interface{}
x = t
y, ok = x.(int)   //转成int,带检查
*/
package main
 
import "fmt"
 
type Student struct {
    Name string
    Sex  string
}
 
func Test(a interface{}) {
    b, ok := a.(Student)
    if ok == false {
        fmt.Println("convert failed")
        return
    }
    //b += 3
    fmt.Println(b)
}
 
func main()  {
    var a interface{}
    var b int
    a = b
    c := a.(int)
    fmt.Printf("%d %T\n",a,a)
    fmt.Printf("%d %T\n",b,b)
    fmt.Printf("%d %T\n",c,c)
 
    var st Student = Student{
        Name: "stu01",
        Sex:  "female",
    }
    Test(st)
    fmt.Printf("%T\n",st)
}
类型断言,采用type switch方式
 
空接口Interface{}
 
nterface{},接口中一个方法也没有,所以任何类型都实现了空接口,也就是任何变量都可以赋值给空接口。
 
var a int
var b interface{}
b  = a
判断一个变量是否实现了指定接口
 
 type Stringer interface {
        String() string 
}
var v MyStruct
if sv, ok := v.(Stringer); ok {
       fmt.Printf(“v implements String(): %s\n”, sv.String()); 
实现一个通用的链表类
 
package main
 
import "fmt"
 
type LinkNode struct {
   data interface{}
   next *LinkNode
}
 
type Link struct {
   head *LinkNode
   tail *LinkNode
}
 
func (p *Link) InsertHead(data interface{}) {
   node := &LinkNode{
      data: data,
      next: nil,
   }
 
   if p.tail == nil && p.head == nil {
      p.tail = node
      p.head = node
      return
   }
 
   node.next = p.head
   p.head = node
}
 
func (p *Link) InsertTail(data interface{}) {
   node := &LinkNode{
      data: data,
      next: nil,
   }
 
   if p.tail == nil && p.head == nil {
      p.tail = node
      p.head = node
      return
   }
 
   p.tail.next = node
   p.tail = node
}
 
func (p *Link) Trans() {
   q := p.head
   for q != nil {
      fmt.Println(q.data)
      q = q.next
   }
}
 
func main() {
   var link Link
   for i := 0; i < 10; i++ {
      //intLink.InsertHead(i)
      link.InsertTail(fmt.Sprintf("str %d", i))
   }
   link.Trans()
}      
软件定制,博远电子,友情提醒。

TAG
软件定制,软件开发,瀚森HANSEN
0
该内容对我有帮助