Golang——面向对象

package 包名

注意事项

  • 每个目录只能有一个包.
  • 包名不需和目录名一样
  • main包为可执行入口,必须要有main函数
  • 结构体的方法必须在同一个包内

使用演示

  以上一篇面向接口中的组合接口代码进行演示.完整代码如下.接下来进行拆分

package main

import (
    "fmt"
    "io"
    "io/ioutil"
    "os"
)

type IWriter interface {
    // 传入写文件的名字以及内容
    write(filename, content string) string
}

type IReader interface {
    // 传入要读取文件的内容
    read(filename string) string
}

type IAdminer interface {
    // 包含两个接口
    IWriter
    IReader
}

type qvbilam struct{}

func (qvb qvbilam) read(filename string) string {
    content, rErr := ioutil.ReadFile(filename)
    if rErr != nil {
        fmt.Println(rErr)
        return "读取文件错误"
    }
    return string(content)
}


func (qvb qvbilam) write(filename, content string) string {
    // 创建文件
    file, err := os.Create(filename)
    if err != nil {
        fmt.Println(err)
        return "创建文件出错"
    }
    // 打开文件
    _, writeErr := io.WriteString(file, content)
    if writeErr != nil {
        fmt.Println(writeErr)
        return "写入文件出错"
    }
    return "写入文件成功"
}

func main() {
    // 实例化结构
    qstr := qvbilam{}
    // 定义读接口的变量.结构体为qvbilam
    var qint IAdminer = qstr
    // 进行读
    res := qint.read("basic/2.txt")
    // 将读的内容写入
    result := qint.write("basic/3.txt",res)
    fmt.Println(result)
}

抽离结构体

file/Model/qvbilam.go
package Model

import (
    "fmt"
    "io"
    "io/ioutil"
    "os"
)

type qvbilam struct{}

func (qvb qvbilam) read(filename string) string {
    content, rErr := ioutil.ReadFile(filename)
    if rErr != nil {
        fmt.Println(rErr)
        return "读取文件错误"
    }
    return string(content)
}


func (qvb qvbilam) write(filename, content string) string {
    // 创建文件
    file, err := os.Create(filename)
    if err != nil {
        fmt.Println(err)
        return "创建文件出错"
    }
    // 打开文件
    _, writeErr := io.WriteString(file, content)
    if writeErr != nil {
        fmt.Println(writeErr)
        return "写入文件出错"
    }
    return "写入文件成功"
}

抽离接口

file/Interface/interface.go
package Interface

type IWriter interface {
    // 传入写文件的名字以及内容
    write(filename, content string) string
}

type IReader interface {
    // 传入要读取文件的内容
    read(filename string) string
}

type IAdminer interface {
    // 包含两个接口
    IWriter
    IReader
}

创建入口

file/main.go
package main

import (
    "fmt"
)

func main() {
    // 实例化结构
    qstr := qvbilam{}
    // 定义读接口的变量.结构体为qvbilam
    var qint IAdminer = qstr
    // 进行读
    res := qint.read("basic/2.txt")
    // 将读的内容写入
    result := qint.write("basic/3.txt",res)
    fmt.Println(result)
}
qvbilam{}
// 编译器自动添加file/Model
import (
    "file/Model"
    "fmt"
)
// main函数中实例化结构体修改
qstr := Model.qvbilam{}
Unexported type 'qvbilam' usage首字母小写代表private,首字母大写代表publicfile/Model/qvbilam.go
// 结构体首字母大写
type Qvbilam struct{}

// 方法内的结构体首字母同样大写
func (qvb Qvbilam) read(filename string) string {
    ...  
}
var qint Interface.IAdminer = qstrCannot use 'qstr' (type Qvbilam) as type Interface.IAdminer in assignment Type cannot implement 'Interface.IAdminer' as it has a non-exported method and is defined in a different package 

完整代码

file/Interface/interface.go
package Interface

type IWriter interface {
    // 传入写文件的名字以及内容
    Write(filename, content string) string
}

type IReader interface {
    // 传入要读取文件的内容
    Read(filename string) string
}

type IAdminer interface {
    // 包含两个接口
    IWriter
    IReader
}
file/Model/qvbilam.go
package Model

import (
    "fmt"
    "io"
    "io/ioutil"
    "os"
)

// 结构体首字母大写
type Qvbilam struct{}

// 方法内的结构体首字母同样大写
func (qvb Qvbilam) Read(filename string) string {
    content, rErr := ioutil.ReadFile(filename)
    if rErr != nil {
        fmt.Println(rErr)
        return "读取文件错误"
    }
    return string(content)
}


func (qvb Qvbilam) Write(filename, content string) string {
    // 创建文件
    file, err := os.Create(filename)
    if err != nil {
        fmt.Println(err)
        return "创建文件出错"
    }
    // 打开文件
    _, writeErr := io.WriteString(file, content)
    if writeErr != nil {
        fmt.Println(writeErr)
        return "写入文件出错"
    }
    return "写入文件成功"
}
file/main.go
package main

import (
    "file/Interface"
    "file/Model"
    "fmt"
)

func main() {
    // 实例化结构
    qstr := Model.Qvbilam{}
    // 定义读接口的变量.结构体为qvbilam
    var qint Interface.IAdminer = qstr
    // 进行读
    res := qint.Read("basic/2.txt")
    // 将读的内容写入
    result := qint.Write("basic/3.txt",res)
    fmt.Println(result)
}

面向对象

注意事项

首字母大写为public首字母小写为private

封装

  在go中是没有类的概念的.可以把结构体想象成类.例如定义一个人,每个人都有身高和体重,使用结构体进行封装如下:

type Human struct{
    stature int
      weight int
}

继承

extends

定义匿名接口

type People struct {
    name string
    age int
}

type Worker struct {
    People  // 类型为People结构体,没有名
    sex int
}

使用

  初始化People后传入到Work1中,打印结果是不同的,重构成员属性.

func main() {
    hj := People{"郝建",32}
    Worker1 := Worker{hj,32}
    //worker2 := Worker{People{"QvBiLam",16},1}
    Worker1.name = "郝建2"
    fmt.Println(Worker1.name)
    fmt.Println(hj.name)
}

  如需要再修改Woker1的同时也将People的属性修改则可以使用指针.如下打印结果是相同的.

type People struct {
    name string
    age int
}

type Worker struct {
    // 添加*使用指针
    *People  // 类型为People结构体,没有名
    sex int
}

func main() {
    hj := People{"郝建",32}
    // 传入&hj
    Worker1 := Worker{&hj,32}
    //worker2 := Worker{People{"QvBiLam",16},1}
    Worker1.name = "郝建2"
    fmt.Println(Worker1.name)
    fmt.Println(hj.name)
}

多态

SayHumanDogSay

定义接口

// 定义动作接口
type Action interface {
    // 返回字符串类型
    Say() string
}

定义Human结构体

// 定义人类结构体
type Human struct {}
// 实现接口
func (h Human) Say() string{
    return "Hello"
}

定义Dog结构体

// 定义狗结构体
type Dog struct {}
// 实现接口
func (d Dog) Say() string{
    return "Wang Wang Wang"
}

使用演示

getTypegetType
// 获取结构体,返回类型为 动作接口
func getType() Action{
    //return Human{}
    return Dog{}
}

func main() {
      // 调用方法获取结构体
    aType := getType()
      // 定义动作接口类型,值为结构体
    var action Action = aType
      // 调用Say
    fmt.Print(action.Say())
}