美文网首页
go面向对象的理解

go面向对象的理解

作者: 洛奇lodge | 来源:发表于2018-09-29 23:46 被阅读0次

在go语言中没有面向对象的概念,但是可以通过下面方式实现面向对象的特征

  • 封装, 通过方法实现
  • 继承, 通过匿名字段实现
  • 多态, 通过接口实现

方法

方法定义
// 定义方法
type Mystr string
func (temp *Mystr) Hello() {
    fmt.Println("Mystr = ", *temp)
}

func main(){
    var a Mystr
    a.Hello() // 方法使用
}

匿名字段

匿名字段定义
type Person struct {
    name string
    id   int
}

// 继承
type Student struct {
    Person
    addr string
}

匿名字段初始化
func main() {
    // 第一种方式初始化
    var a Student
    a.Person = new(Person)  // 必须先分配空间,才能给父类赋值
    a.name = "xiaoming"

    // 第二种初始化
    s := Student{Person{"xiaoming", 122}, "qwjh"}

    // 第三种初始化,指定某个元素初始化
    var d Student = Student{Person:Person{name: "xiaomi"},addr: "ni"}
}

接口

  • 方法的集合
接口定义
// 定义接口类型接口
type Humer interface {
    // 方法,只有声明,没有实现
    Hello()
}

// 定义方法
type Mystr string
func (temp *Mystr) Hello() {
    fmt.Println("Mystr = ", *temp)
}

func main() {
    // 定义接口类型变量
    var i Humer
    var a Mystr = "lakalk"
    i = a  // 将类型a赋值给接口
    i.Hello() // 调用函数,Mystr = lakalk
}
  • 接口存在继承,被继承的接口,称为子集, 继承的接口,称为超集
  • 超集可以转换为子集,但子集不能转换为超集
// 定义接口类型接口
type Humer interface {
    // 方法,只有声明,没有实现
    Hello()
}

// 继承Humer接口
type Personer interface {
    // 匿名字段
    Humer
}

// 定义方法
type Mystr string
func (temp *Mystr) Hello() {
    fmt.Println("Mystr = ", *temp)
}

func main() {
    // 定义接口类型变量
    var i Humer
    var j Personer
    var a Mystr = "lakalk"
    i = a  // 将类型a赋值给接口
    i = j // 将超集转换为子集
    i.Hello() // 调用函数,Mystr = lakalk
}

空接口
  • 可以保存任何的值
// 定义空接口
var i interface{}

// 一般空接口可用在函数接收不定参数
func xxx(arg ...interface) {
    for _, i := range arg {
        if value,ok := i.(int); ok == true {
            fmt.Printf("整型%T, %v\n", i, value)
        } else if value,ok := i.(string); ok == true {
            fmt.Printf("字符串%T, %v\n", i, value)
        }   
    }
}

相关文章

  • go面向对象的理解

    在go语言中没有面向对象的概念,但是可以通过下面方式实现面向对象的特征 封装, 通过方法实现 继承, 通过匿名字段...

  • struct

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

  • Go基础语法(十二)

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

  • go-面向对象的理解

    1.如何实例化对象 传址方式 注意:传址是PHP中默认使用的方式,例如 $a=new b() rect1 := n...

  • 第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面向对象的理解

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