1. 程式人生 > >go語言學習-介面賦值的兩種型別

go語言學習-介面賦值的兩種型別

介面賦值在go語言中分為下面兩種情況:

  1. 將物件例項賦值給介面
    在我看來go語言的介面就是c++中虛擬函式的宣告,使用者可以根據自身使用的需要宣告一個函式的集合,將需要的方法都在介面中宣告,有點像c++中,子類繼承父類之後,通過子類物件給父類賦值,因為父類有的方法(除私有方法)子類肯定都有,尤其是虛擬函式,這樣的比C++好的地方是go語言中不需要通過繼承的方式來實現多型,不同的物件只需要將介面中的所有方法都實現即可,本質上和c++一樣,實現這些介面的物件相當於子類,這個介面相當於父類,不同的地方go語言中少了繼承的過程,耦合度更低。
  2. 將一個介面賦值給另一個介面(同理)

將物件例項賦值給介面

這要求該物件例項實現了所有該介面提供的方法,下面是程式碼例項:

package main

import (
    "fmt"
)


type Integer int

func (a Integer)Less(b Integer) bool{
    return a<b
}

func (a *Integer)Add(b Integer) {
    *a += b
}


type Lesser interface {
    Less(b Integer) bool
}

type LessAdder interface {
    Less(b Integer) bool
Add(b Integer) } func main(){ fmt.Println("start ...") var inter Integer = 1 var lesser Lesser = inter isLess := lesser.Less(3) fmt.Println(lesser,"less 3 is ",isLess) var lessAdder LessAdder = &inter lessAdder.Add(3) fmt.Println("lessAdder add 3 is "
,inter) //fmt.Println("lessAdder is ",*lessAdder) //該條語句不能通過編譯 }

第二種方法通過一個介面給另一個介面賦值,在go語言中只要兩個介面擁有同樣的方法列表(次序不同不要緊),那麼他們就是等同的,可以相互賦值

package one
type ReadWriter interface{
    Read(buf []byte)(n int,err error)
    Write(buf []byte)(n int,err error)
}


package two

type Istream interface{
    Read(buf []byte)(n int,err error)
    Write(buf []byte)(n int,err error)
}

var file1 one.ReadWriter = new(file)
var file2 two.Istream = file1
var file3 one.ReadWriter = file2

在go語言中,這兩個介面是等價的,因為:

  1. 任何實現了one.ReadWriter介面的類,均實現了two.ReadWriter
  2. 任何one.ReadWriter的介面可以賦值給two.ReadWriter,反之亦然
  3. 在任何地方使用two.ReadWriter的介面和使用one.ReadWriter的介面沒有差別

介面賦值並不是要求兩個介面是等價的,如果A的方法列表是介面B的方法列表的子集,那麼介面B可以賦值給介面A,但是反過來就不成立