Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
檀越@新空间
Coding Tree
提交
c0805a9b
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看板
提交
c0805a9b
编写于
9月 21, 2022
作者:
彭世瑜
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix
上级
ecc98233
变更
2
显示空白变更内容
内联
并排
Showing
2 changed file
with
465 addition
and
2 deletion
+465
-2
blog/golang/golang-struct.md
blog/golang/golang-struct.md
+462
-0
blog/golang/index.md
blog/golang/index.md
+3
-2
未找到文件。
blog/golang/golang-struct.md
0 → 100644
浏览文件 @
c0805a9b
# 第十七章 Golang 结构体 struct
## 类型定义和类型别名
类型定义的语法
```
go
type
NewType
Type
```
示例
```
go
package
main
import
"fmt"
func
main
()
{
// 定义类型
type
MyInt
int
var
i
MyInt
i
=
100
fmt
.
Printf
(
"%T"
,
i
)
// main.MyInt
}
```
类型别名语法
```
go
type
NewType
=
Type
```
示例
```
go
package
main
import
"fmt"
func
main
()
{
// 定义类型别名
type
MyInt
=
int
var
i
MyInt
i
=
100
fmt
.
Printf
(
"%T"
,
i
)
// int
}
```
类型定义和类型别名的区别
-
类型定义相当于定义了一个全新的类型
-
类型别名只会在代码中存在,编译完成后并不会存在
-
类型别名可以使用原来类型所有的方法
## Golang结构体
golang中没有面向对象的概念,但是可以使用结构体来实现,面向对象编程的一些特性,例如:继承、组合等
结构体的定义
```
go
type
struct_variable_type
struct
{
// 成员
member
definition
;
member
definition
;
...
member
definition
;
}
```
示例
```
go
// 定义一个结构体Person
type
Person
struct
{
id
int
name
string
age
int
email
string
}
// 可以把相同类型的成员合并到一行
type
Person
struct
{
id
,
age
int
name
,
email
string
}
```
声明结构体变量
```
go
var
tom
Person
fmt
.
Printf
(
"%v"
,
tom
)
// {0 0 }
jack
:=
Person
{}
fmt
.
Printf
(
"%v"
,
jack
)
// {0 0 }
```
访问结构体成员
```
go
package
main
import
"fmt"
// 定义一个结构体Person
// 可以把相同类型的成员合并到一行
type
Person
struct
{
id
,
age
int
name
,
email
string
}
func
main
()
{
var
tom
Person
tom
.
id
=
12
tom
.
name
=
"Tom"
tom
.
age
=
23
tom
.
email
=
"123@qq.com"
fmt
.
Printf
(
"%v"
,
tom
)
// {12 23 Tom 123@qq.com}
}
```
匿名结构体
```
go
package
main
import
"fmt"
func
main
()
{
var
dog
struct
{
id
int
name
string
}
dog
.
id
=
12
dog
.
name
=
"Tom"
fmt
.
Printf
(
"%v"
,
dog
)
// {12 Tom}
}
```
## Golang结构体的初始化
未初始化的结构体,成员都是零值
使用键值对的方式初始化
```
go
package
main
import
"fmt"
// 定义一个结构体Person
type
Person
struct
{
id
int
age
int
name
string
email
string
}
func
main
()
{
tom
:=
Person
{
id
:
12
,
age
:
23
,
name
:
"Tom"
,
email
:
"123@qq.com"
,
}
fmt
.
Printf
(
"%v"
,
tom
)
// {12 23 Tom 123@qq.com}
}
```
使用值的列表初始化
```
go
package
main
import
"fmt"
// 定义一个结构体Person
type
Person
struct
{
id
int
age
int
name
string
email
string
}
func
main
()
{
tom
:=
Person
{
12
,
23
,
"Tom"
,
"123@qq.com"
,
}
fmt
.
Printf
(
"%v"
,
tom
)
// {12 23 Tom 123@qq.com}
}
```
部分成员初始化
```
go
package
main
import
"fmt"
// 定义一个结构体Person
type
Person
struct
{
id
int
age
int
name
string
email
string
}
func
main
()
{
tom
:=
Person
{
id
:
12
,
name
:
"Tom"
,
}
fmt
.
Printf
(
"%v"
,
tom
)
// {12 0 Tom }
}
```
## Golang结构体的指针
普通指针
```
go
package
main
import
"fmt"
// 定义一个结构体Person
type
Person
struct
{
id
int
age
int
name
string
email
string
}
func
main
()
{
// 定义字符串变量
var
name
string
name
=
"Tom"
// 定义字符串类型的指针变量
var
name_ptr
*
string
name_ptr
=
&
name
// 变量的值
fmt
.
Printf
(
"%v
\n
"
,
name
)
// Tom
// 指针地址
fmt
.
Printf
(
"%v
\n
"
,
name_ptr
)
// 0xc000014250
// 指针指向的变量值
fmt
.
Printf
(
"%v
\n
"
,
*
name_ptr
)
// Tom
}
```
结构体的指针
```
go
package
main
import
"fmt"
// 定义一个结构体Person
type
Person
struct
{
id
int
age
int
name
string
email
string
}
func
main
()
{
// 结构体变量
person
:=
Person
{
id
:
11
,
name
:
"Tom"
,
age
:
23
,
email
:
"123@qq.com"
,
}
// 指针变量
var
person_ptr
*
Person
person_ptr
=
&
person
// 变量的值
fmt
.
Printf
(
"%v
\n
"
,
person
)
// {11 23 Tom 123@qq.com}
// 指针地址
fmt
.
Printf
(
"%p
\n
"
,
person_ptr
)
// 0xc00009a180
// 指针指向的变量值
fmt
.
Printf
(
"%v
\n
"
,
*
person_ptr
)
// {11 23 Tom 123@qq.com}
}
```
使用new关键字创建结构体指针
```
go
package
main
import
"fmt"
// 定义一个结构体Person
type
Person
struct
{
id
int
age
int
name
string
email
string
}
func
main
()
{
var
person
=
new
(
Person
)
// 访问结构体指针成员,可以省略*
(
*
person
)
.
age
=
23
person
.
id
=
12
person
.
name
=
"Tom"
fmt
.
Printf
(
"%T
\n
"
,
person
)
// *main.Person
fmt
.
Printf
(
"%v
\n
"
,
person
)
// &{12 0 Tom }
fmt
.
Printf
(
"%v
\n
"
,
*
person
)
// {12 0 Tom }
}
```
## 结构体作为函数参数
结构体作为参数传递给函数
-
直接传递结构体,传递的是副本,函数内部不能改变外部结构体内容
-
传递结构体指针,函数内部能改变外部结构体内容
值传递
```
go
package
main
import
"fmt"
type
Person
struct
{
age
int
name
string
}
// 值传递,拷贝了一份副本
func
showPerson
(
person
Person
)
{
person
.
age
=
12
person
.
name
=
"Jakc"
fmt
.
Printf
(
"%v
\n
"
,
person
)
}
func
main
()
{
person
:=
Person
{
age
:
11
,
name
:
"Tom"
,
}
fmt
.
Printf
(
"%v
\n
"
,
person
)
// {11 Tom}
showPerson
(
person
)
// {12 Jakc}
fmt
.
Printf
(
"%v
\n
"
,
person
)
// {11 Tom}
}
```
指针传递
```
go
package
main
import
"fmt"
type
Person
struct
{
age
int
name
string
}
// 指针传递
func
showPerson
(
person
*
Person
)
{
person
.
age
=
12
person
.
name
=
"Jakc"
fmt
.
Printf
(
"%v
\n
"
,
*
person
)
}
func
main
()
{
person
:=
Person
{
age
:
11
,
name
:
"Tom"
,
}
fmt
.
Printf
(
"%v
\n
"
,
person
)
// {11 Tom}
showPerson
(
&
person
)
// {12 Jakc}
fmt
.
Printf
(
"%v
\n
"
,
person
)
// {12 Jakc}
}
```
blog/golang/index.md
浏览文件 @
c0805a9b
...
...
@@ -40,10 +40,11 @@
[
第十六章 Golang 指针
](
/blog/golang/golang-pointer.md
)
[
第十七章 Golang 结构体 struct
](
/blog/golang/golang-struct.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=49&spm_id_from=pageDriver&vd_source=efbb4dc944fa761b6e016ce2ca5933da
\ No newline at end of file
https://www.bilibili.com/video/BV1zR4y1t7Wj/?p=54&spm_id_from=pageDriver&vd_source=efbb4dc944fa761b6e016ce2ca5933da
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录