• Go 方法和接口


    转自:http://studygolang.com/topics/549

    Go 没有类,但可以在结构体类型上定义方法

    package main 
    import (
        "fmt"
        "math" 
    )
    
    type Vertex struct { X, Y float64 }
    
    func (v Vertex) Abs() float64 { 
        return math.Sqrt(v.Xv.X + v.Y*v.Y) 
    }
    
    func main() { 
        v := &Vertex{3, 4} fmt.Println(v.Abs())
    } 

    可以对包中的 任意 类型定义任意方法,而不仅仅是针对结构体。但是,不能对来自其他包的类型或基础类型定义方法。 接收者为指针的方法:方法可以与命名类型或命名类型的指针关联。有两个原因需要使用指针接收者:避免在每个方法调用中拷贝值(如果值类型是大的结构体的话会更有效率);方法可以修改接收者指向的值。 

    package main
    
    import ( 
        "fmt" 
        "math" 
    )
    
    type MyFloat float64
    
    func (f MyFloat) Abs() float64 {
        if f < 0
        { 
            return float64(-f) 
        } 
        return float64(f) 
    }
    
    func main() {
        f := MyFloat(-math.Sqrt2) 
        fmt.Println(f.Abs())
    }     

    接口:接口类型是由一组方法定义的集合。接口类型的值可以存放实现这些方法的任何值。 

    package main
    
    import ( "fmt" "math" )
    
    type Abser interface { Abs() float64 }
    
    func main() {
        var a Abser f := MyFloat(-math.Sqrt2)
        v := Vertex{3, 4}
        a = f  // a MyFloat 实现了 Abser
        a = &v // a *Vertex 实现了 Abser
        // 下面一行,v 是一个 Vertex(而不是 *Vertex)
        // 所以没有实现 Abser。
        a = v
    
        fmt.Println(a.Abs())
    }
    
    type MyFloat float64
    
    func (f MyFloat) Abs() float64 {
        if f < 0
        {
            return float64(-f) 
        }
            return float64(f) 
    }
    
    type Vertex struct { X, Y float64 }
    
    func (v Vertex) Abs() float64 
    {
        return math.Sqrt(v.Xv.X + v.Y*v.Y)
    }        

    隐式接口:解藕了实现接口的包和定义接口的包:互不依赖。因此,也就无需在每一个实现上增加新的接口名称,这样同时也鼓励了明确的接口定义。

    package main
    
    import ( "fmt" "os" )
    
    type Reader interface { Read(b []byte) (n int, err error) }
    
    type Writer interface { Write(b []byte) (n int, err error) }
    
    type ReadWriter interface { Reader Writer }
    
    func main() { 

      var w Writer   // os.Stdout 实现了 Writer   w = os.Stdout   fmt.Fprintf(w, "hello, writer ") }

    下面列举几个go标准包的接口:

    type Stringer struct { String() string }

    type error interface { Error() string }

    io.Reader 接口有一个 Read 方法:

    func (T) Read(b []byte) (n int, err error)

    Read 用数据填充指定的字节 slice,并且返回填充的字节数和错误信息。

    在遇到数据流结尾时,返回 io.EOF 错误。

    package main 
    import (
        "fmt" 
        "io" 
        "strings" 
    )
    
    func main() {
        r := strings.NewReader("Hello, Reader!")
    
        b := make([]byte, 8)
        for {
            n, err := r.Read(b)
            fmt.Printf("n = %v err = %v b = %v
    ", n, err, b)
            fmt.Printf("b[:n] = %q
    ", b[:n])
            if err == io.EOF {
                break
            }
        }
    } 

    Web服务器: 包 http 通过任何实现了 http.Handler 的值来响应 HTTP 请求:

     type Handler interface { ServeHTTP(w ResponseWriter, r *Request) }

    package main
    
    import ( 
        "fmt" 
        "log" 
        "net/http"
    )
    
    type Hello struct{}
    
    func (h Hello) ServeHTTP( w http.ResponseWriter, r *http.Request) {
      fmt.Fprint(w, "Hello!") } func main() { var h Hello err := http.ListenAndServe("localhost:4000", h) if err != nil { log.Fatal(err) } }

    图片:

    type Image interface { ColorModel() color.Model Bounds() Rectangle At(x, y int) color.Color }  

  • 相关阅读:
    Array对象
    属性描述对象
    Object对象
    console对象与控制台
    编程风格
    错误处理机制
    13、百钱买百鸡之数学优化
    12、c程序中编程,统计一行中数字字符的个数。
    10、输入某年某月某日,判断这一天是这一年的第几天?
    9、c语言输入一个整数怎么分别输出它的每位上的数字
  • 原文地址:https://www.cnblogs.com/sevenyuan/p/4303763.html
Copyright © 2020-2023  润新知