zoukankan      html  css  js  c++  java
  • golang学习笔记---Method/ 接口 Interfaces

    Go 支持在结构体类型中定义方法 (methods)

    package main
    
    import "fmt"
    
    type rect struct {
        width, height int
    }
    
    // 这里的 `area` 方法有一个_接收器(receiver)类型_ `rect`。
    func (r *rect) area() int {
        return r.width * r.height
    }
    
    // 可以为值类型或者指针类型的接收器定义方法。这里是一个
    // 值类型接收器的例子。
    func (r rect) perim() int {
        return 2*r.width + 2*r.height
    }
    
    func main() {
        r := rect{ 10, height: 5}
    
        // 这里我们调用上面为结构体定义的两个方法。
        fmt.Println("area: ", r.area())
        fmt.Println("perim:", r.perim())
    
        // Go 自动处理方法调用时的值和指针之间的转化。你可以使
        // 用指针来调用方法来避免在方法调用时产生一个拷贝,或者
        // 让方法能够改变接受的结构体。
        rp := &r
        fmt.Println("area: ", rp.area())
        fmt.Println("perim:", rp.perim())
    }
    

     

    接口 (Interfaces) 是命名了的方法签名 (signatures) 的集合。

    package main
    
    import "fmt"
    import "math"
    
    // 这里是一个几何体的基本接口。
    type geometry interface {
        area() float64
        perim() float64
    }
    
    // 在我们的例子中,我们将在类型 `rect` 和 `circle` 上实现
    // 这个接口
    type rect struct {
        width, height float64
    }
    type circle struct {
        radius float64
    }
    
    // 要在 Go 中实现一个接口,我们就需要实现接口中的所有
    // 方法。这里我们在 `rect` 上实现了 `geometry` 接口。
    func (r rect) area() float64 {
        return r.width * r.height
    }
    func (r rect) perim() float64 {
        return 2*r.width + 2*r.height
    }
    
    // `circle` 的实现。
    func (c circle) area() float64 {
        return math.Pi * c.radius * c.radius
    }
    func (c circle) perim() float64 {
        return 2 * math.Pi * c.radius
    }
    
    // 如果一个变量具有接口类型,那么我们可以调用指定接口中的
    // 方法。这里有一个通用的 `measure` 函数,利用它来在任
    // 何的 `geometry` 上工作。
    func measure(g geometry) {
        fmt.Println(g)
        fmt.Println(g.area())
        fmt.Println(g.perim())
    }
    
    func main() {
        r := rect{ 3, height: 4}
        c := circle{radius: 5}
    
        // 结构体类型 `circle` 和 `rect` 都实现了 `geometry`
        // 接口,所以我们可以使用它们的实例作为 `measure` 的参数。
        measure(r)
        measure(c)
    }
    

      

     

  • 相关阅读:
    poj1631 LIS 裸题
    UESTC 电子科大专题训练 DP-N
    UESTC 电子科大专题训练 DP-M
    UESTC 电子科大专题训练 DP-D
    Codeforces Round #424 D
    Codeforces Round #424 C
    Codeforces Round #424 B
    Codeforces Round #424 A
    hiho一下159
    hiho一下158(hihocoder 1318)
  • 原文地址:https://www.cnblogs.com/saryli/p/12165506.html
Copyright © 2011-2022 走看看