From f81bc04e4a043f40ee5bac71af781fb672f2ce7d Mon Sep 17 00:00:00 2001 From: shibo_zhong Date: Tue, 27 Apr 2021 18:08:29 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E6=8C=87=E5=AF=BC=E4=B8=8D=E6=98=AF?= =?UTF-8?q?=E7=9F=A5=E9=81=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2cd95f6..9850131 100755 --- a/README.md +++ b/README.md @@ -511,4 +511,4 @@ Go语言专门针对多处理器系统应用程序的编程进行了优化,使 > 致谢: > -> ​ 感谢的千锋教育以及千锋教育Go语言组的同事:Steven老师,Davie老师等在技术上给与的知道和帮助。# Golang-100-Days +> ​ 感谢的千锋教育以及千锋教育Go语言组的同事:Steven老师,Davie老师等在技术上给与的指导和帮助。# Golang-100-Days From 7dbf51eaee557f8dd7aab975aa97435d11c52090 Mon Sep 17 00:00:00 2001 From: shibo_zhong Date: Tue, 27 Apr 2021 18:10:27 +0800 Subject: [PATCH 2/3] =?UTF-8?q?readme=E4=B8=AD=E6=96=87=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9850131..c4e2c2a 100755 --- a/README.md +++ b/README.md @@ -511,4 +511,4 @@ Go语言专门针对多处理器系统应用程序的编程进行了优化,使 > 致谢: > -> ​ 感谢的千锋教育以及千锋教育Go语言组的同事:Steven老师,Davie老师等在技术上给与的指导和帮助。# Golang-100-Days +> ​ 感谢的千锋教育以及千锋教育Go语言组的同事:Steven老师,Davie老师等在技术上给予的指导和帮助。# Golang-100-Days From ce160d43124d4a9c0538ab5e4bb330561d669e76 Mon Sep 17 00:00:00 2001 From: shibo_zhong Date: Thu, 29 Apr 2021 13:54:30 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E6=A0=87=E8=AE=B0=E9=87=8D=E7=82=B9?= =?UTF-8?q?=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/workspace.xml | 23 ++++++++++++++++++ .../.DS_Store" | Bin 6148 -> 6148 bytes ...go\345\222\214\347\211\210\346\234\254.md" | 2 +- ...70\345\277\203\347\211\271\346\200\247.md" | 22 +++++++++-------- ...00\347\232\204\345\257\271\346\257\224.md" | 6 ++--- 5 files changed, 39 insertions(+), 14 deletions(-) create mode 100644 .idea/workspace.xml diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 0000000..9c2b25a --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/Day01-15(Go\350\257\255\350\250\200\345\237\272\347\241\200)/.DS_Store" "b/Day01-15(Go\350\257\255\350\250\200\345\237\272\347\241\200)/.DS_Store" index 4bf45dd1652a2c6a810a92541fa8320f681290e8..48b7a4f8dd63fc0306529b739686a62b274f29a8 100644 GIT binary patch delta 74 zcmZoMXfc=|#>B)qF;Q%yo+2aX#DLw4m>3y3C-X2iaikO{=OpFl=WK3fEM(ox&cV+C cRJr*h<9FuC{34bdj0_Aw#K5pQKx7Lu0P`9W&Hw-a delta 66 zcmZoMXfc=|#>B`mF;Q%yo+6MA*v-f>nTM%q^FpRH){O2015年8月** go1.5发布,这个版本被认为是历史性的。完全移除C语言部分,使用GO编译GO,少量代码使用汇编实现。另外,他们请来了内存管理方面的权威专家Rick Hudson,对GC进行了重新设计,支持并发GC,解决了一直以来广为诟病的GC时延(STW)问题。并且在此后的版本中,又对GC做了更进一步的优化。到**go1.8**时,相同业务场景下的GC时延已经可以从go1.1的数秒,控制在1ms以内。GC问题的解决,可以说GO语言在服务端开发方面,几乎抹平了所有的弱点。 直到今年的2月25日,Go语言发布最新的版本是Go 1.12。 diff --git "a/Day01-15(Go\350\257\255\350\250\200\345\237\272\347\241\200)/day01_\347\254\2544\350\212\202_Go\350\257\255\350\250\200\347\232\204\346\240\270\345\277\203\347\211\271\346\200\247.md" "b/Day01-15(Go\350\257\255\350\250\200\345\237\272\347\241\200)/day01_\347\254\2544\350\212\202_Go\350\257\255\350\250\200\347\232\204\346\240\270\345\277\203\347\211\271\346\200\247.md" index 26cad02..d040769 100644 --- "a/Day01-15(Go\350\257\255\350\250\200\345\237\272\347\241\200)/day01_\347\254\2544\350\212\202_Go\350\257\255\350\250\200\347\232\204\346\240\270\345\277\203\347\211\271\346\200\247.md" +++ "b/Day01-15(Go\350\257\255\350\250\200\345\237\272\347\241\200)/day01_\347\254\2544\350\212\202_Go\350\257\255\350\250\200\347\232\204\346\240\270\345\277\203\347\211\271\346\200\247.md" @@ -31,13 +31,13 @@ Go语言在并发编程方面比绝大多数语言要简洁不少,这一点是 ![bingfa1](img/bingfa1.jpg) -不同于传统的多进程或多线程,golang的并发执行单元是一种称为goroutine的协程。 +不同于传统的多进程或多线程,golang的并发执行单元是一种称为goroutine的协程。 -由于在共享数据场景中会用到锁,再加上GC,其并发性能有时不如异步复用IO模型,因此相对于大多数语言来说,golang的并发编程简单比并发性能更具卖点。 +由于在共享数据场景中会用到锁,再加上GC,其并发性能有时不如异步复用IO模型,因此相对于大多数语言来说,golang的并发编程简单比并发性能更具卖点。 -在当今这个多核时代,并发编程的意义不言而喻。当然,很多语言都支持多线程、多进程编程,但遗憾的是,实现和控制起来并不是那么令人感觉轻松和愉悦。Golang不同的是,语言级别支持协程(goroutine)并发(协程又称微线程,比线程更轻量、开销更小,性能更高),操作起来非常简单,语言级别提供关键字(go)用于启动协程,并且在同一台机器上可以启动成千上万个协程。协程经常被理解为轻量级线程,一个线程可以包含多个协程,共享堆不共享栈。协程间一般由应用程序显式实现调度,上下文切换无需下到内核层,高效不少。协程间一般不做同步通讯,而golang中实现协程间通讯有两种:1)共享内存型,即使用全局变量+mutex锁来实现数据共享;2)消息传递型,即使用一种独有的channel机制进行异步通讯。 +在当今这个多核时代,并发编程的意义不言而喻。当然,很多语言都支持多线程、多进程编程,但遗憾的是,实现和控制起来并不是那么令人感觉轻松和愉悦。Golang不同的是,语言级别支持协程(goroutine)并发(协程又称微线程,比线程更轻量、开销更小,性能更高),操作起来非常简单,语言级别提供关键字(go)用于启动协程,并且在同一台机器上可以启动成千上万个协程。协程经常被理解为轻量级线程,一个线程可以包含多个协程,共享堆不共享栈。协程间一般由应用程序显式实现调度,上下文切换无需下到内核层,高效不少。协程间一般不做同步通讯,而golang中实现协程间通讯有两种:1)共享内存型,即使用全局变量+mutex锁来实现数据共享;2)消息传递型,即使用一种独有的channel机制进行异步通讯。 对比JAVA的多线程和GO的协程实现,明显更直接、简单。这就是GO的魅力所在,以简单、高效的方式解决问题,关键字go,或许就是GO语言最重要的标志。 @@ -47,7 +47,7 @@ Go语言在并发编程方面比绝大多数语言要简洁不少,这一点是 ### 2.2 内存回收(GC) -从C到C++,从程序性能的角度来考虑,这两种语言允许程序员自己管理内存,包括内存的申请和释放等。因为没有垃圾回收机制所以C/C++运行起来速度很快,但是随着而来的是程序员对内存使用上的很谨小慎微的考虑。因为哪怕一点不小心就可能会导致“内存泄露”使得资源浪费或者“野指针”使得程序崩溃等,尽管C++11后来使用了智能指针的概念,但是程序员仍然需要很小心的使用。后来为了提高程序开发的速度以及程序的健壮性,java和C#等高级语言引入了GC机制,即程序员不需要再考虑内存的回收等,而是由语言特性提供垃圾回收器来回收内存。但是随之而来的可能是程序运行效率的降低。 +从C到C++,从程序性能的角度来考虑,这两种语言允许程序员自己管理内存,包括内存的申请和释放等。因为没有垃圾回收机制所以C/C++运行起来速度很快,但是随着而来的是程序员对内存使用上的很谨小慎微的考虑。因为哪怕一点不小心就可能会导致“内存泄露”使得资源浪费或者“野指针”使得程序崩溃等,尽管C++11后来使用了智能指针的概念,但是程序员仍然需要很小心的使用。后来为了提高程序开发的速度以及程序的健壮性,**java和C#等高级语言引入了GC机制**,即程序员不需要再考虑内存的回收等,而是由语言特性提供垃圾回收器来回收内存。但是随之而来的可能是程序运行效率的降低。 GC过程是:先stop the world,扫描所有对象判活,把可回收对象在一段bitmap区中标记下来,接着立即start the world,恢复服务,同时起一个专门gorountine回收内存到空闲list中以备复用,不物理释放。物理释放由专门线程定期来执行。 @@ -92,7 +92,7 @@ GC性能可能随着版本不断更新会不断优化,这块没仔细调研, 在C,C++中,包括其他的一些高级语言是不支持多个函数返回值的。但是这项功能又确实是需要的,所以在C语言中一般通过将返回值定义成一个结构体,或者通过函数的参数引用的形式进行返回。而在Go语言中,作为一种新型的语言,目标定位为强大的语言当然不能放弃对这一需求的满足,所以支持函数多返回值是必须的。 -函数定义时可以在入参后面再加(a,b,c),表示将有3个返回值a、b、c。这个特性在很多语言都有,比如python。 +**函数定义时可以在入参后面再加(a,b,c),表示将有3个返回值a、b、c**。这个特性在很多语言都有,比如python。 这个语法糖特性是有现实意义的,比如我们经常会要求接口返回一个三元组(errno,errmsg,data),在大多数只允许一个返回值的语言中,我们只能将三元组放入一个map或数组中返回,接收方还要写代码来检查返回值中包含了三元组,如果允许多返回值,则直接在函数定义层面上就做了强制,使代码更简洁安全。 @@ -104,10 +104,12 @@ GC性能可能随着版本不断更新会不断优化,这块没仔细调研, 语言交互性指的是本语言是否能和其他语言交互,比如可以调用其他语言编译的库。 -在Go语言中直接重用了大部份的C模块,这里称为Cgo.Cgo允许开发者混合编写C语言代码,然后Cgo工具可以将这些混合的C代码提取并生成对于C功能的调用包装代码。开发者基本上可以完全忽略这个Go语言和C语言的边界是如何跨越的。 +在Go语言中直接重用了大部份的C模块,这里称为Cgo.Cgo允许开发者混合编写C语言代码,然后Cgo工具可以将这些混合的C代码提取并生成对于C功能的调用包装代码。**开发者基本上可以完全忽略这个Go语言和C语言的边界是如何跨越的**。 golang可以和C程序交互,但不能和C++交互。可以有两种替代方案:1)先将c++编译成动态库,再由go调用一段c代码,c代码通过dlfcn库动态调用动态库(记得export LD_LIBRARY_PATH);2)使用swig(没玩过) +问题:go 如何与 Java 交互? grpc? + ### 2.8 异常处理 golang不支持try...catch这样的结构化的异常解决方式,因为觉得会增加代码量,且会被滥用,不管多小的异常都抛出。golang提倡的异常处理方式是: @@ -129,9 +131,9 @@ golang不支持try...catch这样的结构化的异常解决方式,因为觉得 > Go编程规范推荐每个Interface只提供一到两个的方法。这样使得每个接口的目的非常清晰。另外Go的隐式推导也使得我们组织程序架构的时候更加灵活。在写JAVA/C++程序的时候,我们一开始就需要把父类/子类/接口设计好,因为一旦后面有变更,修改起来会非常痛苦。而Go不一样,当你在实现的过程中发现某些方法可以抽象成接口的时候,你直接定义好这个接口就OK了,其他代码不需要做任何修改,编译器的自动推导会帮你做好一切。 -- 不能循环引用:即如果a.go中import了b,则b.go要是import a会报import cycle not allowed。好处是可以避免一些潜在的编程危险,比如a中的func1()调用了b中的func2(),如果func2()也能调用func1(),将会导致无限循环调用下去。 +- 不能循环引用:即如果a.go中import了b,则b.go要是import a会报import cycle not allowed。好处是可以避免一些潜在的编程危险,比如a中的func1()调用了b中的func2(),如果func2()也能调用func1(),将会导致无限循环调用下去。 -- defer机制:在Go语言中,提供关键字defer,可以通过该关键字指定需要延迟执行的逻辑体,即在函数体return前或出现panic时执行。这种机制非常适合善后逻辑处理,比如可以尽早避免可能出现的资源泄漏问题。 +- defer机制:在Go语言中,提供关键字defer,可以通过该关键字指定需要延迟执行的逻辑体,即在函数体return前或出现panic时执行。这种机制非常适合善后逻辑处理,比如可以尽早避免可能出现的资源泄漏问题。 可以说,defer是继goroutine和channel之后的另一个非常重要、实用的语言特性,对defer的引入,在很大程度上可以简化编程,并且在语言描述上显得更为自然,极大的增强了代码的可读性。 @@ -166,7 +168,7 @@ golang不支持try...catch这样的结构化的异常解决方式,因为觉得 - int和int32是两种类型 - 字母大小写设置可见性(letter case sets visibility) - 任何类型(type)都有方法(不是类型) -- 没有子类型继承(不是子类) +- 没有子类型继承(不是子类) - 包级别初始化以及明确的初始化顺序 - 文件被编译到一个包里 - 包package-level globals presented in any order @@ -182,7 +184,7 @@ golang不支持try...catch这样的结构化的异常解决方式,因为觉得 - 没有preincrement(i++)和predecrement - 赋值不是表达式 - 明确赋值和函数调用中的计算顺序(没有“sequence point”) -- 没有指针运算 +- 没有指针运算 - 内存一直以零值初始化 - 局部变量取值合法 - 方法中没有“this” diff --git "a/Day01-15(Go\350\257\255\350\250\200\345\237\272\347\241\200)/day01_\347\254\2545\350\212\202_Go\350\257\255\350\250\200\347\232\204\344\274\230\345\212\277\345\222\214\345\205\266\344\273\226\350\257\255\350\250\200\347\232\204\345\257\271\346\257\224.md" "b/Day01-15(Go\350\257\255\350\250\200\345\237\272\347\241\200)/day01_\347\254\2545\350\212\202_Go\350\257\255\350\250\200\347\232\204\344\274\230\345\212\277\345\222\214\345\205\266\344\273\226\350\257\255\350\250\200\347\232\204\345\257\271\346\257\224.md" index 25272cb..7e46a4c 100644 --- "a/Day01-15(Go\350\257\255\350\250\200\345\237\272\347\241\200)/day01_\347\254\2545\350\212\202_Go\350\257\255\350\250\200\347\232\204\344\274\230\345\212\277\345\222\214\345\205\266\344\273\226\350\257\255\350\250\200\347\232\204\345\257\271\346\257\224.md" +++ "b/Day01-15(Go\350\257\255\350\250\200\345\237\272\347\241\200)/day01_\347\254\2545\350\212\202_Go\350\257\255\350\250\200\347\232\204\344\274\230\345\212\277\345\222\214\345\205\266\344\273\226\350\257\255\350\250\200\347\232\204\345\257\271\346\257\224.md" @@ -28,7 +28,7 @@ 3、如何解决当前的问题和痛点? -- Go希望成为互联网时代的C语言。多数系统级语言(包括Java和C#)的根本编程哲学来源于C++,将C++的面向对象进一步发扬光大。但是Go语言的设计者却有不同的看法,他们认为值得学习的是C语言。C语言经久不衰的根源是它足够简单。因此,Go语言也是足够简单。 +- Go希望成为互联网时代的C语言。多数系统级语言(包括Java和C#)的根本编程哲学来源于C++,将C++的面向对象进一步发扬光大。但是Go语言的设计者却有不同的看法,他们认为值得学习的是C语言。C语言经久不衰的根源是它足够简单。因此,Go语言也是足够简单。 - 所以,他们当时设计Go的目标是为了消除各种缓慢和笨重、改进各种低效和扩展性。Go是由那些开发大型系统的人设计的,同时也是为了这些人服务的;它是为了解决工程上的问题,不是为了研究语言设计;它还是为了让我们的编程变得更舒适和方便。 - 但是结合Google当时内部的一些现实情况,如很多工程师都是C系的,所以新设计的语言一定要易学习,最好是类似C的语言;20年没有出新的语言了,所以新设计的语言必须是现代化的(例如内置GC)等情况。最后根据实战经验,他们向着目标设计了Go这个语言。 @@ -37,7 +37,7 @@ 4、Go语言的特色: -- 没有继承多态的面向对象 +- 没有继承多态的面向对象 - 强一致类型 - interface不需要显式声明(Duck Typing) - 没有异常处理(Error is value) @@ -60,7 +60,7 @@ 2、效率:快速的编译时间,开发效率和运行效率高 -​ 开发过程中相较于 Java 和 C++呆滞的编译速度,Go 的快速编译时间是一个主要的效率优势。Go拥有接近C的运行效率和接近PHP的开发效率。 +​ 开发过程中相较于 Java 和 C++呆滞的编译速度,Go 的快速编译时间是一个主要的效率优势。Go拥有接近C的运行效率和接近PHP的开发效率。 ![](img/golang2.png)