今天是我参加青训营的第二天
复习了昨天写的实战代码,因为json方面不是很懂,所以跳来跳去,搜了很多关于json的资料,Json其实就是一个用机器解析和生成Key- value结构数据类型的序列。GO里面用到jason函数会自动生成包,课程里面举到的例子是用json转化结构体为json序列用了json.Marshal函数,非常方便。 有些不好理解的就是他这里的写法,也算是一种习惯吧。就是 “变量名”,err∶=的这种命名习惯,后面跟的if判断,其实就是判断json是否为空,nil相当于null是空的意思,这个理解了之后就非常容易上手实时翻译的项目。老师也提供了两个很有意思的小工具,第一个是把crul转成go。第二个是把jason转化为结构体。大大减少了我们书写代码的麻烦。代码我看的老师的,这里就不放了,兄弟们自己去下载好了
今天学习的新内容是go语言进阶与依赖管理,首先讲了并发和并行的区别,其实就是一核和多核的区别。然后是线程和协程的区别,线程属于内核态。切换,需要消耗大量的资源,而协程就不用。协程,你可以把它理解成轻量级的一个线程。go本身的语法就可以完成,而且go一次可以创建大概上万个左右的协程。那怎么在go里使用协程呢,只要在调用函数的前面加一个go就可以了,我把课程的代码补全了。
package main
import (
"fmt"
"time"
)
func hello(i int) {
println("hello goroutine:" + fmt.Sprint(i))
}
func hellogoroutine() {
for i := 0; i < 5; i++ {
go func(j int) {
hello(j)
}(i)
}
time.Sleep(time.Second)
}
func main() {
hellogoroutine()
}
Channel用法自如其名,很好理解,重要的还是代码里面有一个defer关键词我不认识,所以搜了一下,这是go语言的关键字,被defer修饰的func可以按照先进后出的规则,在成功打开文件之后,无论后边程序能否正常运行,在退出前都能够将文件资源释放,可以避免出现死锁问题。每个defer的调用只与当前协程有关,与其他协程无关,所以很好的用作资源释放。顺带提一下,panic这个关键字,这个关键字是用来捕获异常的,比如说除零数组越界,还有对空指针取值这些异常,导致程序退出的时候,我们可以捕获这些异常,然后让程序正常执行,用起来也很简单,直接panic加括号就行了。
package main
func CalSquare() {
src := make(chan int)
dest := make(chan int, 3)
go func() {
defer close(src)
for i := 0; i < 10; i++ {
src <- i
}
}()
go func() {
defer close(dest)
for i := range src {
dest <- i * i
}
}()
for i := range dest {
//复杂操作
println(i)
}
}
func main() {
CalSquare()
}
接下来介绍go依赖管理的方案,首先是够的环境变量go path,相信大家在安装go的时候已经配置过了。这里老师说了要站在巨人的肩膀上,让大家都深有体会。我们程序员就是要站在巨人的肩膀上,追求工作效率。Go pas里面包括三个基本文件,bin里面装的是项目编译的二进制文件。pkg里面是项目编译的中间产物,加速编译。src相信大家都很熟悉,里面装的就是源代码,项目代码直接依赖src下的代码,Go get下载最新版本的包到src目录下。但是它存在一个问题,就是无法实现package的多版本控制。怎么解决呢?可以在项目目录下增加vendor文件,vendor文件可以通过每个项目引入一份依赖的副本,解决了多个项目需要同一个package依赖的冲突问题。但是他同样也存在问题也是依赖于源码,对于版本的清晰没有一个明确的概念,会导致无法控制依赖的版本,也会导致更新项目又可能出现依赖冲突,导致编译出错。最后我们引入go.mod,通过model的文件管理依赖包版本,最终可以达到定义版本规则和管理项目的依赖关系,问题完美解决。
依赖管理的三要素
一,配置文件描述依赖 go.mod
二,中心仓库管理依赖库 Proxy
三,本地工具 go get/mod
后面老师详细教了大家如何配置,就不过多赘述了。
视频的最后讲了依赖分发问题,我们想要从网上查找一些先前的项目或者软件,我们该去哪里下载?如何去下载?很多同学都通过第三方软件码云等,但是无法保证依赖的可用性,而且无法保证构建的稳定性。于是介绍了一个依赖分发的工具proxy,Proxy相当于一份备份,可以直接拉取依赖,从而保证代码的稳定和可靠。
这篇文章就发表到这了,欢迎大家相互交流,批评指正!!!