美文网首页
2021/04/07关于go中的继承和空结构体

2021/04/07关于go中的继承和空结构体

作者: 温岭夹糕 | 来源:发表于2021-04-07 18:55 被阅读0次

GO在文档中强调了根本没有继承这一概念

1.屏蔽现象

一个简单的demo

package main

import (
    "fmt"
)

var name = 11
func main(){
    var name =10
    {
        var name = 9
        fmt.Println(name)
    }
    fmt.Println(name)

}

结果很明显,输出9,10

根据对作用域的理解,程序实体的访问权限由代码块控制,变量也属于程序实体, 嵌套的代码块导致变量出现被屏蔽的现象。这称为变量的屏蔽现象

那函数呢?

package main

import (
    "fmt"
)

type AnimalCategory struct {
    kingdom string // 界。
    phylum  string // 门。
    class   string // 纲。
    order   string // 目。
    family  string // 科。
    genus   string // 属。
    species string // 种。
}


func (ac AnimalCategory) String() string {
    return fmt.Sprintf("hi%s%s%s%s%s%s%s",
        ac.kingdom, ac.phylum, ac.class, ac.order,
        ac.family, ac.genus, ac.species)
}


type Animal struct {
    scientificName string // 学名。
    AnimalCategory        // 动物基本分类。这里嵌入其他结构体
}


func (a Animal) String() string {
    return fmt.Sprintf("%s (category: %s)",
        a.scientificName, a.AnimalCategory)
}

func main(){
    category := AnimalCategory{species: "cat"}
    fmt.Printf("The animal category: %s\n", category)
    animal := Animal{
        scientificName: "American Shorthair",
        AnimalCategory: category,
    }
    fmt.Printf("The animal: %s\n", animal)
}

我们发现在执行 main函数中的打印函数时,虽执行了Animal结构体的String方法,但是Animal中的String方法执行a.AnimalCategory的字符串时,并没有执行
AnimalCategory结构体定义的string方法,也就是说出现了同名函数的遮蔽现象。(Animal 内嵌结构体 AnimalCategory )

也就是说,虽然AnimalCategory利用嵌入字段,但是同名的方法还是会被覆盖(内嵌结构体的同名方法不会被执行)。
通过这个例子也就明白了Go中并没有继承的概念,Go语言利用了嵌入字段的特性,使得“子类”能够坐享其成的使用“父类”(嵌入结构体)的一切,即使某些方法不合心意,还可以利用屏蔽特性进行“方法的重写”去调整优化

2.空结构体

空结构体不占用空间

package main

import (
    "unsafe"
)

func main(){
    var a = struct{}{}
    var b = 1
    fmt.Printf("%d,%d",unsafe.Sizeof(a),unsafe.Sizeof(b))
}

既然不占用内存,那么我们就可以把他当作是js的undefined的占位符(这里描述不准确,undefined为一个变量,大致类比一下)来使用,比如利用map和空结构体来实现set

package main

import (
    "fmt"
)
type Set map[string]struct{}
func (set Set) Has(s string) bool{
    _,ok := set[s]
    return ok
}
func (set Set) Add(s string) {
    if ok := set.Has(s);!ok{
        set[s] = struct{}{}
    }
}

func (set Set) Del(s string){
    delete(set,s)
}

func main(){
    set := Set{}
    fmt.Println(set.Has("a"))
    set.Add("a")
    fmt.Println(set.Has("a"))
    set.Del("a")
    fmt.Println(set.Has("a"))
}

实现不发送数据的通道,仅通知子协程执行任务

func worker(ch chan struct{}) {
    <-ch //协程阻塞,有struct时执行任务
       // TODO
    fmt.Println("do something")
    close(ch)
}

func main() {
    ch := make(chan struct{})
    go worker(ch)
    ch <- struct{}{}
}

实现仅包含方法的结构体 这里不再做赘述

本文内容及代码参考:

  1. GO核心36讲
    2.GO空结构体的使用

相关文章

  • 2021/04/07关于go中的继承和空结构体

    GO在文档中强调了根本没有继承这一概念 1.屏蔽现象 一个简单的demo 结果很明显,输出9,10 根据对作用域的...

  • <>

    结构体及其使用方法 结构体的定义 Go语言用嵌入式字段实现了继承吗?? GO语言不存在所谓的继承,只有组合。组合和...

  • golang继承与接口

    继承 结构体 Go语言的结构体(struct)和其他语言的类(class)有同等的地位,但Go语言放弃了包括继 承...

  • 第04天(面对对象编程)_02

    05_结构体指针类型匿名字段.go 06_面向过程和对象函数的区别.go 07_为结构体类型添加方法.go 08_...

  • Go结构体、方法、接口

    1 结构体 Go语言中没有“类”的概念,也不支持像继承这种面向对象的概念。但是Go语言的结构体与“类”都是复合结构...

  • Go 面向对象、接口(二)

    欢迎来我的博客 go 语言仅支持封装,不支持继承和多态go 语言没有class 只有struct 结构体 声明和创...

  • go语言中的继承和实现

    go语言没有类,只有结构体。以及还有接口,如何利用结构体和接口来实现类似与java的继承和实现呢?我试着整理一下。...

  • Go Struct

    Go语言通过自定义结构的方式来实现新的类型,结构体是类型中带有成员的复合类型。 Go语言使用结构体和结构体成员来描...

  • Go语言面向对象三大特性—继承

    Go语言里靠匿名结构体实现继承,嵌入到新的结构体里面。如果一个struct嵌套了另一个匿名结构体,那么这个结构体可...

  • Go语言学习笔记15.面向对象

    概述 go的面向对象,可以说是C和C++的夹生版本。利用结构体来表示一个类,如果有继承就用结构体套结构体,这个是C...

网友评论

      本文标题:2021/04/07关于go中的继承和空结构体

      本文链接:https://www.haomeiwen.com/subject/epwukltx.html