zoukankan      html  css  js  c++  java
  • Go Interface概念

    简单地说 Interface是一组Method的组合,可以通过Interface来定义对象的一组行为。
    如果某个对象实现了某个接口的所有方法,就表示它实现了该借口,无需显式地在该类型上添加接口说明。Interface是一个方法的集合,它里面没有其他类型变量,而且Method只用定义原型 不用实现

    实现一个动物的接口:

    package main
    
    import "fmt"
    
    // 定义一个 Animal接口
    type Animal interface {
        Eat()
        Talk()
        Run()
    }
    
    
    // Dog 实现了Animal的所有方法,就可以说Dog实现了Animal这个接口
    type Dog struct {
        name string
    }
    
    func (d *Dog) Eat() {
        fmt.Printf("%s is Eating...
    ", d.name)
    }
    
    func (d *Dog) Talk() {
        fmt.Printf("%s is Talking...
    ", d.name)
    }
    
    func (d *Dog) Run() {
        fmt.Printf("%s is Running...
    ", d.name)
    }
    
    func main() {
        var dog = &Dog{
            name: "WangCai",
        }
    
        var a Animal
        a = dog
        a.Run()
        a.Eat()
        a.Talk()
    }
    View Code

    实现一个雇员的接口

    package main
    
    import "fmt"
    
    type Employee interface {
        Calc() float32
    }
    
    type Developer struct {
        Name string
        Base float32
    }
    
    func (d *Developer) Calc() float32 {
        return d.Base
    }
    
    type PM struct {
        Name string
        Base float32
        Option float32
    }
    
    func (p *PM) Calc() float32 {
        return p.Base * p.Option
    }
    
    type Operation struct {
        Name string
        Base float32
        Option float32
        Ratio float32 // 0.5 - 3
    }
    
    func (o *Operation) Calc() float32 {
        return o.Base * o.Option * o.Ratio
    }
    
    
    type EmployeeMgr struct {
        employeeList []Employee
    }
    
    func (e *EmployeeMgr) Calc() float32 {
        var sum float32
        for _, v := range e.employeeList {
            sum += v.Calc()
        }
        return sum
    }
    
    func (e *EmployeeMgr) AddEmployee(d Employee) {
        e.employeeList = append(e.employeeList, d)
    }
    
    func main() {
        var e = &EmployeeMgr{}
    
        dev := &Developer{
            Name: "alex",
            Base: 10000,
        }
        e.AddEmployee(dev)
    
        pm := &PM{
            Name: "Jim",
            Base: 10000,
            Option: 12000,
        }
        e.AddEmployee(pm)
    
        oper := &Operation{
            Name: "Miles",
            Base: 10000,
            Option: 12000,
            Ratio: 1.2,
        }
        e.AddEmployee(oper)
    
        sum := e.Calc()
    
        fmt.Printf("the sum is: %f", sum)
    }
    View Code

    实现error interface

    // builtin.go 中的error interface
    
    type error interface {
        Error() string
    }
    View Code
    package main
    
    import (
        "time"
        "fmt"
    )
    
    type MyError struct {
        When time.Time
        What string
    }
    
    
    // MyError实现了 Error 这个方法,也就实现了error interface
    func (e MyError) Error() string {
        str := fmt.Sprintf("at %v, %s", e.When, e.What)
        return str
    }
    
    // 直接返回MyError对象
    func run() error {
        myError := MyError{time.Now(), "it didn't work"}
        return myError
    }
    
    func main() {
        if err := run(); err != nil {
            fmt.Println(err)
        }
    }
    View Code
  • 相关阅读:
    实验3 简单的分支与循环结构 2.利用循环计算n个圆柱体体积。
    实验 3 简单的分支与循环结构 第一题 编写求圆面积的程序,要求当输入的半径r<=0时,提示输入错误,要求r为浮点型,r的数值是动态的由键盘输入
    心得3
    作业 3 应用分支与循环结构解决问题
    实验5 函数
    实验1 题目2
    第三,四章学习心得
    第2章学习心得
    第一章学习心得
    5-3
  • 原文地址:https://www.cnblogs.com/vincenshen/p/9460236.html
Copyright © 2011-2022 走看看