From 49dae74e5910dd81c8cfbf8cf1ba29f166a89d53 Mon Sep 17 00:00:00 2001 From: pengshiyu <1940607002@qq.com> Date: Sun, 25 Sep 2022 22:41:50 +0800 Subject: [PATCH] fix --- blog/golang/golang-interface.md | 405 ++++++++++++++++++++++++++++++++ blog/golang/golang-package.md | 147 ++++++++++++ blog/golang/index.md | 7 +- 3 files changed, 556 insertions(+), 3 deletions(-) create mode 100644 blog/golang/golang-package.md diff --git a/blog/golang/golang-interface.md b/blog/golang/golang-interface.md index 4be487e..a9c25a2 100644 --- a/blog/golang/golang-interface.md +++ b/blog/golang/golang-interface.md @@ -87,3 +87,408 @@ func main() { > 备注: 实现接口必须实现接口中的所有方法 +## golang接口值类型接收者和指针类型接收者 + +示例 + +```go +package main + +import "fmt" + +// 定义接口 +type Pet interface { + eat() +} + +// 定义结构体 +type Dog struct { + name string +} + +func (dog Dog) eat() { + fmt.Println("dog eat") +} + +func main() { + dog := Dog{name: "Tom"} + dog.eat() + // dog eat +} + +``` + +## golang接口和类型的关系 + +- 一个类型可以实现多个接口 +- 多个类型可以实现同一个接口(多态) + + +### 一个类型可以实现多个接口 + +示例 + +Music接口可以播放音乐 +Video接口可以播放视频 + +手机Mobile实现这两个接口,即可以播放音乐,又可以播放视频 + +```go +package main + +import "fmt" + +// 定义接口 +type Music interface { + playMusic() +} + +type Video interface { + playVideo() +} + +// 定义结构体 +type Mobile struct { +} + +func (m Mobile) playMusic() { + fmt.Println("Mobile playMusic") +} + +func (m Mobile) playVideo() { + fmt.Println("Mobile playVideo") +} + +func main() { + m := Mobile{} + m.playMusic() + // Mobile playMusic + m.playVideo() + // Mobile playVideo + +} + +``` + +### 多个类型可以实现同一个接口(多态) + +示例 + +一个宠物接口Pet,猫Cat和狗Dog都可以实现该接口 + +```go +package main + +import "fmt" + +// 定义接口 +type Pet interface { + eat() +} + +// 定义结构体 +type Dog struct { +} + +type Cat struct { +} + +func (dog Dog) eat() { + fmt.Println("dog eat") +} + +func (cat Cat) eat() { + fmt.Println("cat eat") +} + +func main() { + dog := Dog{} + dog.eat() + // dog eat + + cat := Cat{} + cat.eat() + // cat eat + + // 声明接口变量 + var pet Pet + pet = dog + pet.eat() + // dog eat + + pet = cat + pet.eat() + // cat eat +} + +``` + +## golang接口嵌套 + +示例 + +飞鱼,既可以飞,也可以游泳, + +飞鱼接口有两个接口组成:飞Fly接口,游泳Swim接口 + +```go +package main + +import "fmt" + +// 定义接口 +type Flyer interface { + fly() +} + +// 定义接口 +type Swimmer interface { + swim() +} + +// 组合接口 +type FlyFish interface { + Flyer + Swimmer +} + +// 结构体 +type Fish struct{} + +// 实现方法 +func (fish Fish) fly() { + fmt.Println("fish fly") +} + +func (fish Fish) swim() { + fmt.Println("fish swim") +} + +func main() { + var fly FlyFish + + fly = Fish{} + fly.fly() + // fish fly + + fly.swim() + // fish swim +} + +``` + +## 通过接口实现OCP设计原则 + +开闭原则 Open-Closed Principle + +对扩展开放,对修改关闭 + +示例 + +```go +package main + +import "fmt" + +// 定义接口 +type Pet interface { + eat() + sleep() +} + +// 定义结构体 +type Dog struct { +} + +type Cat struct { +} + +// Dog 实现 Pet接口 +func (dog Dog) eat() { + fmt.Println("dog eat") +} + +func (dog Dog) sleep() { + fmt.Println("dog sleep") +} + +// Cat 实现 Pet接口 +func (cat Cat) eat() { + fmt.Println("cat eat") +} + +func (cat Cat) sleep() { + fmt.Println("cat sleep") +} + +// 结构体 +type Person struct{} + +// 参数既可以是Dog 也可以是 Cat +func (person Person) care(pet Pet) { + pet.eat() + pet.sleep() +} + +func main() { + + dog := Dog{} + cat := Cat{} + + person := Person{} + + person.care(dog) + // dog eat + // dog sleep + + person.care(cat) + // cat eat + // cat sleep +} + +``` + +## golang模拟OOP的属性和方法 + +golang中没有面向对象的概念,也没有封装的概念,但是可以通过而机构提struct和函数绑定来实现OOP的属性和方法 + +示例 + +Person类 + +- 属性: name、age +- 方法:eat、sleep、work + +```go +package main + +import "fmt" + +// 属性 +type Person struct { + name string + age int +} + +// 方法 +func (person Person) eat() { + fmt.Println("person eat") +} + +func (person Person) sleep() { + fmt.Println("person sleep") +} + +func (person Person) wrok() { + fmt.Println("person wrok") +} + +func main() { + person := Person{ + name: "Tom", + age: 23, + } + person.eat() + // person eat + + person.sleep() + // person sleep + + person.wrok() + // person wrok +} + +``` + +## golang继承 + +通过结构体嵌套来实现继承 + +```go +package main + +import "fmt" + +// 定义结构体 +type Pet struct { + name string + age int +} + +func (pet Pet) eat() { + fmt.Println("pet eat") +} + +func (pet Pet) sleep() { + fmt.Println("pet sleep") +} + +// 定义结构体 +type Dog struct { + // 匿名 + Pet +} + +type Cat struct { + pet Pet +} + +func main() { + + dog := Dog{ + Pet{name: "Tom", age: 23}, + } + + // 匿名直接调用 + dog.eat() + // pet eat + + cat := Cat{ + pet: Pet{name: "Tom", age: 23}, + } + + // 通过属性pet 调用 + cat.pet.eat() + // pet eat + +} + +``` + +## golang构造函数 + +golang中没有构造函数的概念,可以使用函数来模拟构造函数的功能 + +```go +package main + +import "fmt" + +type Person struct { + name string + age int +} + +func NewPerson(name string, age int) (*Person, error) { + if name == "" { + return nil, fmt.Errorf("name不能为空") + } + + if age < 0 { + return nil, fmt.Errorf("age不能小0") + } + + return &Person{name: name, age: age}, nil +} + +func main() { + person, err := NewPerson("Tom", 23) + if err == nil { + fmt.Printf("%v\n", person) + // &{Tom 23} + } else { + fmt.Printf("%v\n", err) + } +} + +``` \ No newline at end of file diff --git a/blog/golang/golang-package.md b/blog/golang/golang-package.md new file mode 100644 index 0000000..22381f7 --- /dev/null +++ b/blog/golang/golang-package.md @@ -0,0 +1,147 @@ +# 第十九章 Golang包 package + +## Golang 包的定义和导入 + +通常,文件夹名称和包名称相同,并且,同一个文件夹下面只有一个包 + +定义包 + +service/user_service.go +```go +package service + +``` + +导入包 + +main.go + +```go +package main + +import "service" + +``` + +## golang包管理工具 go module + +go module 是 golang1.11版本新加的特性,用来管理模块中包的依赖关系 + +```bash +$ go env +GO111MODULE="on" +``` + +go mod 的使用 + +```bash +# 初始化模块 +# eg: go mod init 域名/项目名称 +go mod init <项目模块名> + +# 依赖关系处理,根据go.mod 文件 +go mod tidy + +# 将依赖包赋值到项目下的vendor目录 +# 如果包被屏蔽(墙),可以使用这个命令, 随后使用go build -mod=vendor编译 +go mod vendor + +# 显示依赖关系 +go list -m all + +# 显示详细依赖关系 +go list -m -json all + +# 下载依赖 +go mod download [path@version] +``` + +### 使用本地包 + +示例 + +```bash +# 初始化模块 +go mod init mouday.com/project01 +``` + +项目结构 +```bash +$ tree +. +├── go.mod +├── main.go +└── service + └── user_service.go +``` + +service/user_service.go + +```go +package service + +import "fmt" + +// 首字母大写,可供外部使用 +func TestService() { + fmt.Println("TestService") +} + +``` + +main.go + +```go +package main + +import "mouday.com/project01/service" + +func main() { + service.TestService() + // TestService +} + +``` + +### 使用第三方包 + +搜索包:[https://pkg.go.dev](https://pkg.go.dev) + +下载包 + +```bash +go get github.com/gin-gonic/gin +``` + +使用示例 + +```go +package main + +import ( + "net/http" + + "github.com/gin-gonic/gin" +) + +func main() { + r := gin.Default() + r.GET("/ping", func(c *gin.Context) { + c.JSON(http.StatusOK, gin.H{ + "message": "pong", + }) + }) + r.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080") +} + +``` + +访问:http://127.0.0.1:8080/ping + +响应 +```json +{ +"message": "pong" +} +``` + diff --git a/blog/golang/index.md b/blog/golang/index.md index 412e085..121aa17 100644 --- a/blog/golang/index.md +++ b/blog/golang/index.md @@ -14,7 +14,7 @@ [第三章 Golang 运行代码](/blog/golang/golang-run.md) -[第四章 Golang 项目管理](blog/golang/golang-project.md) +[第四章 Golang 项目管理](/blog/golang/golang-project.md) [第五章 Golang标识符、关键字、命名规则](blog/golang/golang-identifier.md) @@ -44,8 +44,9 @@ [第十八章 Golang接口 interface](/blog/golang/golang-interface.md) +[第十九章 Golang包 package](/blog/golang/golang-package.md) -https://www.bilibili.com/video/BV1ME411Y71o?p=27&spm_id_from=pageDriver&vd_source=efbb4dc944fa761b6e016ce2ca5933da +https://www.bilibili.com/video/BV1ME411Y71o?p=27&spm_id_from=pageDriver&vd_source=efbb4dc944fa761b6e016ce2ca5933da -https://www.bilibili.com/video/BV1zR4y1t7Wj/?p=58&spm_id_from=pageDriver&vd_source=efbb4dc944fa761b6e016ce2ca5933da \ No newline at end of file +https://www.bilibili.com/video/BV1zR4y1t7Wj?p=67&spm_id_from=pageDriver&vd_source=efbb4dc944fa761b6e016ce2ca5933da \ No newline at end of file -- GitLab