Skip to content

Commit b1bd358

Browse files
author
王炳明
committed
2 parents 626b873 + d8f36dd commit b1bd358

File tree

8 files changed

+270
-12
lines changed

8 files changed

+270
-12
lines changed

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11

2-
这是我的个人博客( [Go编程时光](http:/golang.iswbm.con/) ),主要写关于Go的一些思考总结。
2+
这是我的个人博客( [Go编程时光](http:/golang.iswbm.com/) ),主要写关于Go的一些思考总结。
33
## 第一章:基础知识
44
- 1.1 [一文搞定开发环境的搭建](http://golang.iswbm.com/en/latest/c01/c01_01.html)
55
- 1.2 [五种变量创建的方法](http://golang.iswbm.com/en/latest/c01/c01_02.html)
@@ -24,6 +24,8 @@
2424
- 2.2 [面向对象编程:接口与多态](http://golang.iswbm.com/en/latest/c02/c02_02.html)
2525
- 2.3 [关键字:make 和 new 的区别?](http://golang.iswbm.com/en/latest/c02/c02_03.html)
2626
- 2.4 [理解语句块与作用域](http://golang.iswbm.com/en/latest/c02/c02_04.html)
27+
- 2.5 [说说 Go 语言中的空接口](http://golang.iswbm.com/en/latest/c02/c02_05.html)
28+
- 2.6 [动态类型与静态类型](http://golang.iswbm.com/en/latest/c02/c02_06.html)
2729

2830
## 第三章:项目管理
2931
- 3.1 [超详细解读 Go Modules 前世今生及入门使用](http://golang.iswbm.com/en/latest/c03/c03_01.html)

source/c01/c01_17.rst

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,13 +74,16 @@
7474
fmt.Println(msg)
7575
}
7676
77-
然后执行
78-
如下命令进行编译,里面有好多个参数,我还没去了解是什么意思,有疑问的可以自行搜索引擎
77+
然后执行 如下命令进行编译,里面有好多个参数,有疑问的可以自行搜索引擎
7978

8079
.. code:: shell
8180
81+
# 关闭内联优化,方便调试
8282
$ go build -gcflags "-N -l" demo.go
8383
84+
# 发布版本删除调试符号
85+
go build -ldflags “-s -w”
86+
8487
最后使用 GDB 命令进入调试界面
8588

8689
.. code:: shell
@@ -129,7 +132,7 @@
129132
- ``info args``\ :查看函数的参数值及要返回的变量值
130133
- ``info frame``\ :堆栈帧信息
131134
- ``info goroutines``\ :查看 goroutines 信息。在使用前
132-
,需要注意先执行 /usr/local/go/src/runtime/runtime-gdb.py
135+
,需要注意先执行 source /usr/local/go/src/runtime/runtime-gdb.py
133136

134137
- ``goroutine 1 bt``\ :查看指定序号的 goroutine 调用堆栈
135138
- 回车:重复执行上一次操作
@@ -193,6 +196,12 @@
193196

194197
以上就是关于 GDB 的使用方法,非常简单,可以自己手动敲下体验一下。
195198

199+
**参考文章**
200+
201+
- `go 官方对于 gdb 的使用说明 <https://golang.org/doc/gdb>`__
202+
- `Mac 调试 golang
203+
程序 <%5Bhttps://www.do1618.com/archives/771/mac-gdb-%E8%B0%83%E8%AF%95-golang-%E7%A8%8B%E5%BA%8F/%5D(https://www.do1618.com/archives/771/mac-gdb-调试-golang-程序/)>`__
204+
196205
|image4|
197206

198207
.. |image0| image:: http://image.iswbm.com/20200428180632.png

source/c02/c02_05.rst

Lines changed: 233 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,233 @@
1+
2.5 说说 Go 语言中的空接口
2+
==========================
3+
4+
1. 什么是空接口?
5+
-----------------
6+
7+
空接口是特殊形式的接口类型,普通的接口都有方法,而空接口没有定义任何方法口,也因此,我们可以说所有类型都至少实现了空接口。
8+
9+
.. code:: go
10+
11+
type empty_iface interface {
12+
}
13+
14+
每一个接口都包含两个属性,一个是值,一个是类型。
15+
16+
而对于空接口来说,这两者都是 nil,可以使用 fmt 来验证一下
17+
18+
.. code:: go
19+
20+
package main
21+
22+
import (
23+
"fmt"
24+
)
25+
26+
func main() {
27+
var i interface{}
28+
fmt.Printf("type: %T, value: %v", i, i)
29+
}
30+
31+
输出如下
32+
33+
::
34+
35+
type: <nil>, value: <nil>
36+
37+
2. 如何使用空接口?
38+
-------------------
39+
40+
**第一**\ ,通常我们会直接使用 ``interface{}``
41+
作为类型声明一个实例,而这个实例可以承载任意类型的值。
42+
43+
.. code:: go
44+
45+
package main
46+
47+
import (
48+
"fmt"
49+
)
50+
51+
func main() {
52+
// 声明一个空接口实例
53+
var i interface{}
54+
55+
// 存 int 没有问题
56+
i = 1
57+
fmt.Println(i)
58+
59+
// 存字符串也没有问题
60+
i = "hello"
61+
fmt.Println(i)
62+
63+
// 存布尔值也没有问题
64+
i = false
65+
fmt.Println(i)
66+
}
67+
68+
**第二**\ ,如果想让你的函数可以接收任意类型的值 ,也可以使用空接口
69+
70+
接收一个任意类型的值 示例
71+
72+
.. code:: go
73+
74+
package main
75+
76+
import (
77+
"fmt"
78+
)
79+
80+
func myfunc(iface interface{}){
81+
fmt.Println(iface)
82+
}
83+
84+
func main() {
85+
a := 10
86+
b := "hello"
87+
c := true
88+
89+
myfunc(a)
90+
myfunc(b)
91+
myfunc(c)
92+
}
93+
94+
接收任意个任意类型的值 示例
95+
96+
.. code:: go
97+
98+
package main
99+
100+
import (
101+
"fmt"
102+
)
103+
104+
func myfunc(ifaces ...interface{}){
105+
for _,iface := range ifaces{
106+
fmt.Println(iface)
107+
}
108+
}
109+
110+
func main() {
111+
a := 10
112+
b := "hello"
113+
c := true
114+
115+
myfunc(a, b, c)
116+
}
117+
118+
**第三**\ ,你也定义一个可以接收任意类型的
119+
array、slice、map、strcut,例如这边定义一个切片
120+
121+
.. code:: go
122+
123+
package main
124+
125+
import "fmt"
126+
127+
func main() {
128+
any := make([]interface{}, 5)
129+
any[0] = 11
130+
any[1] = "hello world"
131+
any[2] = []int{11, 22, 33, 44}
132+
for _, value := range any {
133+
fmt.Println(value)
134+
}
135+
}
136+
137+
3. 空接口几个要注意的坑
138+
-----------------------
139+
140+
**坑1**\ :空接口可以承载任意值,但不代表任意类型就可以承接空接口类型的值
141+
142+
从实现的角度看,任何类型的值都满足空接口。因此空接口类型可以保存任何值,也可以从空接口中取出原值。
143+
144+
但要是你把一个空接口类型的对象,再赋值给一个固定类型(比如 int,
145+
string等类型)的对象赋值,是会报错的。
146+
147+
.. code:: go
148+
149+
package main
150+
151+
func main() {
152+
// 声明a变量, 类型int, 初始值为1
153+
var a int = 1
154+
155+
// 声明i变量, 类型为interface{}, 初始值为a, 此时i的值变为1
156+
var i interface{} = a
157+
158+
// 声明b变量, 尝试赋值i
159+
var b int = i
160+
}
161+
162+
这个报错,它就好比可以放进行礼箱的东西,肯定能放到集装箱里,但是反过来,能放到集装箱的东西就不一定能放到行礼箱了,在
163+
Go
164+
里就直接禁止了这种反向操作。(\ **声明**\ :底层原理肯定还另有其因,但对于新手来说,这样解释也许会容易理解一些。)
165+
166+
::
167+
168+
.\main.go:11:6: cannot use i (type interface {}) as type int in assignment: need type assertion
169+
170+
**坑2:**\ :当空接口承载数组和切片后,该对象无法再进行切片
171+
172+
.. code:: go
173+
174+
package main
175+
176+
import "fmt"
177+
178+
func main() {
179+
sli := []int{2, 3, 5, 7, 11, 13}
180+
181+
var i interface{}
182+
i = sli
183+
184+
g := i[1:3]
185+
fmt.Println(g)
186+
}
187+
188+
执行会报错。
189+
190+
::
191+
192+
.\main.go:11:8: cannot slice i (type interface {})
193+
194+
**坑3**\ :当你使用空接口来接收任意类型的参数时,它的静态类型是
195+
interface{},但动态类型(是 int,string
196+
还是其他类型)我们并不知道,因此需要使用类型断言。
197+
198+
.. code:: go
199+
200+
package main
201+
202+
import (
203+
"fmt"
204+
)
205+
206+
func myfunc(i interface{}) {
207+
208+
switch i.(type) {
209+
case int:
210+
fmt.Println("参数的类型是 int")
211+
case string:
212+
fmt.Println("参数的类型是 string")
213+
}
214+
}
215+
216+
func main() {
217+
a := 10
218+
b := "hello"
219+
myfunc(a)
220+
myfunc(b)
221+
}
222+
223+
输出如下
224+
225+
::
226+
227+
参数的类型是 int
228+
参数的类型是 string
229+
230+
|image0|
231+
232+
.. |image0| image:: http://image.python-online.cn/image-20200320125724880.png
233+

source/c02/c02_06.rst

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
2.6 动态类型与静态类型
2+
======================
3+
4+
https://studygolang.com/articles/13042
5+
6+
https://blog.csdn.net/stpeace/article/details/84037370

source/c05/c05_01.md

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ $ go run main.go
8787

8888

8989

90-
## 4. 表的设计
90+
## 3. 表的设计
9191

9292
### 用户(users)
9393

@@ -297,7 +297,7 @@ CREATE TABLE `comments` (
297297

298298

299299

300-
## 5. 接口整理
300+
## 4. 接口整理
301301

302302
### 文章
303303

@@ -392,9 +392,7 @@ CREATE TABLE `comments` (
392392

393393

394394

395-
##
396-
397-
## 6. 项目结构解析
395+
## 5. 项目结构解析
398396

399397
以之前创建的项目目录为根目录,继续创建如下目录
400398

source/c05/c05_01.rst

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@
110110

111111
image-20200419175221473
112112

113-
4. 表的设计
113+
3. 表的设计
114114
-----------
115115

116116
用户(users)
@@ -355,7 +355,7 @@
355355
FOREIGN KEY (`post_in`) REFERENCES articles(id)
356356
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='评论管理';
357357
358-
5. 接口整理
358+
4. 接口整理
359359
-----------
360360

361361
文章
@@ -463,7 +463,7 @@ Response
463463
"message": "OK"
464464
}
465465
466-
6. 项目结构解析
466+
5. 项目结构解析
467467
---------------
468468

469469
以之前创建的项目目录为根目录,继续创建如下目录

source/c06/c06_01.rst

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,3 +45,11 @@ https://learnku.com/docs/the-way-to-go
4545
9、Go语言圣经
4646

4747
https://go.wuhaolin.cn/gopl/
48+
49+
10、mojotv
50+
51+
https://mojotv.cn/404#Golang
52+
53+
11、cyent的 Golang 笔记
54+
55+
https://cyent.github.io/golang/

source/c06/c06_02.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
6.2 配置高颜值 IDE:Goland
2+
==========================

0 commit comments

Comments
 (0)