![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Golang
草明
这个作者很懒,什么都没留下…
展开
-
Otter Go 语言编写的非竞争式缓存库
Otter 是一个用 Go 语言编写的非竞争式缓存库,旨在提供高效的缓存解决方案。原创 2024-08-09 15:30:37 · 1104 阅读 · 0 评论 -
Golang 程序进程信号汇总
SIGABRT:异常终止,如 abort() 发出。SIGALRM:实时定时器超时。SIGBUS:硬件错误。SIGCHLD:子进程状态改变。SIGCONT:如果进程停止,则继续运行,否则忽略。SIGEMT:模拟器陷阱。SIGFPE:浮点异常。SIGHUP:挂起,通常是因为终端断线。SIGILL:非法指令。SIGINFO:信息请求。SIGINT:终端中断。SIGIO:I/O 可能已经就绪。SIGIOT:IOT 陷阱,通常由 abort() 产生。SIGKILL:终止,这个信号不能被原创 2024-01-29 08:45:00 · 439 阅读 · 0 评论 -
Golang 运行和管理命令
有时候我们要在程序里面运行一个程序, 并对其进行管理.以下是部分经验分享.原创 2024-01-28 04:00:00 · 883 阅读 · 0 评论 -
Go-Buffer的那些事
Len() 未读长度Cap() 容量长度Truncate() 截断, 参数是指保留未读部分的头部多少字节, 后面的部分就丢掉了. 读过的部分不会丢,扩容的时候, 拷贝的是未读部分, 计数从0开始package mainimport ( "bytes" "fmt")func main() { var buffer bytes.Buffer buffer.WriteString("0123456789") fmt.Println(buffer.Len(), buffer.Cap.原创 2022-02-11 16:33:35 · 502 阅读 · 0 评论 -
Go-字符串的那些事
string:不可变的副本不用拷贝, 使用同一个底层数组strings.Builder已存在内容不可变可以拼接减少内存分配和内容拷贝可以重置内容, 可以重用不可以复制(赋值,函数传递)后再使用其方法可以复制指针, 但是要解决并发安全的问题Grow() 扩容, 如果容量够就不扩容Reset() 重置strings.ReaderLen() 未读数据长度Size() 数据总长度Seek(offset int64, whence int)offset - 从 whe.原创 2022-02-11 12:09:17 · 308 阅读 · 0 评论 -
Go-编码和占位符的那些事
range string 索引不一定连续%T 类型%v 值的默认格式%+v 打印结构体时, 会添加字段名%#v Go 语法表示%p 指针%t bool 类型值整数%b 二进制表示%c 字符%d 十进制%o 八进制%q 单引号字符%x 十六进制, a-f%X 十六进制, A-F%U Unicode格式, U+浮点数/复数%b 无小数部分的,指数为二的幂的科学计数法%e 科学计数法%E 科学计数法%f 有小数%g %e或%f 紧..原创 2022-02-10 17:40:18 · 365 阅读 · 0 评论 -
Go-并发安全字典
sync.Map一个 read 字典, 一个 dirty 字典read 的键值对不一定全, dirty 的总是完全的(不包括被删除的键值对)适合读多写少的场景性能影响从大到小: 新增, 删除, 修改自己定义结构体, 明确键值类型通过反射实现一个统一的类型上代码, 自己品:package mainimport ( "fmt" "reflect")func main() { var i int var list []string fmt.Println("int .原创 2022-02-10 16:25:40 · 2396 阅读 · 0 评论 -
Go-Pool 的那些事
临时对象:不需要持久使用的某一类值对程序来说可有可无, 如果有会更好创建和销毁可以在任何时候发生, 完全不会影响程序的功能无需被区分, 可以互相替代上代码, 自己品:package mainimport ( "fmt" "sync" "time")type Person struct { Index int}func (self *Person) Print() { fmt.Printf("index=%d\n", self.Index)}func main(原创 2022-02-08 16:26:33 · 389 阅读 · 0 评论 -
Go-context的那些事
Background()WithCancel()WithDeadline()WithTimeout()WithValue()上代码, 自己品:package mainimport ( "context" "fmt" "sync/atomic")func main() { const count int32 = 10 var num int32 ctx, cancelFunc := context.WithCancel(context.Background()) for.原创 2022-02-08 15:47:34 · 303 阅读 · 0 评论 -
Go-waitGroup的那些事
Add() 和 Wait() 最好不要放在不同的 goroutine, 避免并发执行.同一个 Once 实例调用多次 Do 方法, 只有一个函数会被调用, 但是其他的函数会阻塞, 等待 Unlock.上代码, 自己品:package mainimport ( "fmt" "sync")func main() { var wg sync.WaitGroup wg.Add(2) go func() { defer wg.Done() fmt.Println(1) }().原创 2022-02-08 14:54:18 · 330 阅读 · 0 评论 -
Go-原子操作的那些事
sync/atomic 原子操作有:加法(add)比较并交换(compare and swap,简称 CAS)加载(load)存储(store)交换(swap)sync/atomic包支持原子操作的数据类型有:int32int64uint32uint64uintptrunsafe包中的Pointer 没有(Add)sync/atomic.Value:不能存储nil存储的值的类型要一样尽量不要存储引用类型上代码, 自己品:package mainimport原创 2022-02-08 12:37:17 · 110 阅读 · 0 评论 -
Go-条件变量的那些事
Wait():把当前的 goroutine 加入当前条件变量的通知队列.解锁当前条件变量基于的互斥锁. 所以 wait 前必须加锁.当前 goroutine 阻塞在 wait()通知到来并唤醒了当前 goroutine 后解锁当前条件变量基于的互斥锁执行后面的代码Signal()Broadcast上代码, 自己品:package mainimport ( "fmt" "sync" "time")type MailBox struct { count .原创 2022-02-08 11:53:21 · 278 阅读 · 0 评论 -
Go-互斥锁的那些事
对于互斥锁:不要重复锁没锁不要解锁不要赋值/函数间传递/函数返回锁定, 紧接着 defer 解锁对于读写锁:读锁 + 读锁 不阻塞其他都阻塞上代码, 自己品:package mainimport ( "fmt" "sync" "time")var i = 0func count() int { i++ return i}func main() { var locker sync.Mutex for i := 0; i < 10; i++ {原创 2022-02-08 09:23:55 · 217 阅读 · 0 评论 -
Go-测试的那些事
清除缓存:go clean -cache 清除所有缓存go clean -testcache 清除测试成功结果的缓存, 不清楚构建的缓存export GODEBUG=gocacheverify=1 绕过任何缓存数据go test:-run= 没有时, 执行所有的功能测试函数. 有时, 赋值功能测试函数的名称, 可使用正则表达式-bench= 没有时, 不执行性能测试函数. 有时, 赋值性能测试函数的名称, 可使用正则表达式-cpu= 最大 P 数量, 同时运行 goroutine 的逻辑原创 2022-02-07 17:24:00 · 452 阅读 · 0 评论 -
Go-chan 那些事
通道中没有数据, 接收数据会阻塞, 可以用第二个参数解决发送超过通道容量会阻塞select 没有 default 会阻塞, 有 default 不会阻塞select 语句最多只会有一个 case 命中通道关闭了, 可以收数据, 不可以发数据上代码, 自己品:package mainimport "fmt"func main() { ch := make(chan int) // 无缓存通道 // 阻塞在发送语句 ch <- 2 // fatal error: all g.原创 2022-02-07 11:41:40 · 250 阅读 · 0 评论 -
Go-panic-defer-recover那些事
如果发生了 panic, 程序就会抛出运行时异常, 并退出程序panic 有可能是非法操作导致的, 也可以主动通过 panic() 抛出defer 后的函数会在上一层的函数执行完成后执行recover 可以恢复 panic, 并不退出程序recover 要配合 defer 一起使用上代码, 自己品package mainimport "fmt"func main() { list := []int{1, 2, 3} fmt.Println(list[len(list)]) // .原创 2022-02-04 18:13:53 · 269 阅读 · 0 评论 -
Go-错误那些事
可以参考Go 的错误处理或者一些第三方库的错误处理方式.自定义错误类型扁平的错误码也可以根据业务, 通过结构体的属性, 在结构体的成员方法中处理, 在调用处, 可以减少错误判断.上代码, 自己品:package mainimport ( "errors" "fmt")// 错误在最后一个参数返回func echo(request string) (response string, err error) { if request == "" { err = errors.N原创 2022-02-04 15:31:43 · 317 阅读 · 0 评论 -
Go-控制语句那些事
for range 循环的副本switch 中的 case 语句常量(表达式值)不可以重复上代码, 自己品package mainimport "fmt"func main() { list := []int{1, 2, 3, 4, 5, 6, 7, 8, 9} for i := range list { if i == 3 { list[i] |= i } } fmt.Println(list) // [1 2 3 7 5 6 7 8 9]}package .原创 2022-01-30 13:35:33 · 1098 阅读 · 0 评论 -
Go-goroutine 的那些事
上代码, 自己品package mainimport "fmt"func main() { // 不会打印任何内容, 因为代码执行完, 主 goroutine 就退出了. 其他的 goroutine 还没有机会执行, 程序就结束了 for i := 0; i < 10; i++ { go func() { fmt.Println(i) }() }}package mainimport ( "fmt" "time")func main() { // 可原创 2022-01-26 19:54:01 · 202 阅读 · 0 评论 -
Go-指针的那些事
不可寻址的值:常量的值。基本类型值的字面量。算术操作的结果值。对各种字面量的索引表达式和切片表达式的结果值。不过有一个例外,对切片字面量的索引结果值却是可寻址的。对字符串变量的索引表达式和切片表达式的结果值。对字典变量的索引表达式的结果值。函数字面量和方法字面量,以及对它们的调用表达式的结果值。结构体字面量的字段值,也就是对结构体字面量的选择表达式的结果值。类型转换表达式的结果值。类型断言表达式的结果值。接收表达式的结果值。规律:不可变的 - 寻址没有意义, 不能改临时结果原创 2022-01-26 18:47:41 · 157 阅读 · 0 评论 -
Go-接口的那些事
收者是 T成员方法/属性的调用者可以是 T 和 *T接口的动态类型可以是 T 和 *T接收者是 *T成员方法/属性的调用者可以是 T 和 *T接口的动态类型可以只能是 *T接口的动态类型是 nil, 接口不是nil接口的动态类型是 nil, 不可以调用动态类型的属性上代码, 自己品package mainimport "fmt"type Pet interface { Name() string}type Dog struct { name string.原创 2022-01-26 16:28:15 · 236 阅读 · 0 评论 -
goproxy.io 证书过期
如果出现以下错误x509: certificate has expired or is not yet valid: current time is after 2021-09-25t00:00:00z里面明显 https 的网址被修改了, 例如 github.com 被改成了 https://goproxy.io/github.com, 这是使用了 go 的代理.排查问题:重启电脑, 然后执行 go env go env | grep GOPROXY. 应该有 goproxy.io查找配置,原创 2021-10-11 17:56:38 · 868 阅读 · 0 评论 -
Go mod 依赖私有 Git 仓库的库
自建私有仓库, 通常不用 http/https 拉代码的, 使用 ssh 的方式. 首先我们会配置 ssh key, 免密操作 git.在 go mod 里面配置的 module 通常是使用域名的, git 仓库可以通过域名正常使用就可以了. 如果不行, 我们配置一下 ~/.ssh/config 就可以了.以下案例假设 git 仓库的域名是 gitlab.xxx.com, 使用的是 https 协议, go mod 是 gitlab.xxx.com/aa/module_name1. 接下来需要配置几个原创 2021-08-17 11:17:56 · 2503 阅读 · 0 评论 -
Golang Protobuf 处理
Golang Protobuf1. 定义协议文件 .protosyntax = 'proto3';package proto;import "google/protobuf/timestamp.proto";option go_package = "../proto_gen";message Person { string name = 1; int32 id = 2; string email = 3; enum PhoneType {原创 2021-08-16 15:13:07 · 819 阅读 · 0 评论 -
[GIN-debug] redirecting request 307
Go Gin 请求遇到错误:[GIN-debug] redirecting request 307:有一个原因是因为路径的问题. 例如 Gin 的 url 是 /a/b/, 如果客户端发送的请求是 /a/b 就会出现这个问题(但是 Postman 是不会出错的).客户端要和 Gin 的路径一模一样, 就可以解决尤其是使用 group() 的时候要多注意一点....原创 2021-05-08 12:11:29 · 3543 阅读 · 0 评论 -
Go Gin 获取 Get 请求中 url 带过来的参数
获取 Get 请求中 url 带过来的参数可以通过 c.Query() 获取单个参数的值, 并且是 string 类型的. 比较麻烦, 还要自己转换类型.可以使用 c.ShouldBind 来获取参数, 并设置到一个结构体中. 但是需要注意的是: 结构体中的元数据,不是使用 json, 而是 formtype ABC struct { Code int `form:"code"` }当发送请求get xxxx/xxxx?code=123, 就可以获取到参数 code 了var原创 2021-04-21 11:26:40 · 2059 阅读 · 0 评论 -
Golang - sqlx -MySQL 查询数据库, NULL值报错
在 Golang 中使用 sqlx 对 MySQL 的查询时, 如果数据库中某个字段的值是 NULL, 对应的结构体里面的字段类型是 int64, 就会报以下错误:converting null to int64 is unsupporteddatabase/sql 包里面有一个 NullInt64 类型:// NullInt64 represents an int64 that may be null.// NullInt64 implements the Scanner interface s原创 2021-04-14 08:52:33 · 1471 阅读 · 0 评论 -
golang mysql 查询错误:sql: Scan error on column index 2, name “created_at“: unsupported Scan, storing dr
golang sqlx 对 mysql 进行查询的时候, 出现错误:sql: Scan error on column index 2, name "created_at": unsupported Scan, storing driver.Value type []uint8 into type *time.Time解救有方案:在创建连接的地址后面添加 ?parseTime=truedb, err := sqlx.Connect("mysql", "myuser:mypass@tcp(127.0.原创 2021-03-01 11:01:32 · 5480 阅读 · 0 评论