Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
檀越@新空间
Coding Tree
提交
7b4fc69d
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看板
提交
7b4fc69d
编写于
9月 22, 2022
作者:
彭世瑜
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix
上级
c0805a9b
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
257 addition
and
2 deletion
+257
-2
blog/golang/golang-interface.md
blog/golang/golang-interface.md
+89
-0
blog/golang/golang-struct.md
blog/golang/golang-struct.md
+165
-0
blog/golang/index.md
blog/golang/index.md
+3
-2
未找到文件。
blog/golang/golang-interface.md
0 → 100644
浏览文件 @
7b4fc69d
# 第十八章 Golang接口 interface
go语言中的接口,是一种新的类型定义,它把所有的具有共性的方法定义在一起,任何其他类型制药实现了这些方法就是实现了这个接口
语法
```
go
// 定义接口
type
interface_name
interface
{
method_name
[
return_type
]
...
}
// 定义结构体
type
struct_name
struct
{
}
// 实现接口方法
func
(
struct_name_variable
struct_name
)
method_name
[
return_type
]{
// 方法实现
}
```
接口示例
定义一个USB接口,有读read 写write两个方法
再定义一个电脑computer 和 手机Mobile 来实现这个接口
```
go
package
main
import
"fmt"
// USB接口
type
USB
interface
{
read
()
write
()
}
// Computer 结构体
type
Computer
struct
{
}
// Mobile 结构体
type
Mobile
struct
{
}
// Computer 实现USB方法
func
(
computer
Computer
)
read
()
{
fmt
.
Println
(
"computer read"
)
}
func
(
computer
Computer
)
write
()
{
fmt
.
Println
(
"computer write"
)
}
// Mobile 实现USB方法
func
(
mobile
Mobile
)
read
()
{
fmt
.
Println
(
"mobile read"
)
}
func
(
mobile
Mobile
)
write
()
{
fmt
.
Println
(
"mobile write"
)
}
func
main
()
{
computer
:=
Computer
{}
computer
.
read
()
computer
.
write
()
// computer read
// computer write
mobile
:=
Mobile
{}
mobile
.
read
()
mobile
.
write
()
// mobile read
// mobile write
}
```
> 备注: 实现接口必须实现接口中的所有方法
blog/golang/golang-struct.md
浏览文件 @
7b4fc69d
...
@@ -360,6 +360,7 @@ func main() {
...
@@ -360,6 +360,7 @@ func main() {
var
person
=
new
(
Person
)
var
person
=
new
(
Person
)
// 访问结构体指针成员,可以省略*
// 访问结构体指针成员,可以省略*
// 自动解引用
(
*
person
)
.
age
=
23
(
*
person
)
.
age
=
23
person
.
id
=
12
person
.
id
=
12
person
.
name
=
"Tom"
person
.
name
=
"Tom"
...
@@ -460,3 +461,167 @@ func main() {
...
@@ -460,3 +461,167 @@ func main() {
}
}
```
```
## 结构体的嵌套
示例
```
go
package
main
import
"fmt"
type
Dog
struct
{
age
int
name
string
}
type
Person
struct
{
age
int
name
string
dog
Dog
}
func
main
()
{
dog
:=
Dog
{
age
:
1
,
name
:
"dog"
,
}
person
:=
Person
{
dog
:
dog
,
age
:
11
,
name
:
"Tom"
,
}
fmt
.
Printf
(
"%v
\n
"
,
person
)
// {11 Tom {1 dog}}
fmt
.
Printf
(
"%v
\n
"
,
person
.
dog
.
name
)
// dog
}
```
## 方法
golang中,方法是一种特殊的函数
定义与struct之上(与struct关联、绑定),被称为struct的接受者(receiver)
通俗讲,方法就是有接收者的函数
语法格式
```
go
type
struct_name
struct
{}
func
(
recv
struct_name
)
method_name
(
param_type
)
return_type
{}
func
(
recv
*
struct_name
)
method_name
(
param_type
)
return_type
{}
```
```
go
package
main
import
"fmt"
// 属性和方法分开写
type
Person
struct
{
age
int
name
string
}
// Person 接收者 receiver
func
(
person
Person
)
eat
()
{
fmt
.
Printf
(
"%v eat
\n
"
,
person
.
name
)
}
func
(
person
Person
)
sleep
()
{
fmt
.
Printf
(
"%v sleep
\n
"
,
person
.
name
)
}
func
main
()
{
person
:=
Person
{
age
:
11
,
name
:
"Tom"
,
}
person
.
eat
()
// Tom eat
person
.
sleep
()
// Tom sleep
}
```
go语言方法的注意事项
-
方法的receiver type可以是类型别名、struct、slice、map、channel、func等
-
struct结合它的方法等价于面向对象中的类,只不过struct可以和它的方法分开写,并非一定要属于同一个文件,但是,必须属于同一个包
-
方法有两种接收类型
`(T type)`
和
`(T *Type)`
,它们之间有区别
-
方法就是函数,所有Go中没有方法重载overload的说法,也就是说同一个类型中的所有方法名必须唯一
-
如果receiver是一个指针类型,则会自动解除引用
-
方法和type是分开的,意味着实例的行为behavior和数据存储field是分开的,但它们通过receiver建立起关联关系
## 方法接收者类型
-
值类型:复制结构体副本
-
指针类型:不复制
```
go
package
main
import
"fmt"
// Person 接收者 receiver
type
Person
struct
{
age
int
name
string
}
// 值传递,拷贝了一份副本
func
(
person
Person
)
showPersonByValue
()
{
person
.
age
=
12
person
.
name
=
"Jack"
fmt
.
Printf
(
"%v
\n
"
,
person
)
}
// 指针传递
func
(
person
*
Person
)
showPersonByPointer
()
{
person
.
age
=
12
person
.
name
=
"Jack"
fmt
.
Printf
(
"%v
\n
"
,
person
)
}
func
main
()
{
person
:=
Person
{
age
:
11
,
name
:
"Tom"
,
}
fmt
.
Printf
(
"%v
\n
"
,
person
)
// {11 Tom}
// 接收者类型是变量,值没有被修改
person
.
showPersonByValue
()
// {12 Jack}
fmt
.
Printf
(
"%v
\n
"
,
person
)
// {11 Tom}
// 接收者类型是指针,值被修改
person
.
showPersonByPointer
()
// &{12 Jack}
fmt
.
Printf
(
"%v
\n
"
,
person
)
// {12 Jack}
}
```
\ No newline at end of file
blog/golang/index.md
浏览文件 @
7b4fc69d
...
@@ -42,9 +42,10 @@
...
@@ -42,9 +42,10 @@
[
第十七章 Golang 结构体 struct
](
/blog/golang/golang-struct.md
)
[
第十七章 Golang 结构体 struct
](
/blog/golang/golang-struct.md
)
[
第十八章 Golang接口 interface
](
/blog/golang/golang-interface.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=54&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
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录