Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
檀越@新空间
Coding Tree
提交
49dae74e
C
Coding Tree
项目概览
檀越@新空间
/
Coding Tree
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
C
Coding Tree
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
49dae74e
编写于
9月 25, 2022
作者:
彭世瑜
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix
上级
7b4fc69d
变更
3
显示空白变更内容
内联
并排
Showing
3 changed file
with
556 addition
and
3 deletion
+556
-3
blog/golang/golang-interface.md
blog/golang/golang-interface.md
+405
-0
blog/golang/golang-package.md
blog/golang/golang-package.md
+147
-0
blog/golang/index.md
blog/golang/index.md
+4
-3
未找到文件。
blog/golang/golang-interface.md
浏览文件 @
49dae74e
...
@@ -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
blog/golang/golang-package.md
0 → 100644
浏览文件 @
49dae74e
# 第十九章 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"
}
```
blog/golang/index.md
浏览文件 @
49dae74e
...
@@ -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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录