• 个人对golang的面向对象的理解------接口(interface)


    golang是面向对象语言,但是他并没有class之类的关键字,他是通过struct和interface组合实现了面向对象的概念。

    面向对象的函数,我们一般要传对象指针,为什么呢?因为函数一般是操作对象的属性的,而只有全对象指针时,对象的属性才会被改变,否则不会改变对象属性本身。例子后续补上

    转载请注明出处:http://www.cnblogs.com/SSSR/p/6351661.html

    在golang中面向对象的实现顺序:

    1.先定义struct,是对象的属性值,如:

    type Person struct {
      id int
      name string
    }

    2.定义对象需要实现的函数,如:

    func (self Person) codingEveryday() string {
      return fmt.Sprintf("user %d, %s write bug every day.", self.id, self.name)
    }

    3.定义接口,选择不同的函数,定义很多个接口(不同的接口适应不同的需求,还可以起到保护函数的安全性),如:

    type CodeMonkey interface {
      codingEveryday() string
    }

    4.将struct实例化,然后赋值给接口,就可以通过接口参数调用struct(对象)函数,如:

    var monkey CodeMonkey = Person{1, "Tom"}
    fmt.Println(monkey.codingEveryday())

    5.关于继承,我觉得可能是体现在struct(对象)定义的时候使用的匿名变量上,这个还没有深入研究,等研究明白了补充上。

    以上为个人理解,如有错误还请指正。

    实例:

    interface.go

    package interfacelearning
    
    import "fmt"
    
    type CodeMonkey interface {
        codingEveryday() string
    }
    
    type Parent interface {
        washingDiaper() string
    }
    
    type TwoPeople interface{
    	codingEveryday() string
    	washingDiaper() string
    }
    type Person struct {
        id   int
        name string
    }
    
    func (self Person) codingEveryday() string {
        return fmt.Sprintf("user %d, %s write bug every day.", self.id, self.name)
    }
    
    func (self Person) washingDiaper() string {
        return fmt.Sprintf("user %d, %s take care of his baby.", self.id, self.name)
    }
    
    func MonkeyFather() {
        var monkey CodeMonkey = Person{1, "Tom"}
        fmt.Println(monkey.codingEveryday())
    
        var father Parent = Person{2, "John"}
        fmt.Println(father.washingDiaper())
    
    	var two TwoPeople=Person{3, "yuzp"}
    	fmt.Println(two.codingEveryday())
    	fmt.Println(two.washingDiaper())
    }
    

      

     interface_test.go

    package interfacelearning
    import "fmt"
    import "testing"
    var print=fmt.Println
    
    
    func TestMonkeyFather(t *testing.T){
    	MonkeyFather()
    	
    	print("这是一个测试!")
    }
    

      

  • 相关阅读:
    ArcGIS for JavaScript继承TiledMapServiceLayer来实现“动态切图”
    Commvault Oracle备份常用命令
    Commvault逻辑架构及组件说明
    数据保护平台如何为新一代应用,人工智能和数据科学提供动力
    SQL Server SSL/TLS 加密
    curl传递大json文件报错解决方法
    MySQL5.5 安装mcafee mysql-audit插件 不成功
    CentOS 6.5安装配置NFS服务器
    利用dump函数理解oracle如何存储各种类型数据
    xfs文件系统挂载大容量磁盘
  • 原文地址:https://www.cnblogs.com/SSSR/p/6351661.html
Copyright © 2020-2023  润新知