包
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())
}