zoukankan      html  css  js  c++  java
  • Fourth glance in Go

    在Go里面的结构体和方法是很有意思的内容。它即和OO有点像,但又不完全一样。为什么这么说呢?当你把结构体映射为OO里面的类的时候,你给结构体添加方法,你就会发现其实方法与结构体并没有严格意义上的关系。在Go里面,方法是绑定到接受者上的。什么是接受者?一个对象,这个对象可以是任何类型,int,string, struct, interface ...。

    func (t *Type) method_name(parameters) return type

    但是同名的方法,在同一个类型上只能出现一次。而且该类型必须与方法在同一个包中。

    另外一点是内嵌结构体的问题,方法是可以被继承的。也就是说一个结构体被内嵌到另一个结构体中,那么父结构体也就具有了内嵌结构体的方法

    >>person.go
    -------------------------------------------
    package person
    
    type Person struct {
        firstName string
        lastName  string
    }
    
    type BlackMan struct {
        Person
        color string
    }
    
    func (p *Person) FirstName() string {
        return p.firstName
    }
    
    func (p *Person) SetFirstName(newName string) {
        p.firstName = newName
    }
    
    
    >>main.go
    --------------------------------------------------
    package main
    
    import (
        "./person"
        "fmt"
    )
    
    func main() {
        p := new(person.BlackMan)
        p.SetFirstName("Ace")
        fmt.Println(p.FirstName())
    }

     一张图说明OO里面的继承体系与Go里面的继承体系区别

    发现一个奇怪的问题:使用相同的方法去分配内存,得出的结果却截然不同

    func main() {
        var n [1024 * 1024 * 1024]int
        n[0] = 1
    
        m := new(runtime.MemStats)
        runtime.ReadMemStats(m)
        fmt.Printf("%d
    ", m.Alloc/1024)
    }

    这样程序的输出是占用8G空间,如果是1024 * 1024,输出则是 36K的空间占用。为什么?

    Go中接口的指针方法和值方法的区别:

    Pointer methods can be called with pointers.
    • Value methods can be called with values.
    • Value-receiver methods can be called with pointer values because they can be dereferenced
    first.
    • Pointer-receiver methods cannot be called with values, however, because the value stored
    inside an interface has no address.

    Go的面向对象总结

    在Go里面是没有类的概念的,类型和方法是松耦合的,通过接口让他们链接在一起。

    OO里面三个重要的概念:封装,继承和多态,在Go里面是这样对应的

    封装(数据隐藏):其他的OO语言有4个访问级别,在Go里面只有2种

    1. 包级:对象在整个包的范围内可见,以小写字母开头

    2. 被导出:对象在包外可见,以大写字母开头

    一个类型可以只有方法定义在它的包里。

    继承:通过内嵌的一个或多个类型来达到多继承的目的

    多态:接口,一个类型变量可以被分配给它的任意接口实现的实例。类型和接口是松耦合的, 多继承可以通过实现多个接口来完成。Go的接口不是Java或C#接口的变体, 它们更加的独立并且是大规模编程,鲁棒性和演变设计的关键

  • 相关阅读:
    jeecg 笔记之 自定义显示按钮 (exp 属性)
    jeecg 笔记之 自定义word 模板导出(一)
    jeecg 默认为空的字段值是如何被填充的?
    算法题——立方体的体对角线穿过多少个正方体?
    借用Snippet插件美化博客中的代码
    用PS设计等高线效果的背景图片
    算法题——投篮比赛获胜概率问题
    计算机中的颜色XIV——快速变换颜色的V分量
    算法实践——Twitter算法面试题(积水问题)的线性时间解法
    UI设计实战篇——利用Bootstrap框架制作查询页面的界面
  • 原文地址:https://www.cnblogs.com/moonz-wu/p/4276215.html
Copyright © 2011-2022 走看看