ゴーインターフェース

転載:https : //www.cnblogs.com/zhangweizhong/p/9526331.html

 

1.インターフェースとは

  インターフェイスは、GO言語の基本機能の1つです。仕様または規則の一種として理解できます。これは、javaやC#とは異なります。インターフェースが実装されていることを示す必要はありません。継承またはサブクラス化したり、「implements」キーワードを使用したりすることはありません。インターフェースのメソッドを実装するのは、コントラクトの形式を通じて暗黙的に行うだけです。したがって、Golangのインターフェースにより、コーディングがより柔軟で拡張可能になります。

  go言語でインターフェースを理解するには?次の3つの点に注意してください。

    1.インターフェースはメソッド宣言のコレクションです
    。2.任意のタイプのオブジェクトは、インターフェースインターフェースで宣言されたすべてのメソッドを実装し、型がインターフェースを実装することを示します。
    3.インターフェースはデータ型として使用できます。インターフェースを実装するオブジェクトは、対応するインターフェース型変数に割り当てることができます。

 注:
    a。インターフェースは任意のオブジェクトで実装できます。タイプ/オブジェクトは複数のインターフェースを実装することもできます
    b。メソッドはオーバーロードできません。たとえば、eat()eat(s string)は同時に存在できません


2.インターフェイスの実装

package main

import "fmt"

type Phone interface {
    call()
}

type NokiaPhone struct {
}

func (nokiaPhone NokiaPhone) call() {
    fmt.Println("I am Nokia, I can call you!")
}

type ApplePhone struct {
}

func (iPhone ApplePhone) call() {
    fmt.Println("I am Apple Phone, I can call you!")
}

func main() {
    var phone Phone
    phone = new(NokiaPhone)
    phone.call()

    phone = new(ApplePhone)
    phone.call()
}
 

3.インターフェースクエリ

  インターフェースAがインターフェースBのすべてのメソッドを実装する場合、AはインターフェースBに変換できます。 

if varName2, ok := varName1.(interface2|typeName); ok {
    //此时 varName2 的类型由 interface1 转为 interface2,或者 varName1 不是 typeName 类型的变量
  } else {
    //不能转换 interface,或者 varName1 不是 typeName 类型的变量
}

4.インターフェース{}タイプ

  interface{} 类型没有声明任何一个方法,俗称空接口。interface{} 在我们需要存储任意类型的数值的时候相当有用,有点类似于C语言的void*类型。

package main

import (
    "fmt"
)

func PrintAll(vals []interface{}) {
    for _, val := range vals {
        fmt.Println(val)
    }
}

func main() {
    names := []string{"stanley", "david", "oscar"}
    vals := make([]interface{}, len(names))
    for i, v := range names {
        vals[i] = v
    }
    PrintAll(vals)
}
 

 ただし、[] Tを[]インターフェイス{}に直接割り当てることはできないことに注意してください。

 t := []int{1, 2, 3, 4}
 var s []interface{} = t

コンパイル中に次のエラーが出力されます。

割り当てのタイプ[]インターフェース{}としてt(タイプ[] int)を使用できません

 

最後

  上記は、Go言語のインターフェース機能の簡単な紹介です。go言語の場合、最も微妙なデザインはインターフェイスであると思いますが、興味があれば注意深く検討してください。

package main

import (
    "fmt"
)

//interface类型默认是指针
/*
接口的实现
Golang中的接口,不需要显示的实现。只需要一个变量,含有接口类型中的所有方法,那么这个变量就实现这个接口
因为Golang中没有implement类似的关键字
如果一个变量含有了多个interface类型的方法,那么这个变量就实现了多个接口
如果一个变量只含有了1个interface的部分方法,那么这个变量没有实现这个接口..

一种事物的多种形态,都可以按照统一的接口进行操作

*/

//接口嵌套
type ReadWrite interface {
    Read(b Buffer) bool
    Write(b Buffer) bool
}
type Lock interface {
    Lock()
    Unlock()
}
//嵌套,继承了前面四个方法,File就有6个方法
type File interface {
    ReadWrite
    Lock
    Close()
}
//类型断言,由于接口是一般类型,不知道具体类型,如果要转成具体类型可以采用以下方法进行转换
var t int
var x interface{}
x=t
y,ok=x.(int)



//定义People结构体
type People struct {
    name string
    age  int
}

//定义Test接口
type Test interface {
    //接口有2个方法
    Print()
    Sleep()
}

//定义struct
type Student struct {
    name  string
    age   int
    score int
}

//定义Print()方法
func (p Student) Print() {
    fmt.Println("name:", p.name)
    fmt.Println("age:", p.age)
    fmt.Println("score", p.score)
}

//Sleep方法
func (p Student) Sleep() {
    fmt.Println("student sleep")
}
func (people People) Print() {
    fmt.Println("name:", people.name)
    fmt.Println("age:", people.age)
}
func (p People) Sleep() {
    fmt.Println("People Sleep")
}

func main() {
    var t Test
    //接口是个地址
    fmt.Println(t)

    var stu Student = Student{
        name:  "stu1",
        age:   20,
        score: 200,
    }
    t = stu
    t.Print()
    t.Sleep()
    fmt.Println("t:", t)

}

 

公開された127元の記事 ウォン称賛24 ビュー130 000 +

おすすめ

転載: blog.csdn.net/Linzhongyilisha/article/details/99692423