1. ホーム
  2. スクリプト・コラム
  3. ゴラン

Go言語インタフェースの説明

2022-02-14 19:20:10

インターフェースは、メソッド(正規の動作)の集合体である

オブジェクト指向の世界では、一般的にこのように定義されます。インターフェースは、オブジェクトの動作を定義し、オブジェクトのサブクラスの動作を規制するものです。

Goのインターフェースは、non-intrusive(インターフェースが消えてもコードに影響しない)、intrusive(インターフェースが消えてもサブクラスがエラーを報告する)です。

Goはまた、アヒルの種類は、例えば、私は今、アヒルのクラスを持って、話すメソッドと実行メソッドの内部では、限り、彼らは話すと実行を実装するようにサブクラスは、私はサブクラスは、アヒルだと思う、私はちょうどサブクラスでこれら二つのメソッドが必要ですあなたは、アヒルは、彼が下から派生した限り、あなたの中に何かがあると、それはあなたからこのインターフェースを継承するものとみなされる

1. インターフェースの目的

インターフェースは、タイプ

// Duck defines a duck interface
type Duck interface {
   speak()
   run()
}

// WhiteDuck defines a white duck structure
type WhiteDuck struct {
   name string
   age int
   sex string
sex string }

// BlackDuck defines a black duck structure
type BlackDuck struct {
   name string
   age int
   sex string
}

// Let the white duck and the black duck bind all the methods in the interface, and call it an implementation of the interface
// Let the white duck implement the Duck interface
func (w WhiteDuck) speak() {
   fmt.Println("The white duck quacks, its name is ", w.name)
}

func (w WhiteDuck) run() {
   fmt.Println("The white duck walks slowly, its name is ", w.name)
}

// Make the black duck implement the Duck interface
func (b BlackDuck) speak() {
   fmt.Println("The black duck quacks, its name is ", b.name)
}

func (b BlackDuck) run() {
   fmt.Println("Black Duck quacks, its name is ", b.name)
}


func main() {
   var duck Duck
   duck = WhiteDuck{"white", 15, "male"} // Assign my object to an interface type, and you can achieve the effect of polymorphism
   fmt.Println(duck)
    
   // duck is now an interface, it can only take methods, not properties.
   duck.speak()
   duck.run()
}




// 出力します。
{白15男}
白い鴨が鳴く、その名は「白」。
白いアヒルはゆっくり歩く、その名は「白」。

2. タイプ・アサーション

構造体、プロパティ、独自のメソッドにもインターフェイスの型である、インターフェイスの基礎となる値を抽出するために使用します。

func main() {
	var duck Duck = WhiteDuck{"小白", 15, "男"}
	// assert that it is of type WhiteDuck
	value, ok := duck.(WhiteDuck)
	// Assertion succeeds, ok = true, value is the WhiteDuck structure object
	fmt.Println(value) // Output: {white 15 male}
	fmt.Println(value.name) // output: White
	fmt.Println(ok) // output: true

	// Assertion failed, ok1 = false, value1 is null of type BlackDuck because no value was assigned
	value1, ok1 := duck.(BlackDuck)
	fmt.Println(value1) // Output: { 0 }
	fmt.Println(ok1) // output: false
}

3. タイプ選択

(タイプスイッチ経由)

多くの case 文で指定された型と、インターフェースの特定の型を比較するために使用されます。

func main() {
   var duck Duck = WhiteDuck{"小白", 15, "男"}
   test(duck)
}

func test(duck Duck) {
   switch value := duck.(type) {
   case WhiteDuck:
      fmt.Println(value.name)
      fmt.Println("I'm a white duck")
   case BlackDuck:
      fmt.Println(value.name)
      fmt.Println("I'm a black duck")
   default:
      fmt.Println(value)
      fmt.Println("I am the class of ducks")
   }
}

4. 空のインターフェース

メソッドはなく、すべてのデータ型が空のインターフェイスを実装しています。

type Empty interface {} // Empty interface

func main() {
   var a int = 10
   var b string = "XiaoYang"
   var c [3]int
   var e Empty // e is the empty interface type, which can accept any data type
   e = a
   e = b
   e = c
    
   // In this case you need to select it back
   // Normally I can only accept Empty types, but a b c are not Empty types
   test(a) // output: I am int 10
   test(b) // output: I am the string XiaoYang
   test(c) // output: I am the array [0 0 0]
}

// If this is not an empty interface, like Duck, then all data types that implement the Duck interface can be passed
func test(b Empty) {		
   switch v:=b.(type) {
   case string:
      fmt.Println("I am string", v)
   case int:
      fmt.Println("I am int", v)
   case [3]int:
      fmt.Println("I am array", v)
   }
}

5. 匿名の空のインターフェイス

名前のない空のインターフェースで、通常はフォームのパラメータに使用されます。

func main() {
   var duck Duck = WhiteDuck{"小白", 15, "男"}
   test(10)
   test("XiaoYang")
   test(duck)
}

// This is called the anonymous null interface, all data types can be passed into it, if you want to use the original structure also need to type selection back to use
func test(b interface{}) {
   fmt.Println(b)
}

6. 複数インターフェースの実装

// Duck Define a duck interface
type Duck interface {
   speak()
   run()
}

type Animal interface {
   eat()
   sleep()
}

// WhiteDuck defines a white duck structure
type WhiteDuck struct {
   name string
   age int
   sex string
sex string }


// Make the white duck implement the Duck interface as well as the Animal interface
func (w WhiteDuck) speak() {
   fmt.Println("White Duck quacks, its name is ", w.name)
}

func (w WhiteDuck) run() {
   fmt.Println("The white duck walks slowly, its name is ", w.name) 
}

func (w WhiteDuck) eat() {
   fmt.Println("White Duck eats, its name is ", w.name)
}

func (w WhiteDuck) sleep() {
   fmt.Println("WhiteDuck sleeps, its name is ", w.name)
}


func main() {
	var w WhiteDuck = WhiteDuck{}
	var a Animal
	var d Duck

	// This way my w can be given to either a or d
	// but once you go to an interface, you can only use the methods of that interface, your own properties and your own methods need to be type asserted before you can use them
	
	a = w // If w is given to a, then a can only call the methods of the Animal interface
	a.sleep()
	a.eat()
	
	d = w // w gives d, then a can only call the methods of the Duck interface
	d.run()
	d.speak()
}

7. インターフェースのネスト

type Duck interface {
   Animal // Duck nests the Animal interface
   speak()
   run()
run() }

type Animal interface {
   eat()
   sleep()
sleep()

type WhiteDuck struct {
   name string
   age int
   sex string
}


// This way the white duck implements the Duck interface as well as the Animal interface
func (w WhiteDuck) speak() {
   fmt.Println("The white duck quacks, its name is ", w.name)
}

func (w WhiteDuck) run() {
   fmt.Println("The white duck walks slowly, its name is ", w.name)
}
func (w WhiteDuck) eat() {
   fmt.Println("The white duck quacks, its name is ", w.name)
}

func (w WhiteDuck) sleep() {
   fmt.Println("The white duck goes slow, its name is ", w.name)
}



func main() {
   var a Animal
   var d Duck
   var w WhiteDuck = WhiteDuck{}

   // w can be given either to a or to d
   a = w // but a can only call two methods in Animal
   a.sleep()
   a.eat()

   d = w // but d can call all four methods in Duck and Animal
   d.sleep()
   d.eat()
   d.speak()
   d.run()
}

8. インターフェース ゼロ値

func main() {

   var a Animal // nil means it's a reference type
   // Its internal representation tells us that it holds two values, one of its type and one of a pointer to a specific value

   fmt.Println(a) // Output: <nil>
}

9. メイクとニューの違い

type WhiteDuck struct {
   name string
   sex string
   age int
age int }

func main() {
   var per1 *WhiteDuck = new(WhiteDuck) // new is returning a pointer to this type
   // or I take the address of WhiteDuck and assign it to per2
   var per2 = &WhiteDuck{}

   fmt.Println(per1) // output: &{ 0}
   fmt.Println(per2) // output: &{ 0}

   var per3 = make([]int, 3, 4) // make is a concrete creation reference type
                           // new is to create a pointer to this type
   var per4 = new([]int) // is a pointer to a slice type

   fmt.Println(per3) // output: [0 0 0]
   fmt.Println(per4) // output: &[]
}

概要

この記事は以上です。あなたのお役に立てれば幸いです。また、Script Houseの他のコンテンツにももっと注目してください