|
1 | 1 | # 《365天深入理解Go语言》 |
2 | 2 |
|
3 | | -本书籍是记录自己在学习Go语言的过程中遇到的问题与思考。写作过程中大量参考借鉴甚至是复制了其他类似的项目。感谢每一个项目,致敬每一位Gopher!尽可能的熟练使用Go语言,尽可能的深入理解Go语言。努力成为Go语言特长型程序员。学习Go语言,面向信仰编程!作者:[0e0w](https://github.com/0e0w)。Less is More or Less is Less. |
| 3 | +本书籍是记录自己在学习Go语言的过程中遇到的问题与思考。写作过程中大量参考借鉴甚至是复制了其他类似的项目。感谢每一个项目,致敬每一位Gopher!尽可能的熟练使用Go语言,尽可能的深入理解Go语言。努力成为Go语言特长型程序员。**学习Go语言,面向信仰编程! **作者:[0e0w](https://github.com/0e0w)。Less is More or Less is Less. |
4 | 4 |
|
5 | | -本项目创建于2020年9月1日,最近的一次更新时间为2022年5月2日。本项目会持续更新,直到海枯石烂。 |
| 5 | +本项目创建于2020年9月1日,最近的一次更新时间为2022年5月19日。本项目会持续更新,直到海枯石烂。 |
6 | 6 |
|
7 | 7 | 项目暂时计划共七章。项目未完成,持续更新整理中!**今天你学习Go语言了吗?** |
8 | 8 |
|
|
16 | 16 |
|
17 | 17 | ## 01-Go语言基础 |
18 | 18 |
|
19 | | -基础不牢地动山摇,此理论不仅适用于建筑行业,在学习Go语言过程中更是这样!即使是最基础的内容,也需要反复学习,多次试验,刻意练习,直至达到深入理解的目的! |
| 19 | +基础不牢地动山摇,此理论不仅适用于建筑行业,在学习Go语言中更是这样!最基础的内容,也需要反复学习,多次试验,刻意练习,之后直至达到深入理解的境界! |
20 | 20 |
|
21 | 21 | <details> |
22 | 22 | <summary>Day001: 基础-Go语言入门</summary> |
23 | 23 |
|
24 | 24 | - [x] 本节说明:本节介绍Go语言的历史与发展。 |
25 | | -- [ ] 程序语言概述: |
26 | | -- [x] Go语言概述: |
27 | | - |
28 | | - - Go语言是一门编译型的开源的程序设计语言。通过Go语言可以容易的构造出简单、可靠且高效的软件。 因为开源,所以编译器、库和工具的源代码可以免费获得。 |
29 | | - - Go语言是由[Robert Griesemer](https://github.com/griesemer)、[Rob Pike](https://github.com/robpike)、[Ken Thompson](https://baike.baidu.com/item/Ken%20Thompson/3441433)在2007年末主持开发,后来加入了[Ian Lance Taylor](https://github.com/ianlancetaylor/)、[Russ Cox](https://github.com/rsc)等。在2009年11月开源发布,并在2012年发布了Go1稳定版本。 |
30 | | - - Go语言没有构造或析构函数、没有运算符重载、没有形参默认值、没有异常、没有宏、没有函数注解、没有线程局部存储。暂时没有泛型。 |
31 | | - - Go 语言不是面向对象编程语言:没有类继承,甚至没有类。 |
32 | | - - Go语言以一种不同寻常的方式来诠释面向对象程序设计。 |
| 25 | +- [x] 程序语言概述:程序语言是用来定义计算机程序的形式语言。它是一种被标准化的交流技巧,用来向计算机发出指令,一种能够让程序员准确地定义计算机所需要使用数据的计算机语言,并精确地定义在不同情况下所应当采取的行动。最早的编程语言是在电脑发明之前产生的,当时是用来控制提花织布机及自动演奏钢琴的动作。在电脑领域已发明了上千不同的编程语言,而且每年仍有新的编程语言诞生。 |
| 26 | +- [x] Go语言概述:Go语言是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。通过Go语言可以容易的构造出简单、可靠且高效的软件。 Go语言也是开源的,所以编译器、库和工具的源代码都可以免费获得。 |
| 27 | + |
| 28 | + - Go语言是由[Robert Griesemer](https://github.com/griesemer)、[Rob Pike](https://github.com/robpike)、[Ken Thompson](https://baike.baidu.com/item/Ken%20Thompson/3441433)在2007年9月开始设计,之后[Ian Lance Taylor](https://github.com/ianlancetaylor/)、[Russ Cox](https://github.com/rsc)加入项目。Go于2009年11月正式宣布推出,成为开放源代码项目,支持Linux、macOS、Windows等操作系统。在2012年发布了Go1稳定版本。 |
| 29 | + - Go语言没有构造或析构函数、没有运算符重载、没有形参默认值、没有异常、没有宏、没有函数注解、没有线程局部存储。Go语言在1.18 中正式支持泛型。 |
| 30 | + - Go 语言不是面向对象编程语言:没有类继承,甚至没有类。Go语言以一种不同寻常的方式来诠释面向对象程序设计。 |
33 | 31 | - Go语言有垃圾回收、有包系统、有一等公民函数、有词法作用域、有系统调用接口等。 |
34 | 32 | - [x] Go语言特点:Go语言和其他语言相比的优势是什么? |
35 | 33 |
|
|
224 | 222 | go env -w GOPROXY=https://goproxy.cn,direct |
225 | 223 | ``` |
226 | 224 |
|
227 | | -- [x] Go语言未来: |
228 | | -
|
229 | | - - Go语言拥有大量的优秀社区框架。 |
230 | | - - Go语言的未来发展前景是光明的。 |
231 | | -
|
232 | 225 | - [x] 一个例子:Hello World! |
233 | 226 |
|
234 | 227 | ```go |
|
257 | 250 | - 在变量与运算符间加入空格,程序看起来更加美观。 |
258 | 251 | - 标识符:用来命名变量、类型等程序实体。一个标识符就是一个或是多个字母( A ~ Z 和 a ~ z)数字(0~9)、下划线_组成的序列,但是第一个字符必须是字母或下划线而不能是数字。 |
259 | 252 |
|
260 | | -- [x] 关键字:关键字是一些特殊的用来帮助编译器理解和解析源代码的单词。Go语言中有**25个**关键字或保留字。关键字只能用在程序语法允许的地方,不能作为名称使用。 |
| 253 | +- [x] Go语言关键字:关键字是一些特殊的用来帮助编译器理解和解析源代码的单词。Go语言中有**25个**关键字或保留字。关键字只能用在程序语法允许的地方,不能作为名称使用。 |
261 | 254 |
|
262 | 255 | - 声明代码元素:const、func、import、package、type、var |
263 | 256 | - 组合类型表示:chan、interface、map、struct |
|
270 | 263 | - 类型:int、int8、int16、int32、int64、uint、uint8、uint16、uint32、uint64、uintptr、float32、float64、complex128、complex64、bool、byte、rune、string、error |
271 | 264 | - 函数:make、len、cap、new、append、copy、close、delete、complex、real、imag、panic、recover |
272 | 265 |
|
273 | | -- [x] 声明: |
| 266 | +- [x] Go语言声明:声明是给一个程序实体命名,并设定其部分或全部属性。 |
274 | 267 |
|
275 | | - - 声明是给一个程序实体命名,并设定其部分或全部属性。 |
276 | 268 | - 有4个主要的声明:变量(var)、常量(const)、类型(type)、函数(func) |
277 | 269 |
|
278 | 270 | - 函数的声明包含一个名字、一个参数列表、一个可选的返回值列表以及函数体。 |
|
297 | 289 | - 左大括号 { 不能单独一行,这是编译器的强制规定,否则你在使用 gofmt 时就会出现错误提示“ expected declaration, found '{' ”。右大括号 } 需要单独一行。 |
298 | 290 | - 在定义接口名时也有惯例,接口的名字由方法名加 [e]r 后缀组成,例如 Printer、Reader、Writer、Logger、Converter 等等。还有一些不常用的方式(当后缀 er 不合适时),比如 Recoverable,此时接口名以 able 结尾,或者以 I 开头(像 .NET 或 Java 中那样)。 |
299 | 291 |
|
300 | | -- [x] 注释: |
| 292 | +- [x] 注释:尽管高级编程语言代码比底层机器指令友好和易懂,我们还是需要一些注释来帮助自己和其他程序员理解我们所写的代码。 |
301 | 293 |
|
302 | | - - 尽管高级编程语言代码比底层机器指令友好和易懂,我们还是需要一些注释来帮助自己和其他程序员理解我们所写的代码。 |
303 | 294 | - 行注释:使用双斜线//开始,一般后面紧跟一个空格。行注释是Go语言中最常见的注释形式,在标准包中,一般都采用行注释,建议采用这种方式。 |
304 | 295 | - 块注释:使用 /* */,块注释不能嵌套。块注释一般用于包描述或注释成块的代码片段。 |
305 | | - |
| 296 | + |
306 | 297 | </details> |
307 | 298 | <details> |
308 | 299 | <summary>Day002: 数据-Go语言变量</summary> |
309 | 300 |
|
310 | 301 | - [x] 本节说明:本节介绍Go语言变量的相关内容。 |
311 | 302 |
|
312 | | -- [x] 程序语言的变量: |
| 303 | +- [x] 程序语言的变量:变量(英语:Variable,scalar)是指一个包含部分已知或未知数值或信息(即一个值)的存储地址,以及相对应之符号名称(识别字)。通常使用变量名称引用存储值;将名称和内容分开能让被使用的名称独立于所表示的精确消息之外。电脑源代码中的识别字能在执行期间绑扎一个值,且该变量的值可能在程序执行期间改变。 程序设计中的变量不一定能直接对应到数学中所谓的变量之概念。在程序设计中,变量的值不一定要为方程或数学公式之一部分。程序设计中的变量可使用在一段可重复的程序:在一处赋值,然后使用于另一处,接着在一次赋值,且以相同方式再使用一次(见迭代)。程序设计中的变量通常会给定一个较长的名称,以描述其用途;数学中的变量通常较为简洁,只给定一、两个字母,以方便抄写及操作。 一个变量的存储地址可以被不同的识别字所引用,这种情况称之为别名。使用其中一个识别字为变量赋值,将会改变透过另一个识别字访问的值。 |
313 | 304 |
|
314 | 305 | - 什么是变量?程序变量是如何实现的?变量有什么用处? |
315 | 306 | - 变量是指一个包含部分已知或未知数值或信息(即一个值)之存储地址,以及相对应之符号名称。通常使用变量名称引用存储值。 |
|
323 | 314 | - Go语言声明变量时将变量的类型放在变量的名称后面。 |
324 | 315 | - Go语言变量有2种声明方式,var标准变量申明和短变量声明。 |
325 | 316 |
|
326 | | -- [x] Go语言变量声明-标准变量声明: |
| 317 | +- [x] Go语言标准变量声明: |
327 | 318 |
|
328 | 319 | - 使用var声明,声明之后需要进行初始化。未初始化时是对应数据的零值。 |
329 | 320 | - Go语言变量的命名规则遵循骆驼命名法。 |
|
343 | 334 | var a, b *int |
344 | 335 | ``` |
345 | 336 |
|
346 | | - - 声明变量之后,变量会自动初始化。初始值对应类型的零值。当一个变量被var声明之后,系统自动赋予它该类型的零值。所有的内存在 Go 中都是经过初始化的。数字类型对应的是0、布尔类型对应的是flase、字符串类型对应的是""、接口和引用类型对应的是nil。 |
| 337 | + - 声明变量之后,变量会自动初始化,初始值对应类型的零值。当一个变量被var声明之后,系统自动赋予它该类型的零值。所有的内存在 Go 中都是经过初始化的。数字类型对应的是0、布尔类型对应的是flase、字符串类型对应的是""、接口和引用类型对应的是nil。 |
347 | 338 |
|
348 | 339 | ```go |
349 | 340 | var name type = expression |
350 | 341 | var i, j, k int |
351 | 342 | var b, f, s, = true, 2.3, "four" |
352 | 343 | ``` |
353 | 344 |
|
354 | | -- [x] Go语言变量声明-短变量声明: |
| 345 | +- [x] Go语言短变量声明: |
355 | 346 |
|
356 | 347 | - 在函数内部声明变量可以使用短变量声明方式。 |
| 348 | + |
357 | 349 | - 变量初始化时省略变量的类型会由系统自动推断。短变量声明时会同时进行初始化。 |
| 350 | + |
358 | 351 | - 短变量声明是变量声明的首选形式,但是只能用在函数体内,不可以用于全局变量的声明与赋值。 |
359 | | - - 使用操作符 := 可以高效地创建一个新的变量,称之为初始化声明。 |
360 | | - - 简式声明一般用在func内,要注意的是:全局变量和简式声明的变量尽量不要同名,否则很容易产生偶然的变量隐藏Accidental Variable Shadowing。 |
361 | | - - name := expression |
| 352 | + |
| 353 | + - 全局变量和简式声明的变量尽量不要同名,否则很容易产生偶然的变量隐藏Accidental Variable Shadowing。 |
| 354 | + |
| 355 | + - 使用操作符 := 可以高效地创建一个新的变量,称之为初始化声明。name := expression |
362 | 356 |
|
363 | 357 | ```go |
364 | | - a, b, c := 5, 7, "abc" // 注意等号前的冒号 |
| 358 | + a := 5 |
| 359 | + a, b, c := 5, 7, "abc" |
365 | 360 | ``` |
366 | 361 |
|
367 | 362 | - [x] Go语言变量赋值: |
|
380 | 375 |
|
381 | 376 | - [x] Go语言空白标识符 _ : |
382 | 377 |
|
383 | | - - 空白标识符 _ 也被用于抛弃值,如值 5 在:_, b = 5, 7 中被抛弃。 |
384 | | - - _ 实际上是一个只写变量,你不能得到它的值。这样做是因为 Go 语言中你必须使用所有被声明的变量,但有时你并不需要使用从一个函数得到的所有返回值。 |
385 | 378 | - 空白标识符是一个特殊的标识符.它可以像其他标识符那样用于变量的声明或赋值(任何类型都可以赋值给它),但任何赋给这个标识符的值都将被抛弃,因此这些值不能在后续的代码中使用,也不可以使用这个标识符作为变量对其它变量进行赋值或运算。 |
| 379 | + - 空白标识符 _ 也被用于抛弃值,如值 5 在:_, b = 5, 7 中被抛弃。 |
386 | 380 | - 由于Go语言有个强制规定,在函数内一定要使用声明的变量,但未使用的全局变量是没问题的。为了避免有未使用的变量,代码将编译失败,我们可以将该未使用的变量改为 _。 |
387 | 381 | - 另外,在Go语言中,如果引入的包未使用,也不能通过编译。有时我们需要引入的包,比如需要init(),或者调试代码时我们可能去掉了某些包的功能使用,你可以添加一个下划线标记符,_,来作为这个包的名字,从而避免编译失败。下滑线标记符用于引入,但不使用。 |
388 | | - |
| 382 | + |
389 | 383 | - [x] Go语言零值nil: |
390 | 384 |
|
391 | 385 | - nil 标志符用于表示interface、函数、maps、slices、channels、error、指针等的“零值”。如果你不指定变量的类型,编译器将无法编译你的代码,因为它猜不出具体的类型。 |
|
405 | 399 | - [x] 程序语言的常量: |
406 | 400 |
|
407 | 401 | - 什么是常量?程序语言为什么需要常量?常量的优缺点? |
408 | | - - 常量又称常数,是一个在程序正常执行过程中不会被程序改变的值,也就是说,这个值是恒定的。常数可以分为不同的数据类型。 |
| 402 | + - 常量又称常数,是一个在程序正常执行过程中始终不会改变的值。也就是说,这个值是恒定的。常数可以分为不同的数据类型。 |
409 | 403 |
|
410 | 404 | - [x] Go语言常量概述: |
411 | 405 |
|
|
0 commit comments