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#接口的变体, 它们更加的独立并且是大规模编程,鲁棒性和演变设计的关键

  • 相关阅读:
    机器学习(深度学习)
    机器学习(六)
    机器学习一-三
    Leetcode 90. 子集 II dfs
    Leetcode 83. 删除排序链表中的重复元素 链表操作
    《算法竞赛进阶指南》 第二章 Acwing 139. 回文子串的最大长度
    LeetCode 80. 删除有序数组中的重复项 II 双指针
    LeetCode 86 分割链表
    《算法竞赛进阶指南》 第二章 Acwing 138. 兔子与兔子 哈希
    《算法竞赛进阶指南》 第二章 Acwing 137. 雪花雪花雪花 哈希
  • 原文地址:https://www.cnblogs.com/moonz-wu/p/4276215.html
Copyright © 2011-2022 走看看