美文网首页Golang程序员Golang
Golang 学习笔记(05)—— 面向对象编程

Golang 学习笔记(05)—— 面向对象编程

作者: ChainZhang | 来源:发表于2017-12-25 15:52 被阅读83次

    本文为转载,原文:Golang 学习笔记(05)—— 面向对象编程

    Golang

    前言

    golang是面向过程的语言,go中没有类,单go支持面向对象的编程,go中的struct就像其他语言中的类;go里没有继承,但可以通过组合来实现。

    struct

    结构体是一种自定义类型,是不同数据的几何体,struct是值类型,通常用来定义一个抽象的数据对象,比如学生,可以有姓名,年龄,班级的数据构成。

    定义

    type Student struct{
        Name string
        Age  int
        Class string
    }
    

    实例化

    • 通过New创建实例
    stu := new(Student)
    stu.Name = "Chain"
    stu.Age = 23
    stu.Class = "3-2"
    
    • 按照顺序提供初始化值
    stu := Student{"Chian", 23, "3-2"}
    
    • 按照field:value的方式初始化
    stu := Student{Name:"Chain", Age:23, Class:"3-2"}
    

    成员方法

    定义成员方法的格式如下:

    func (变量名 结构体类型) 函数名(参数列表) (返回类型列表)
    

    例如:

    func (s Student) Display() {
        fmt.Printf("Name=%s, Age=%d, Class=%s\n", s.Name, s.Age, s.Class)
    }
    

    调用的时候直接用实例名点函数名即可例如:

    stu := Student{"Chian", 23, "3-2"}
    stu.Display()
    

    注意

    golang中没有显式的定义字段或函数的访问权限,那么,访问权限是怎么定义的呢?
    字段或函数的首字母大写的话,则为public权限
    字段或函数的首字母小写的话,则为private权限

    interface

    接口是一系列操作的集合,是一种约束。我们可以把它看作与其他对象通讯的协议。任何非接口类型只要拥有某接口的全部方法,就表示它实现了该接口,go中无需显式的在该类上添加接口声明。
    例如:

    package main
    
    import (
        "fmt"
    )
    
    func main(){
        var stu IStudent
        stu = &Student{"chain", 23}
        stu.Display()
        fmt.Println(stu.GetName())
        fmt.Println(stu.GetAge())
    }
    
    type Student struct{
        Name string
        Age int
    }
    
    func (stu *Student) Display(){
        fmt.Println("i am student")
    }
    
    func (stu *Student) GetName() string{
        return stu.Name
    }
    
    func (stu *Student) GetAge() int{
        return stu.Age
    }
    
    type IStudent interface{
        Display()
        GetName() string
        GetAge() int
    }
    

    [图片上传失败...(image-f37b74-1514188348248)]

    面向对象的三大特性

    学过面向对象的同学应该都知道面向对象的三大特性:封装,继承,多态。
    这三大特性在golang中如何实现呢?
    请看以下3个例子

    封装

    package main
    
    import (
        "fmt"
    )
    
    func main(){
        stu := new(Student)
        stu.SetName("chain")
        fmt.Println(stu.GetName())
    }
    
    type Student struct{
        name string
    }
    
    func (stu *Student) SetName(name string){
        stu.name = name
    }
    
    func (stu *Student) GetName() string{
        return stu.name
    }
    

    [图片上传失败...(image-e4668b-1514188348248)]

    继承

    package main
    
    import (
        "fmt"
    )
    
    func main(){
        stu := Student{"chain"}
        fmt.Println(stu)
    
        aStu := AStudent{Student{"chain"}, 23}
        fmt.Println(aStu)
    }
    
    type Student struct{
        name string
    }
    
    type AStudent struct{
        Student
        Age int
    }
    

    [图片上传失败...(image-6a9fd1-1514188348248)]

    多态

    package main
    
    import (
        "fmt"
    )
    
    func main(){
        var stu IStudent
        stu = &AStudent{}
        stu.Display()
    
        stu = &BStudent{}
        stu.Display()
    }
    
    type AStudent struct{
        
    }
    
    func (stu *AStudent) Display(){
        fmt.Println("i am a student")
    }
    
    type BStudent struct{
        
    }
    
    func (stu *BStudent) Display(){
        fmt.Println("i am b student")
    }
    
    type IStudent interface{
        Display()
    }
    

    [图片上传失败...(image-79e86e-1514188348248)]

    转载请注明出处
    Golang 学习笔记(05)—— 面向对象编程

    目录
    上一节:Golang 学习笔记(04)—— array, slice, map
    下一节:Golang 学习笔记(06)—— 多线程

    相关文章

      网友评论

      • 黄靠谱:Go语言在接口这个方面感觉过于简洁,代码可读性有点差,不能通过对象直接判断它的接口是什么,这一点没有java来的可读性强

      本文标题:Golang 学习笔记(05)—— 面向对象编程

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