Go
文章平均质量分 69
Go采坑与心得
浩骞
做同样的事情,时间不一样,心情不一样,结果也不一样,不忘初衷才能有所收获
展开
-
Go 根据 数据库中表字段/Json 快速生成结构体
当需要使用数据库查询,或者调用第三方接口返回json数据时,是不是经常需要自定义struct 结构体进行映射。但是在定义golang结构体的时候是不是会感觉特别浪费时间,而且还经常会应为大意而导致出错?那么接下来的两个工具将会为你的结构体定义提供“革命性”的解决方法;1 JSON-To-Stuct 工具生成JSON数据映射的结构体在线工具 https://mholt.github.io/json-to-go/这个在线工具使用起来非常简单,只需要将JSON数据粘贴在左边,就会在右边自动成生成对应原创 2021-08-09 00:00:17 · 4665 阅读 · 0 评论 -
Go channel的使用场景与注意项
目录1 信号通知2 执行任务超时3 生产消费模型4 数据传递5 控制并发数6 自定义互斥锁注意channel 的哪些操作会引发 panic?1 关闭一个 nil 值的 channel 会引发 panic2 关闭一个已关闭的 channel 会引发 panic3 向一个已关闭的 channel 发送数据1 信号通知经常会有这样的场景,当信息收集完成,通知下游开始计算数据:import ( "log" "time")func main() { isOver := make(chan stru转载 2021-01-25 10:54:26 · 1002 阅读 · 0 评论 -
Golang 时间操作与处理
目录1 获取时间相关函数1.1 获取当前时间1.2 获取当前年月日时分秒、星期几、一年中的第几天等1.3 格式化时间2 时间戳与日期字符串相互转化2.1 秒数、纳秒时间戳 ==> time.Time类型2.2 指定时间 ==> time.Time类型2.3 日期字符串 ==> time.Time类型3 日期计算、比较3.1 24小时之内的时间计算3.2 24小时之外的时间计算3.3 日期比较4 常见的封装。4.1 日期格式 ==> 时间戳4.2 获取当前时间日期格式4.3原创 2021-01-15 09:49:41 · 1362 阅读 · 0 评论 -
Golang 统一封装响应结-方便管理
响应结果封装之前以Gin框架为例,在使用 gin 开发接口的时候,返回接口数据是这样写的。import "github.com/gin-gonic/gin"func main() { engine := gin.Default() //GET请求 http://localhost:8888/hello engine.GET("/hello", func(c *gin.Context) { //返回状态 + json对象(常用) c.JSON(http.StatusOK, gin..原创 2021-01-08 14:22:50 · 4625 阅读 · 0 评论 -
Go 错误堆栈信息之 CockroachDB errors 库
目录1. Go 标准库 errors 太简单2. CockroachDB错误处理库2.1 CockroachDB 新建堆栈错误2.2 CockroachDB 添加错误上下文前缀1.3. CockroachDB 次要错误总结1. Go 标准库 errors 太简单由 fmt.Errorf() 构造的 Go 中最常见的“简单”错误对象类似于带有错误接口的包含在结构中的字符串:其 Error() 方法返回构造错误时设置的字符串。// Go 标准库 errors// 使用 fmt.Errorf() 构原创 2020-12-31 11:38:42 · 619 阅读 · 0 评论 -
Go 协程通信channel 的内部实现原理
大多数的编程语言的并发编程模型是基于线程和内存同步,而Golang 的并发编程的模型则用 goroutine 和 channel 来替代,groutine用于执行并发任务,channel用于并发控制以及goroutine的通信。这次跟随一个demo探索一下channel底层的奥秘。channel数据结构type hchan struct { // chan里元素数量 qcount uint // chan维护的数组的长度 dataqsiz uint // 维护的数组的指转载 2020-10-10 16:47:50 · 631 阅读 · 0 评论 -
Go 利用channels实现协程数据通信的坑
Go 并发性是 通过 channels 建立在CSP 上的,它使用 channel 使得协调 goroutines 比在共享数据上同步更简单和安全。老话说的是「不要通过共享内存来通信;而应该通过通信来共享内存」。Go 没办法获得不可变的数据结构。这意味着一旦我们在 channel 上发送一个指针,就gameover: 因为在并发进程之间共享了可变的数据,就会导致数据的混乱当然,一个 channel 的结构是赋值 channel 传送的值(而不是指针),但是我们一定要保证发送给channel的是不可变的数原创 2020-10-10 15:12:59 · 505 阅读 · 0 评论 -
Go 切片slice复制的陷阱 - 底层数组重新分配内存和大小
切片带来了很多问题,考虑到性能原因,将一个切片进行切片,不会复制底层的数组。这意味着切片的子切片只是遵循原始切片变化的视图。因此,如果想要将它与初始的切片分开请不要忘记 使用copy(from_slice, to_slice)。对于 append 函数,忘记 copy() 会变得更加危险:如果原始切片没有足够的容量来保存新值,底层数组将会重新分配内存和大小。这意味着 append 的结果能不能指向原始数组取决于它的初始容量。这会导致难以发现的不确定 bugs。在下面的代码中,我们看到为子切片追原创 2020-10-10 15:03:15 · 1224 阅读 · 0 评论 -
Go 结构体struct浅复制的坑 - 指针引用
在 Go 中没有定义不可变结构的方法:struct 字段是可变的,const 关键字不适用于它们。Go 通过简单的赋值就可以轻松地复制整个struct,因此,我们可能认为,通过值传递参数来保证不变性,只需要付出复制的代价。然而,它不复制指针引用的值。而且由于内置的集合(map、slice 和 array)是引用和可变的,复制包含其中任意一项的 struct 只是复制了指向底层的指针。下面的例子说明了这个问题:type S struct { A string B []string}func原创 2020-10-10 14:36:29 · 1308 阅读 · 0 评论 -
Golang 字符串与日期互转 + 服务器时区问题
日期转字符串// 格式化// golang中格式不是‘yyyy-MM-dd HH:mm:ss’,而是采用golang诞生时间作为格式t = "2006-01-02 15:04:05" time := time.Now()fmt.Println(time.Format(t))详细链接:https://www.jianshu.com/p/d853d1d42076字符串转日期golang默认采用UTC,即Unix标准时间。而一般情况下,我们存数据库采用的是中国时间,即CST。UTC和CST一原创 2020-08-13 09:34:19 · 3891 阅读 · 0 评论 -
Go 自定义结构体切片排序
实现 sort 包下接口的三个方法的结构体可以调用方法进行排序Len() intLess(i, j int) boolSwap(i, j int)// Package sort provides primitives for sorting slices and user-defined// collections.package sort// A type, typically a collection, that satisfies sort.Interface can be// .原创 2020-08-07 15:06:37 · 2264 阅读 · 0 评论 -
Go 编译器检测类型是否实现指定接口
待更新原创 2020-08-07 14:45:13 · 506 阅读 · 0 评论 -
Go struct(结构体)值接收者和指针接收者的区别
对于结构体方法能给用户自定义的类型(结构体)添加新的行为。它和函数的区别在于方法有一个接收者,给一个函数添加一个接收者,那么它就变成了方法。接收者可以是值接收者,也可以是指针接收者。在调用方法的时候:值类型既可以调用值接收者的方法,也可以调用指针接收者的方法;指针类型既可以调用指针接收者的方法,也可以调用值接收者的方法。也就是说,不管方法的接收者是什么类型,该类型的值和指针都可以调用,不必严格符合接收者的类型。看个例子:package mainimport "fmt"type转载 2020-08-07 14:37:56 · 2035 阅读 · 2 评论 -
go mod 包管理工具使用
常用命令go mod init # 初始化go.modgo mod tidy # 更新依赖文件go mod download # 下载依赖文件go mod vendor # 将依赖转移至本地的vendor文件go mod edit # 手动修改依赖文件go mod graph # 打印依赖图go mod verify # 校验依赖go module介绍go module是go官方自带的go依赖管理库,在1.13版本正式推荐使用go m原创 2020-06-16 10:10:49 · 658 阅读 · 0 评论 -
Go 项目编译Linux或Windows可执行文件
编译成windows文件SET CGO_ENABLED=1SET GOARCH=SET GOOS=windowsgo build编译成Linux文件SET CGO_ENABLED=0SET GOARCH=amd64SET GOOS=linuxgo build原创 2020-06-16 09:32:52 · 2071 阅读 · 0 评论 -
Go的defer使用心得
作用:defer的引入,为了在函数执行完毕后及时释放资源,当然有时候也用来处理意外退出的后续工作说明:1.当执行到defer时,暂时不执行,会将defer后面的语句压入到独立的栈(defer栈),2.当函数执行完毕后,再从defer栈,按照先入后出的方式出栈,执行3.defer将语句入栈时,也会将语句相关的值进行拷贝,同时入栈注意:此操作是复制了一份值的副本而不是引用实例代码:func sum(n1 int, n2 int) int { //defer 后边的会在该函数执行完成后再执行 d原创 2020-05-20 13:09:54 · 423 阅读 · 0 评论