
获得徽章 0
赞了这篇文章
赞了这篇文章
day10 今天学习并发编程实战
goroutine 指协程,比线程要更轻量级
chan/channel 指管道,多用于多个 goroutine 之间通信
goroutine 指协程,比线程要更轻量级
chan/channel 指管道,多用于多个 goroutine 之间通信
评论
点赞
DAY9 今天学习gRPC 负载均衡,根据实现所在的位置不同,分为三种方式:
1、集中式LB(Proxy Model)
2、进程内LB(Balancing-aware Client)
3、独立 LB 进程(External Load Balancing Service)
1、集中式LB(Proxy Model)
2、进程内LB(Balancing-aware Client)
3、独立 LB 进程(External Load Balancing Service)
展开
评论
点赞
DAY8 今天学习 go 单元测试
go test 参数说明:
-bench regexp 执行相应的 benchmarks,例如:-bench=.
-cover 可以查看覆盖率
-run regexp 只运行 regexp 匹配的函数,例如:-run Array 那么就执行包含有 Array 开头的函数,该参数支持通配符 *,和部分正则表达式,例如 ^、$
-v 显示测试的详细信息
go test 参数说明:
-bench regexp 执行相应的 benchmarks,例如:-bench=.
-cover 可以查看覆盖率
-run regexp 只运行 regexp 匹配的函数,例如:-run Array 那么就执行包含有 Array 开头的函数,该参数支持通配符 *,和部分正则表达式,例如 ^、$
-v 显示测试的详细信息
展开
评论
点赞
赞了这篇沸点
DAY7 今天看golang包管理教程,新的管理方式主要有以下优点:
1.自动下载依赖包
2.项目不必放在GOPATH/src内了
3.项目内会生成一个go.mod文件,列出包依赖
4.所以来的第三方包会准确的指定版本号
5.对于已经转移的包,可以用replace 申明替换,不需要改代码
注意:子目录里是不需要init的,所有的子目录里的依赖都会组织在根目录的go.mod文件里
依赖的第三方包被下载到了$GOPATH/pkg/mod路径下。
1.自动下载依赖包
2.项目不必放在GOPATH/src内了
3.项目内会生成一个go.mod文件,列出包依赖
4.所以来的第三方包会准确的指定版本号
5.对于已经转移的包,可以用replace 申明替换,不需要改代码
注意:子目录里是不需要init的,所有的子目录里的依赖都会组织在根目录的go.mod文件里
依赖的第三方包被下载到了$GOPATH/pkg/mod路径下。
展开
评论
点赞
DAY6今天看go module 环境配置
Golang推荐使用go mod管理依赖,而默认GoPROXY配置是:GOPROXY=
proxy.golang.org,direct,国内访问不到,所以推荐使用
goproxy.io或
goproxy.cn。
配置完后使用go env来查看配置是否成功
Golang推荐使用go mod管理依赖,而默认GoPROXY配置是:GOPROXY=
配置完后使用go env来查看配置是否成功
评论
点赞
DAY5今天看Golang 零值(The zero value)、空值(nil)和空结构(The empty struct)
1.零值是指当你声明变量(分配内存)并未显式初始化时,始终为你的变量自动设置一个默认初始值的策略。
对于值类型:布尔类型为 false, 数值类型为 0,字符串为 "",数组和结构会递归初始化其元素或字段,即其初始值取决于元素或字段。
对于引用类型: 均为 nil,包括指针 pointer,函数 function,接口 interface,切片 slice,管道 channel,映射 map。
下面的情况需要特别注意下,有时候不注意就容易混淆,:= 语法糖是声明并且初始化变量的,所以是一个真正的实例(为其分配了内存地址的),并不是零值 nil
2.nil 是 Golang 中预先声明的标识符(非关键字保留字),其主要用来表示引用类型的零值(指针,接口,函数,映射,切片和通道),表示它们未初始化的值。
注明的nil!=nil问题:
请注意:为了避免此问题,返回错误时请永远使用 error 接口,并且永远不要初始化可能从函数返回的空错误变量。
对于接口,判断nil,可以分别将类型和值分别和 nil 比较或者使用反射包 reflect。
var p *int // (T=*int, V=nil)
fmt.Println(p == nil) // true
这是因为在进行上面的比较时,因为编译器已经清楚的知道了 p 的类型,所以编译器可以转化为 p == (*int)(nil)。但是对于接口,编译器是没法确定底层类型的,因为它是可以被更改的。
3.空结构是没有任何字段的结构类型
可以使用 chan struct{} 代替 chan bool 在 goroutines 之间传递信号
为了防止 unkeyed 初始化结构,可以添加 _ struct {} 字段:type Q struct {
X, Y int
_ struct{} 这样一来,使用 Q{X: 1, Y: 1} 可以,但使用 Q{1, 1} 就会出现编译错误,同时这样也帮助了 go ver 代码检查。
1.零值是指当你声明变量(分配内存)并未显式初始化时,始终为你的变量自动设置一个默认初始值的策略。
对于值类型:布尔类型为 false, 数值类型为 0,字符串为 "",数组和结构会递归初始化其元素或字段,即其初始值取决于元素或字段。
对于引用类型: 均为 nil,包括指针 pointer,函数 function,接口 interface,切片 slice,管道 channel,映射 map。
下面的情况需要特别注意下,有时候不注意就容易混淆,:= 语法糖是声明并且初始化变量的,所以是一个真正的实例(为其分配了内存地址的),并不是零值 nil
2.nil 是 Golang 中预先声明的标识符(非关键字保留字),其主要用来表示引用类型的零值(指针,接口,函数,映射,切片和通道),表示它们未初始化的值。
注明的nil!=nil问题:
请注意:为了避免此问题,返回错误时请永远使用 error 接口,并且永远不要初始化可能从函数返回的空错误变量。
对于接口,判断nil,可以分别将类型和值分别和 nil 比较或者使用反射包 reflect。
var p *int // (T=*int, V=nil)
fmt.Println(p == nil) // true
这是因为在进行上面的比较时,因为编译器已经清楚的知道了 p 的类型,所以编译器可以转化为 p == (*int)(nil)。但是对于接口,编译器是没法确定底层类型的,因为它是可以被更改的。
3.空结构是没有任何字段的结构类型
可以使用 chan struct{} 代替 chan bool 在 goroutines 之间传递信号
为了防止 unkeyed 初始化结构,可以添加 _ struct {} 字段:type Q struct {
X, Y int
_ struct{} 这样一来,使用 Q{X: 1, Y: 1} 可以,但使用 Q{1, 1} 就会出现编译错误,同时这样也帮助了 go ver 代码检查。
展开
评论
点赞
DAY4 今天看Go Web开发入门指南。了解了Go Web开发套装主要包括Gin,Gorm,viper,validator,zap,go-redis,grpc
评论
点赞
DAY3 今天开始阅读打卡,首先是第一篇文章,介绍了几个第三方开源库。
1.net/http -> fasthttp 对比 net/http 由于它复用 了goroutine,可以减轻 runtime 调度压力 但是他与官方库的api接口有所不同
2.encoding/json -> jsoniter 官方称 Golang 版本可以比标准库(encoding/json)快 6 倍之多。与标准库encoding/json完全兼容。
3.golang/protobuf -> gogo/protobuf
ProtoBuf 的全称是 Protocol Buffers,它是由 Google 开发和定义的与 XML、JSON 类似的一种协议格式,用于高效存储与读取结构化数据。它基于二进制,因此使用 ProtoBuf 能将数据压缩得更小。
4.html/template -> valyala/quicktemplate
quicktemplate启发自 Python 的 Mako 项目,是一个快速、强大且易于使用的 Go 模板渲染引擎,quicktemplate会先将编写的模板代码转换为 Go 语言代码,再进行编译渲染。因此,它比标准库html/template快 20 倍以上。
需要注意:在使用官方库时遇到了问题,我们很容易通过搜索引擎找到解决方案,或者直接向 Go 官方提 issue 。当切换为开源库时,如果遇到了问题,并不一定能及时得到处理。
官方库的 API 几乎可以保证能与 Go 版本的迭代一直兼容,而三方库可能存在潜在的版本兼容问题,这也是切换时需要考虑的问题。
本文列出来的几个开源库,它们的重点都是优化对应官方库的性能问题。我们可以从这些开源库中,学到很多实用的 Go 代码优化技巧。
1.net/http -> fasthttp 对比 net/http 由于它复用 了goroutine,可以减轻 runtime 调度压力 但是他与官方库的api接口有所不同
2.encoding/json -> jsoniter 官方称 Golang 版本可以比标准库(encoding/json)快 6 倍之多。与标准库encoding/json完全兼容。
3.golang/protobuf -> gogo/protobuf
ProtoBuf 的全称是 Protocol Buffers,它是由 Google 开发和定义的与 XML、JSON 类似的一种协议格式,用于高效存储与读取结构化数据。它基于二进制,因此使用 ProtoBuf 能将数据压缩得更小。
4.html/template -> valyala/quicktemplate
quicktemplate启发自 Python 的 Mako 项目,是一个快速、强大且易于使用的 Go 模板渲染引擎,quicktemplate会先将编写的模板代码转换为 Go 语言代码,再进行编译渲染。因此,它比标准库html/template快 20 倍以上。
需要注意:在使用官方库时遇到了问题,我们很容易通过搜索引擎找到解决方案,或者直接向 Go 官方提 issue 。当切换为开源库时,如果遇到了问题,并不一定能及时得到处理。
官方库的 API 几乎可以保证能与 Go 版本的迭代一直兼容,而三方库可能存在潜在的版本兼容问题,这也是切换时需要考虑的问题。
本文列出来的几个开源库,它们的重点都是优化对应官方库的性能问题。我们可以从这些开源库中,学到很多实用的 Go 代码优化技巧。
展开
评论
点赞