提交 49dae74e 编写于 作者: 彭世瑜's avatar 彭世瑜

fix

上级 7b4fc69d
...@@ -87,3 +87,408 @@ func main() { ...@@ -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
# 第十九章 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"
}
```
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
[第三章 Golang 运行代码](/blog/golang/golang-run.md) [第三章 Golang 运行代码](/blog/golang/golang-run.md)
[第四章 Golang 项目管理](blog/golang/golang-project.md) [第四章 Golang 项目管理](/blog/golang/golang-project.md)
[第五章 Golang标识符、关键字、命名规则](blog/golang/golang-identifier.md) [第五章 Golang标识符、关键字、命名规则](blog/golang/golang-identifier.md)
...@@ -44,8 +44,9 @@ ...@@ -44,8 +44,9 @@
[第十八章 Golang接口 interface](/blog/golang/golang-interface.md) [第十八章 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 https://www.bilibili.com/video/BV1zR4y1t7Wj?p=67&spm_id_from=pageDriver&vd_source=efbb4dc944fa761b6e016ce2ca5933da
\ No newline at end of file \ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册