Go语言
文章平均质量分 67
YZF_Kevin
若有恒,何必三更眠五更起;最无益,莫过一日曝十日寒
展开
-
golang程序如何优雅地退出
简言1. 程序退出时不应该是kill -9暴力地杀死程序,监控信号2. 监听系统信号,收到指定信号,一般是TERM,QUIT信号,退出程序是通常做法示例原创 2021-06-10 21:43:52 · 3858 阅读 · 0 评论 -
nohup命令
简言1. 连接服务器的终端退出时,这个终端启动的进程会受到系统发出的SIGHUP信号,进程的默认处理是退出进程2. 如果我们在启动进程时加上了nohup命令,原创 2021-06-15 15:08:21 · 5453 阅读 · 2 评论 -
golang处理kill命令总结
简言1. kill 命令可以向指定进程号的进程发送命令,切记:kill命令不是通知进程结束的2. kill 命令的格式:kill [参数] jinche原创 2021-06-10 22:03:04 · 2478 阅读 · 0 评论 -
深入理解golang的defer
defer 估计是每个 Gopher 每天写代码都会写,那么你是不是真正的理解了 defer 呢?不妨看一下下面这个代码片段,这个是我之前给 UC 那边一个 team 做 Golang 培训的时候想的例子。package mainfunc f() int { i := 5 defer func() { i++ }() return i}func f1() (result int) { defer func() { r转载 2021-06-16 19:29:02 · 391 阅读 · 0 评论 -
详解go的hex.Encode原理
详解golang的hex.Encode原理原创 2023-07-23 16:22:50 · 796 阅读 · 0 评论 -
go语言操作xlsx文件
简言1. go语言操作xlsx文件已经有了很完善的第三方库,本篇博客演示的是360EntSecGroup-Skylar/excelize 的使用2. 演示功能:读取xlsx文件,新建,写入,保存xlsx文件要读取的文件内容如下(敏感词文件名word.xlsx;只有1页,即sheet1;只有5行内容)代码执行效果如下完整代码如下package mainimport "fmt"import "github.com/360EntSecGroup-Skylar/exc...原创 2021-12-23 14:50:15 · 2240 阅读 · 0 评论 -
goland设置Terminal
简言1. goland如果是默认安装,则Terminal的默认路径是D:\Git\bin\bash.exe,我们使用时就会报下面的错误2. 打开Terminal的路径:“文件” -> “设置” -> “工具” -> “Terminal”,如下图,如果你的git目录不在这里,那么就无法打开Terminal3. 设置成自己git的bash.exe所在目录,如下图所示(我的git目录是在C:\Program Files\Git\bin)...原创 2021-01-13 13:57:15 · 8448 阅读 · 1 评论 -
go get github.com/tealeg/xlsx timeout 超时
总结1. 类似这种 go get xxxxxxxxx timeout 的错误,都是因为用了go默认的代理方式2. 更换成国内的代理地址,运行如下命令即可go env -w GO111MODULE=ongo env -w GOPROXY=https://goproxy.cn,direct...原创 2021-12-23 11:26:45 · 796 阅读 · 0 评论 -
golang的切片使用总结二
golang切片使用总结原创 2023-10-05 20:47:39 · 6008 阅读 · 1 评论 -
golang的切片使用总结一
golang切片使用总结原创 2023-10-05 19:30:05 · 411 阅读 · 0 评论 -
go语言使用chan的小技巧
go语言chan的使用技巧原创 2023-08-06 10:43:45 · 295 阅读 · 0 评论 -
golang文件锁,目录锁,syscall包的使用
golang 文件锁/目录锁的实现原创 2023-07-28 17:49:31 · 1171 阅读 · 3 评论 -
golang中的GC原理
结合了插入,删除写屏障的优点,只需要在开始时并发扫描各个goroutine的栈,使其变黑并一直保持,这个过程不需要STW,而标记结束后,因为栈在扫描后始终是黑色的,也无需再进行re-scan操作了,减少了STW的时间。2.从程序(对象根节点)出发,即从上图的程序出发,开始遍历所有对象,把遍历到的对象从白色集合放入到灰色集合,当前对象1,对象4为灰,其余为白。3.遍历灰色集合,将灰色对象应用的对象从白色集合放入灰色集合,之后将原灰色集合放入黑色集合,当前1,4为黑,2,7为灰,3,5,6为白。转载 2022-09-24 10:54:02 · 2389 阅读 · 2 评论 -
彻底理解golang的GC - 第三篇
golang的GC总结转载 2022-09-22 23:30:03 · 550 阅读 · 0 评论 -
彻底理解golang的GC - 第二篇
golang的删除屏障,混合写屏障转载 2022-09-22 23:17:44 · 471 阅读 · 0 评论 -
彻底理解golang的GC - 第一篇
GC:垃圾回收(Garbage Collection)是一种自动管理内存的机制。传统的编程语言(C/C++)中,释放无用变量内存空间是程序员手动释放,存在内存泄漏或者释放不该释放内存等问题;为了解决这个问题,后续的语言(oc/swift/java/python/php/golang 等)都引入了语言层面的自动内存管理,语言使用者无需对内存进行手动释放,内存释放由虚拟机(virtual machine)或者运行时(runtime)来对不再使用的内存资源进行自动回收转载 2022-09-22 22:54:20 · 1446 阅读 · 0 评论 -
Golang的反射reflect深入理解和示例
编程语言中反射的概念在计算机科学领域,反射是指一类应用,它们能够自描述和自控制。也就是说,这类应用通过采用某种机制来实现对自己行为的描述(self-representation)和监测(examination),并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。每种语言的反射模型都不同,并且有些语言根本不支持反射。Golang语言实现了反射,反射机制就是在运行时动态的调用对象的方法和属性,官方自带的reflect包就是反射相关的,只要包含这个包就可以使用。多插一句,Gol转载 2022-03-05 18:18:13 · 1741 阅读 · 0 评论 -
golang获取文件创建时间,最后访问时间,最后修改时间
简言1. golang为我们提供了完善的文件操作库,例如os,ioutil等2. windows下,linux下获取文件时间信息的方式不太一样3. 如果你还不知道如何获取目录下的所有文件,请参考笔者的这篇博客:https://blog.csdn.net/yzf279533105/article/details/115356551效果如下这个是文件目录图 文件的时间信息如下图 完整代码如下package mainimport (...原创 2021-03-31 21:18:21 · 6196 阅读 · 2 评论 -
go语言的range使用
简言1. range在map中是随机的2. range在数组中是从0开始递增遍历的实验如下图代码如下package mainimport "fmt"func main() { a := []int{3,1,2} fmt.Println("range 遍历数组") for i, v := range a { fmt.Println(i,v) } fmt.Println("range 遍历map") m := map[int]int{} m[3] = 33原创 2021-02-18 16:16:54 · 2726 阅读 · 0 评论 -
go 求两个时间相差的天数
参数为time时// 获取两个时间相差的天数,0表同一天,正数表t1>t2,负数表t1<t2func GetDiffDays(t1, t2 time.Time) int { t1 = time.Date(t1.Year(), t1.Month(), t1.Day(), 0, 0, 0, 0, time.Local) t2 = time.Date(t2.Year(), t2.Month(), t2.Day(), 0, 0, 0, 0, time.Local) return int(原创 2021-01-20 20:56:03 · 8518 阅读 · 2 评论 -
go context之WithTimeout的使用
代码如下package mainimport ( "context" "fmt" "time")func main() { // 创建一个子节点的context,3秒后自动超时 ctx, cancel := context.WithTimeout(context.Background(), time.Second*3) go watch(ctx, "监控1") go watch(ctx, "监控2") fmt.Println("现在开始等待8秒,time=", time.原创 2020-07-11 22:39:09 · 31435 阅读 · 2 评论 -
go context之WithDeadline的使用
package mainimport ( "context" "fmt" "time")func main() { // 创建一个子节点的context,3秒后自动取消 ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(time.Second*3)) go watch(ctx, "监控1") go watch(ctx, "监控2") fmt.Println("现在开始等待5秒,ti.原创 2020-07-11 22:39:55 · 3821 阅读 · 0 评论 -
go context的使用总结
简言go语言提供了控制子协程的方法,除了waitgroup之外还可以利用context步骤如下1. 新建一个子协程的时候,在子协程的函数参数中传入context2. 子协程循环读取传入的context中的Done()返回值通道中,有信号就可以退出了3. 重点:父协程想关闭子协程时,调用其context的cancel函数,即会往其通道中发信号context之WithCancel的使用见博客https://blog.csdn.net/yzf279533105/article/d.原创 2020-07-22 17:43:46 · 460 阅读 · 0 评论 -
go context之WithCancel的使用
实验如下图代码如下package mainimport ( "context" "fmt" "time")func main() { // 父context(利用根context得到) ctx, cancel := context.WithCancel(context.Background()) // 父context的子协程 go watch1(ctx) // 子context,注意:这里虽然也返回了cancel的函数对象,但是未使用 valueCtx, _原创 2020-07-11 21:03:25 · 19342 阅读 · 0 评论 -
go 原子操作 atomic的使用
go语言提供的原子操作都是非侵入式的,它们由标准库代码包sync/atomic中的众多函数代表。 我们调用sync/atomic中的几个函数可以对几种简单的类型进行原子操作。这些类型包括int32,int64,uint32,uint64,uintptr,unsafe.Pointer,共6个。这些函数的原子操作共有5种:增或减,比较并交换、载入、存储和交换它们提供了不同的功能,切使用的场景也...转载 2019-05-22 19:48:29 · 6129 阅读 · 0 评论 -
Golang map 如何进行删除操作?
map 的删除操作Golang 内置了哈希表,总体上是使用哈希链表实现的,如果出现哈希冲突,就把冲突的内容都放到一个链表里面。Golang 还内置了delete函数,如果作用于哈希表,就是把 map 里面的 key 删除。delete(intMap, 1)map 的删除原理可以直接看源码。我简单摘几行:func mapdelete(t *maptype, h *h...转载 2019-03-27 11:31:40 · 2390 阅读 · 0 评论 -
go 随机数是重复的
简言1. go语言的随机数是最简单的模型,也就是从既定的数字中筛选符合条件的数字,毫无随机性可言2. 想要真随机的话需要加上随机种子,这样其实也不是真正的随机,还是从既定数字中往后面筛选,只是开始拿数字的起点换了而已实验如下图(可以看到无随机种子时,三次运行结果完全一样。加了随机种子后才变得随机)代码如下package mainimport ( "fmt" "math/rand" "time")// 无随机种子func NoSrand() { fmt.Println原创 2020-06-05 14:37:48 · 1399 阅读 · 0 评论 -
go语言json字符串解析为结构体数组,结构体指针的数组
废话不多说直接上效果图完整代码如下package mainimport ( "encoding/json" "fmt")// 结构体定义type robot struct { Name string `json:"name"` Amount int `json:"amount"`}// 解析到结构体数组func parse_array() { fmt...原创 2020-03-27 10:56:40 · 5892 阅读 · 0 评论 -
go errgroup 递归搜索目录中的Go文件
为了测试sync.ErrGroup的所有功能,我写了一个小程序,用一个指定的模式递归搜索目录中的Go文件。这有助于在Go源代码树中查找已使用已弃用或更新的包的实例。要测试sync.ErrGroup的所有功能,我还为应用程序添加了超时设置在功能。 如果达到时间限制,所有搜索和处理goroutine将被取消,程序将结束当程序运行时,它会生成以下结果:$ gogrep -timeout ...转载 2019-07-26 16:28:35 · 306 阅读 · 0 评论 -
go语言map遍历时删除是安全的, 且可以完全删除
结论:map遍历时删除操作是完全的,且可以完全删除指定的元素实验结果如下图:代码如下:package mainimport ( "fmt")func main() { x := map[int]int{} for i := 0; i < 10000; i++ { x[i] = i } fmt.Println("初始化后,长度:", len(x))...原创 2019-06-19 10:44:09 · 11937 阅读 · 0 评论 -
go 判断channel是否关闭
结论:1. go语言无法判断channel是否关闭2. 从channel读取数据,第二个返回值为true时表明:只能证明channel中已没有残留数据且已关闭3. 若channel已关闭,那么从该channel中读取数据会直接返回,且是默认值实验如下图:实验源码如下:package mainimport ( "fmt")func main() { c :=...原创 2019-08-06 18:25:58 · 16769 阅读 · 2 评论 -
golang 数组 切片 下标范围
结论:1. 数组的单个元素访问时,下标范围[0,len()-1]2. 数组的切片访问时,下标范围[0,len()]实验结果如下图:代码如下:package mainimport "fmt"func main() { // 长度为3 a := []int{1, 2, 3} // 单个元素 { // 起始地址从2开始,正常操作,b的值为3 b ...原创 2019-07-05 17:44:30 · 9352 阅读 · 0 评论 -
go benchmark 性能测试 单元测试 基准测试 使用方法详解
简言基准测试是测量一个程序在固定工作负载下的性能在Golang中,基准测试函数以Benchmark为前缀并且带有一个 *testing.B 类型的参数规则基准测试的代码文件必须以_test.go结尾 基准测试的函数必须以Benchmark开头 基准测试函数必须接受一个指向Benchmark类型的指针作为唯一参数,即比如func BenchmarkMapkeys1(b *test...原创 2019-06-28 18:03:43 · 4264 阅读 · 0 评论 -
golang 获取map所有key的方式
最佳方式:根据map的长度,新建一个数组,遍历map逐个压入方法1:func getKeys1(m map[int]int) []int { // 数组默认长度为map长度,后面append时,不需要重新申请内存和拷贝,效率较高 j := 0 keys := make([]int, len(m)) for k := range m { keys[j] = k j++ }...原创 2019-06-28 16:16:43 · 69950 阅读 · 2 评论 -
go语言 数组 map整体json
实验结论:1. 基础类型的数组,map可以直接json序列化为字符串2. 上面的字符串也可以json反序列化为数组,map实验结果如图:完整代码如下:package mainimport ( "encoding/json" "fmt")func main() { // int型数组json为字符串 arr1 := []int{1, 2, 3, 4}...原创 2019-06-24 15:15:45 · 1453 阅读 · 0 评论 -
go语言 sync.map遍历时删除可以全部删除
结论:sync.map遍历时删除操作是完全的,且可以完全删除指定的元素实验结果下图:代码如下:package mainimport ( "fmt" "sync")// 遍历时删除所有的偶数,结果:确实删除了所有的偶数func fun1() { x := sync.Map{} // 构建 for i := 0; i < 100; i++ { x....原创 2019-06-18 17:35:53 · 15001 阅读 · 0 评论 -
go语言time用法总结
1. time.Unix()函数返回公元1970年1月,1日,0时,0分,0秒以来的秒数代码示例1: // UTC时间1970年1月1日0时0分45秒,所以会打印出 t:45 t, _ := time.ParseInLocation("2006-01-02 15:04:05", "1970-01-01 00:00:45", time.UTC) fmt.Println("t:", t....原创 2019-06-18 21:40:47 · 15111 阅读 · 0 评论 -
go语言的map以及红黑树的map
结论:1. go语言自带的map是基于hash表实现的2. c++语言中map是基于红黑树实现的3. go语言很多第三方库中提供了基于红黑树map的实现这里我们推荐的是由Social Explorer团队开源的gods框架,简称"上帝",其实是GoDS(Go Data Structures),是数据结构与算法相关的框架官网:https://www.socialexplor...原创 2019-05-06 23:35:09 · 3045 阅读 · 0 评论 -
go语言的rune类型
在学习golang基础的时候,发现有个叫rune的的数据类型,当时不理解这个类型的意义。查询,官方的解释如下:// rune is an alias for int32 and is equivalent to int32 in all ways. It is// used, by convention, to distinguish character values from int...转载 2019-05-06 22:02:39 · 6163 阅读 · 1 评论 -
golang slice map struct 作为函数参数时的总结
一:结论如下:1.map作为函数参数时是引用传递,操作的始终是同一个对象2. slice作为函数参数时是引用传递。但是若函数内部对slice参数有append赋值时,则不再是同一个对象3. struct作为函数参数时是值传递,但是struct内部若有map变量,则map是同一个对象 struct变量赋值给其他变量时,也是如此,内部的map成员指向的是同一个实例,切记二:...原创 2019-04-22 22:40:35 · 3618 阅读 · 0 评论