[Goチュートリアルシリーズノート]Interface第2部

6476 ワード

  • GoチュートリアルシリーズノートInterface第1部
  • GoチュートリアルシリーズノートInterface第2部
  • Goチュートリアルシリーズノート同時紹介
  • Goチュートリアルシリーズノートgoroutine(協程)
  • Goチュートリアルシリーズノートチャンネル
  • Goチュートリアルシリーズノートバッファチャネルとワークプール
  • GoチュートリアルシリーズノートSelect
  • GoチュートリアルシリーズノートMutex(反発ロック)
  • Goチュートリアルシリーズノート構造はクラス-GOのOOPではありません
  • Goチュートリアルシリーズノートの組み合わせは-GOのOOPを継承するのではなく
  • Goチュートリアルシリーズノートマルチステート-GOのOOP

  • ポインタ受信機と値受信機を使用してインタフェースを実装


    第1部で論じたすべての例示的なインタフェースは、値受信機を用いて実現される.ポインタ受信機を使用してインタフェースを実装することもできます.ポインタ受信機を使用してインタフェースを実装する際には、いくつかの細かい点に注意する必要があります.以下のプログラムの使用について説明します.
    type Describer interface {
        Describe()
    }
    
    type Person struct {
        name string
        age int
    }
    
    func (p Person) Describe() { // value receiver
        fmt.Printf("%s is %d years old
    ", p.name, p.age) } type Address struct { state string country string } func (a *Address) Describe() { // pointer receiver fmt.Printf("State %s Country %s", a.state, a.country) } func main() { var d1 Describer p1 := Person{"Sam", 25} d1 = p1 d1.Describe() p2 := Person{"James", 32} d1 = &p2 d1.Describe() ////---------------- var d2 Describer a := Address{"Washington", "USA"} // Cannot use a (type Address) as type Describe in assignment //d2 = a // (Address ) Describe ,Address Describe d2 = &a d2.Describe() }
  • 第1部まとめ:ポインタと値タイプの呼び出し
  • を同時に受け入れる値受信器付き方法
  • 第2部は、ポインタまたはそのアドレスを取得できる任意のインスタンスでポインタ値メソッドを呼び出すことが合法であるため、要約する.インタフェースに格納されている特定の値はアドレスできないため、コンパイラが自動的にアドレスを取得することはできません.

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


    1つのタイプで複数のインタフェースを実装できます.
    package main
    
    import (  
        "fmt"
    )
    
    type SalaryCalculator interface {  
        DisplaySalary()
    }
    
    type LeaveCalculator interface {  
        CalculateLeavesLeft() int
    }
    
    type Employee struct {  
        firstName string
        lastName string
        basicPay int
        pf int
        totalLeaves int
        leavesTaken int
    }
    
    func (e Employee) DisplaySalary() {  
        fmt.Printf("%s %s has salary $%d", e.firstName, e.lastName, (e.basicPay + e.pf))
    }
    
    func (e Employee) CalculateLeavesLeft() int {  
        return e.totalLeaves - e.leavesTaken
    }
    
    func main() {  
        e := Employee {
            firstName: "Naveen",
            lastName: "Ramanathan",
            basicPay: 5000,
            pf: 200,
            totalLeaves: 30,
            leavesTaken: 5,
        }
        var s SalaryCalculator = e
        s.DisplaySalary()
        var l LeaveCalculator = e
        fmt.Println("
    Leaves left =", l.CalculateLeavesLeft()) }

    埋め込みインタフェース


    Goは継承を提供しないが、他のインタフェースを埋め込むことで新しいインタフェースを作成することができる.
    type SalaryCalculator interface {  
        DisplaySalary()
    }
    
    type LeaveCalculator interface {  
        CalculateLeavesLeft() int
    }
    
    type EmployeeOperations interface {  
        SalaryCalculator
        LeaveCalculator
    }
    
    type Employee struct {  
        firstName string
        lastName string
        basicPay int
        pf int
        totalLeaves int
        leavesTaken int
    }
    
    func (e Employee) DisplaySalary() {  
        fmt.Printf("%s %s has salary $%d", e.firstName, e.lastName, (e.basicPay + e.pf))
    }
    
    func (e Employee) CalculateLeavesLeft() int {  
        return e.totalLeaves - e.leavesTaken
    }
    
    func main() {  
        e := Employee {
            firstName: "Naveen",
            lastName: "Ramanathan",
            basicPay: 5000,
            pf: 200,
            totalLeaves: 30,
            leavesTaken: 5,
        }
        var empOp EmployeeOperations = e
        empOp.DisplaySalary()
        fmt.Println("
    Leaves left =", empOp.CalculateLeavesLeft()) }

    インタフェースゼロ


    インタフェースのゼロ値はnilです.nilは、インタフェースの下位値であり、特定のタイプでもある.
    package main
    
    import "fmt"
    
    type Describer interface {  
        Describe()
    }
    
    func main() {  
        var d1 Describer
        if d1 == nil {
            fmt.Printf("d1 is nil and has type %T value %v
    ", d1, d1) } }
    nilインタフェースでメソッドを呼び出そうとすると、プログラムにエラーが発生します.nilインタフェースには、下位値も特定のタイプもないからです.
    タイムズエラーの実行:無効なメモリアドレスまたはnilポインタの参照解除
    [signal SIGSEGV: segmentation violation code=0xffffffff addr=0x0 pc=0xc8527]"