美文网首页
go的入坑之路-面向对象

go的入坑之路-面向对象

作者: 幻影翔 | 来源:发表于2022-07-03 21:28 被阅读0次

结构

结构的创建

root := TreeNode{value:3}
root.left = &TreeNode{}
root.right = &TreeNode{5,nil,nil}
root.right.left = new(TreeNode)
  • 不论地址还是结构本身,一律使用:来访问成员
func createTreeNode(value int) *TreeNode {
    return &TreeNode{value: value}
}

root.left.right = createTreeNode(6)
  • 使用自定义工厂函数
  • 注意返回了局部变量的地址!
// 为结构定义方法
func (node TreeNode) print() {
    fmt.Println(node.value)
}
  • 显示定义和命名方法接受者
// 使用指针作为方法接受者
func (node *TreeNode) setValue(value int) {
    node.value = value
}
  • 只有使用指针才可以改变结构内容
  • nil指针也可以调用方法

值接受者 VS 指针接受者

  • 要改变内容必须使用指针接受者
  • 结构体过大也考虑使用指针接受者
  • 一致性:如有指针接受者,最好都是指针接受者
  • 值接受者是go特有的

封装

  • 名字一般使用CamelCase
  • 首字母大写:public
  • 首字母小写:private

  • 每一个目录一个包
  • main包包含可执行入口
  • 为结构定义的方法必须放在同一个包内
  • 可以是不同的包
    可以扩充系统类型或者别人的类型
  • 定义别名
  • 使用组合

接口

duck typing

duck typing
  • 描述事物的外部行为而非内部结构
  • “像鸭子走路,像鸭子叫(长得像鸭子),那么就是鸭子”
  • 严格来说go属于结构化类型系统,类似duck typing

go语言的duck typing

  • 同时具有python,C++的duck typing的灵活性
  • 又具有java的类型检查

接口的定义

type Retriever interface {
    Get(url string) string
}

func download(r Retriever) string {
    return r.Get("http://www.imooc.com")
}
  • 接口的实现是隐式的
  • 只要实现接口的方法

接口变量里面有什么

  • 接口变量自带指针
  • 接口变量同样采用值传递,几户不需要使用接口的指针
  • 指针接受者实现只能以指针方式使用,值接受者都可

接口的组合

type RetrieverPoster interface {
    Retriever
    Poster
}

函数式编程

  • 函数是一等公民:参数,变量,返回值都可以是函数
  • 高阶函数
  • 函数 -> 闭包
    正统函数编程
  • 不可变性:不能有状态,只有常量和函数
  • 函数只有一个函数

资源管理和出错管理

defer调用

func tryDefer() {
    for i :=0; i < 100; i++ {
        defer fmt.Println(i)
        if i == 30 {
            panic("printed too many")
        }
    }
}
  • 确保调用在函数结束时发生
  • 参数在defer语句时计算
  • defer列表为后进先出
    何时使用defer调用
  • Open/Close
  • Lock/UnLock
  • PrinterHeader/PrinterFooter

错误处理

func tryError(filename string) {
    file, err := os.OpenFile(filename, os.O_EXCL|os.O_CREATE,0666)
    if err != nil {
        if pathError, ok := err.(*os.PathError); !ok {
            panic(err)
        } else {
            fmt.Printf("%s,%s,%s\n",
                pathError.Op,
                pathError.Path,
                pathError.Err)
        }
        return
    }
    defer file.Close()
}

相关文章

  • go的入坑之路-面向对象

    结构 结构的创建 不论地址还是结构本身,一律使用:来访问成员 使用自定义工厂函数 注意返回了局部变量的地址! 显示...

  • struct

    面向对象编程 Go支持面向对象编程特性,但和传统面向对象编程是有区别的,Go并不是纯粹的面向对象语言。 Go没有类...

  • Go基础语法(十二)

    面向对象编程 Go 并不是完全面向对象的编程语言。 Go 官网的 FAQ 回答了 Go 是否是面向对象语言,摘录如...

  • 第13章-OOP面向对象编程

    面向对象(OOP) go并不是一个纯面向对象的编程语言。在go中的面向对象,结构体替换了类。 Go并没有提供类cl...

  • Golang(十三) OOP面向对象编程

    面向对象(OOP) go并不是一个纯面向对象的编程语言。在go中的面向对象,结构体替换了类。 Go并没有提供类cl...

  • 第十六章:Go语言面向对象编程

    1. GO语言OOP概述 Go语言不是纯粹的面向对象的语言,准确是描述是,Go语言支持面向对象编程的特性.Go语言...

  • go day06 面向对象 匿名组合 方法、方法集、方法

    面向对象 对于面向对象编程的支持Go语言设计的非常简洁而优雅。因为,Go语言并没有沿袭传统的面向对象编程中的诸多概...

  • 26. 结构体取代类

    26. 结构体取代类 Go 支持面向对象吗? Go 并不是完全面向对象的编程语言。Go 官网回答了 Go 是否是面...

  • golang faq 精选

    go 是面向对象语言吗? 是也不是说是 因为 go 有 类型和方法 支持面向对象的方式编程。说不是 因为go没有...

  • Go语言的类型系统,struct interface func及

    # 首先,通过下面的例子对比JAVA的面向对象和GO的面向对象 # 例子分别用JAVA和GO分别实现类型、接口、方...

网友评论

      本文标题:go的入坑之路-面向对象

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