Golang笔记
傅里叶、
业精于勤荒于嬉,行成于思毁于随
展开
-
Golang性能分析
性能分析的场景主要有CPU、Memory、IO、Goroutine、死锁几种原创 2023-02-05 22:33:38 · 954 阅读 · 0 评论 -
Golang之mysql
github.com/jinzhu/gorm 是Gorm v1的地址;gorm.io/gorm 是Gorm v2的地址;原创 2022-10-22 20:55:42 · 1622 阅读 · 0 评论 -
golang之time时间处理
golang之time时间处理原创 2022-10-06 15:47:48 · 1213 阅读 · 0 评论 -
Golang之Ginkgo、Gomega测试框架
Ginkgo、Gomega测试框架原创 2022-03-06 16:46:34 · 2400 阅读 · 0 评论 -
Golang之cuelang.org/go/cue包
1111111package mainimport ( "cuelang.org/go/cue" "encoding/json" "fmt" "github.com/oam-dev/kubevela/apis/core.oam.dev/common" "github.com/oam-dev/kubevela/apis/core.oam.dev/v1alpha1")type EnvConfig struct { Gender string原创 2022-03-04 10:14:52 · 702 阅读 · 0 评论 -
Golang之理解错误输出
第一行是panic 错误描述;第二行是触发panic的UNIX信号的信息,包括内存地址、程序计数器等;后边是:栈帧信息触发panic的go代码行栈帧信息触发panic的go代码行原创 2022-02-10 21:37:46 · 273 阅读 · 0 评论 -
Golang之pprof使用
1、配置import_ "net/http/pprof"go func() {http.ListenAndServe("0.0.0.0:8899", nil)}()访问http://127.0.0.1:8899/debug/pprof/2、采样频率3、下载profile的接口1、/debug/pprof/profile?seconds=30:访问这个链接会自动进行 CPU profiling,持续 30s,并生成一个文件供下载2、/debug/...原创 2022-01-25 16:57:35 · 1272 阅读 · 0 评论 -
Golang之函数选项模式
仅做记录/* Functional Options函数选项模式(简称FOP模式) 既保持了兼容性,而且每增加1个新属性只需要1个With函数即可,大大减少了修改代码的风险*/package mainimport "fmt"/* Functional Options函数选项模式(简称FOP模式) 既保持了兼容性,而且每增加1个新属性只需要1个With函数即可,大大减少了修改代码的风险*/type Student struct { Name string Age .原创 2022-01-05 11:19:20 · 300 阅读 · 0 评论 -
无缓冲channel的内存泄漏问题
无缓冲channel的内存泄漏问题:无缓冲channel在go程里done <- hardWork(job)时,如果外层执行完了后,done <- hardWork(job)写操作<- 会一直阻塞func requestWork(ctx context.Context, job interface{}) error { ctx, cancel := context.WithTimeout(ctx, time.Second*2) defer cancel()原创 2021-12-27 20:54:36 · 331 阅读 · 0 评论 -
Golang之Go Module使用
(1)gomod命令命令 作用go mod init 生成 go.mod 文件go mod download 下载 go.mod 文件中指明的所有依赖go mod tidy 整理现有的依赖go mod graph 查看现有的依赖结构go mod edit 编辑 go.mod 文件go mod vendor 导出项目所有的依赖到vendor目录go mod verify 校...原创 2021-12-22 20:10:54 · 888 阅读 · 0 评论 -
Golang之空结构体和零长数组的实践
空结构体和零长数组(两个复合类型)都仅仅是一个占位符,不占用空间,这里编译器进行了优化,如果结构体或数组的unsafe.sizeof=0则直接返回zerobase。// 必须用key来初始化结构体type NoUnkeyedLiterals struct{}// 不允许结构体比较type DoNotCompare [0]func()// 不允许结构体拷贝type DoNotCopy [0]sync.Mutextype User struct { // 必须用key来初始化结构原创 2021-12-18 18:49:02 · 559 阅读 · 0 评论 -
Golang之funcval结构体
Go语言中,函数是头等对象,将函数作为参数变量或返回值的情况称为function value。function value本质上是一个指针,指向runtime.funcval结构体,这个结构体里只有一个地址,即函数指令的入口地址。闭包其实就是有捕获列表的funcval结构体,funcval加上偏移量可以找到每个捕获的变量。...原创 2021-12-12 19:36:35 · 316 阅读 · 0 评论 -
Golang之envconfig的使用
代码中default的数组用;分割type Env struct {ExpireTime int `envconfig:"default=30"`Retry struct {Limits int `envconfig:"default=5"`Interval int `envconfig:"default=2"`}MngCluster struct {ApiServer []string `envconfig:"d...原创 2021-12-12 10:48:04 · 508 阅读 · 0 评论 -
Golang之Slice处理
func EqualSlice(slice1, slice2 interface{}) bool { if slice2 == nil || slice1 == nil { return false } if reflect.TypeOf(slice1).Kind() != reflect.TypeOf(slice2).Kind() || reflect.ValueOf(slice1).Index(0).Kind() != reflect.ValueOf(slice2).Index(0).Kin.原创 2021-12-11 15:17:24 · 827 阅读 · 0 评论 -
Golang三方库
github.com/fatih/structs:结构的的操作,转map[string]interface{}、判断零值等原创 2021-11-18 17:04:00 · 2425 阅读 · 0 评论 -
Golang之错误处理
1、错误只在逻辑的最外层处理一次,底层只返回错误。2、底层除了返回错误外,要对原始错误进行包装,增加错误信息、调用栈等这些有利于排查的上下文信息。例子://只附加新的信息funcWithMessage(errerror,messagestring)error如:if err != nil { errors.WithMessage(err, "could not read config")}//只附加调用堆栈信息funcWithStack(errerror)err...原创 2021-11-13 22:48:04 · 836 阅读 · 0 评论 -
Golang之channel操作
读 无缓冲chan 阻塞等待 写 无缓冲chan 阻塞等待 读 有缓冲chan 先读后阻塞 写 有缓冲chan 先写后阻塞 读 close的无缓冲chan 读到零值,可通过ok判断 写 close的无缓冲chan panic 读 close的有缓冲chan 先读,后读到零值,可通过ok判断 写 close的有缓冲chan panic 读 nil的chan 阻塞 写原创 2021-11-13 12:56:18 · 737 阅读 · 0 评论 -
Golang之slice操作
1、创建一般使用make创建,make([]string,0)var s []int或s:=new([]int) //nil切片, 切片是nil,即Slice内的指针是nilvar t = []int{}或var u = make([]int, 0) //空切片,Slice内的指针指向长度为0的底层数组var u = make([]int, 3) //3个内部元素是零值2、追加append时会首先使用可用容量cap部分,如果cap不够扩容就会分配一个新的底层数原创 2021-11-07 19:25:37 · 6346 阅读 · 0 评论 -
Golang之延时器与定时器
延时器 // 延时器1 go time.AfterFunc(3*time.Second, func() { fmt.Println("3s") }) // 延时器2 go func() { for { select { case <-time.After(5 * time.Second): fmt.Println("5s") return } } }() time.Sleep(100*time.Second) fmt.Println("原创 2021-11-02 19:14:52 · 1416 阅读 · 0 评论 -
Golang之零值
false : bool;0: integer;0.0: float;"": string;nil : pointer, function, interface, slice, channel, map 。对于复合类型, go语言会自动递归地将其内每一个元素初始化为其类型对应的零值。比如:数组, 结构体 。...原创 2021-10-31 17:38:10 · 886 阅读 · 0 评论 -
Golang之gjson
gjson主要用于从string和[]byte里取json数据。对于interfacele{}类型,要先强制转换为[]byte或string再用gjson,其实单层json下不如直接强转为map,多层考虑用gjson。import "fmt"import "github.com/tidwall/gjson"const json = `{"name":[{"first":"Janet","last":"Prichard"}, {"abc": 1, "e" : 2}],"age":47原创 2021-10-28 20:39:22 · 2303 阅读 · 0 评论 -
Golang之 ==和deepEqual
slice,Map,函数,接口四种引用类型,以及拥有以上四个不能比较成员的结构体不能直接用==比较,应该用reflect.deepEqual进行比较。其中:channel可以用==比较,有包含关系的接口可以用==比较,不同类型的结构体比较需要先强制转换,且强转时要求成员顺序一致。...原创 2021-10-26 21:22:15 · 1011 阅读 · 0 评论 -
Golang之var、new与make、简短声明
对于值类型的声明时会自动分配内存并初始化为零值。对于引用类型的变量,声明时不会自动初始化,需要手动分配内存空间,否则会空指针或invalid memory address,new,针对所有类型,并把内存初始化为零值,并返回指针,对于slice、map、channel会初始化为零值nil。即*T会返回一个make,针对引用类型的slice,map,channel,会初始化其内部元素为其零值,并且返回这三个类型本身。因为已经是引用类型,所以没必返回他们的指针了。...原创 2021-10-09 21:06:20 · 688 阅读 · 2 评论 -
Golang之sync.waitGroup、sync.ErrGroup.Wait和RetryOnErr
package mainimport ( "fmt" "github.com/sirupsen/logrus" "proj_test/errlib")func main() { times := 0 retryErr := errlib.RetryOnErr(errlib.NewDefaultRetryConf(), func() error { times++ return apply() }) if retryErr != nil { logrus.Errorf(".原创 2021-09-13 20:41:43 · 478 阅读 · 0 评论 -
logrus
logrus的用法package mainimport ( "github.com/sirupsen/logrus")func init() { logr.SetFormatter(&logrus.JSONFormatter{}) // 添加自己实现的Hook logr.AddHook(&DefaultFieldsHook{}) // 设置日志打印级别 logr.SetLevel(logrus.InfoLevel)}var logr = logrus.Ne原创 2021-09-05 12:28:14 · 128 阅读 · 0 评论 -
golang之字符串
Go语言的字符有两种类型:一种是byte型,或者叫uint8类型,代表了ASCII码的一个字符。一种是rune类型,或者叫int32类型,代表一个UTF-8字符,当需要处理中文、日文等unicode字符时,则需要用到rune类型。...原创 2021-08-22 19:04:55 · 1087 阅读 · 0 评论 -
golang之iota
iota是一个常量计数器,只能在常量的表达式中使用,iota可理解为const语句块中的行索引。1、iota声明的常量默认会自增1;const ( one = iota two three four five)func main() { fmt.Println(one) fmt.Println(two) fmt.Println(three) fmt.Println(four) fmt.Println(five)}output:01234const (原创 2021-08-22 16:21:37 · 5639 阅读 · 0 评论 -
golang之‘...‘的用法
1、func:函数可以接受多个不确定数量的参数func TestOne(args ...string) {for _, v:= range args{fmt.Println(v)}}2、Slice:将slice解构打散后进行传递var strs = []string{"123","456","789",}three_dot.TestOne(strs...)three_dot.TestOne("123","456","789")...原创 2021-08-18 19:58:43 · 853 阅读 · 0 评论 -
error: goland --build constraints exclude all Go files
首先,//+build将逐渐取代//go:build,在Go Version1.16-1.18作为过渡期,两种注释都可以使用。参见官网https://www.jetbrains.com/help/go/configuring-build-constraints-and-vendoring.html但是在1.16以下的版本不能使用//+build,若使用便会报错error: goland --build constraints exclude all Go files。1.16以下版本应使用//go:原创 2021-08-17 20:30:08 · 7429 阅读 · 1 评论 -
Golang 为什么不能直接将任意类型数组赋值给 []interface{}完成泛型操作
想用 []interface{} 类型来接受一个任意类型的数组,从而进行泛型操作时,发现直接赋值会发生错误,导致 panicvar dataSlice []int = foo()var interfaceSlice []interface{} = dataSlicecannot use dataSlice (type []int) as type []interface { } in assignment先说结论:interface{} 可以接收任何类型,但是[]interface{.原创 2021-08-05 10:03:07 · 753 阅读 · 1 评论 -
协程的三种同步方式Channel、Mutex、WaitGroup
1、无缓冲的channel:无缓冲的channel只能发送完之后协程立马阻塞,只有等有协程接受了之后才能继续发送,等待协程接受了,之后立马阻塞,等待channel中有数据才会启动package mainimport ( "fmt" "time")/*无缓冲的channel只能发送完之后协程立马阻塞,只有等有协程接受了之后才能继续发送,等待协程接受了,之后立马阻塞,等待channel中有数据才会启动*/func main() { c := make(chan int) //声明.原创 2021-08-04 09:41:10 · 798 阅读 · 0 评论 -
fmt.Println、fmt.Printf、fmt.Sprintf、fmt.Sprintln
fmt包实现了格式化的I/O。1、fmt.Println:用默认的类型格式将传入的参数写到标准输出参数;字符串和变量之间用逗号间隔,输出:用空格间隔2、fmt.Printf:用占位符将传入的变量写到标准输出输入:占位符,变量输出3、fmt.Sprintf:用占位符将传入的变量返回为字符串,不会在终端显示;name := "fourier"gender := "male"fmt.Println("name:",name,"gender:",gender) //name: fo.原创 2021-07-20 16:30:19 · 2063 阅读 · 0 评论 -
Golang的匿名函数和闭包
1、匿名函数(anonymous)匿名函数是一种没有函数名的函数。在声明匿名函数之后,在其后加上调用的参数列表,即可对匿名函数进行调用匿名函数有两种调用执行方式:(1)将匿名函数保存到变量,通过变量执行(2)自执行匿名函数:在匿名函数后加调用的参数列表"()",即可对匿名函数进行立即调用func main() { // 将匿名函数保存到变量 add := func(x, y int) { fmt.Println(x + y) } add(1...原创 2021-07-18 20:38:46 · 516 阅读 · 0 评论 -
关键字之defer、panic、recover
1、defer延迟调用,完成一些收尾工作。无论函数或方法是否出错,一定会在退出当前函数或者方法之前调用传入的函数(只对函数或方法生效,代码块不生效),常被用于关闭文件描述符、关闭数据库连接以及解锁资源。 2、多次调用 defer 时的执行顺序问题: 类似于栈,后调用的defer函数会先执行,先调用的defer函数会后执行。 3、 defer的传值方式及预计算问题:defer的传值采用值传递,调用defer时会立刻对函数中引用...原创 2021-07-18 10:58:28 · 225 阅读 · 0 评论 -
GORM的简单理解
1、GORM是一种对象关系映射ORM框架,数据表对应结构体,数据行对应结构体实例,数据库字段对应结构体字段。在gorm中,表名默认就是结构体名称的复数,也可以通过方法或者db.Table("表名")自定义表名;列名由两个单词组成,在数据库中默认转小写后用下划线链接;如果结构体有ID字段则默认ID字段为主键。 2、另外,GORM内置了一个gorm.Model结构体。gorm.Model是一个包含了ID, CreatedAt, UpdatedAt, DeletedA...原创 2021-07-17 22:16:36 · 2437 阅读 · 0 评论 -
gomod和govendor的简单理解
go module是Go语言默认的依赖管理工具,且没有必要在GOPATH中创建项目了。常用命令:go mod init 初始化当前文件夹, 创建go.mod文件go mod download/go get 下载依赖的module到本地cache(默认为$GOPATH/pkg/mod目录)go mod graph 打印模块依赖图go mod tidy 增加缺少的module,删除无用的modulego mod verify 校验依赖go ...原创 2021-07-17 15:56:34 · 814 阅读 · 0 评论 -
Gin框架获取参数
1、querystring,的是URL中?后面携带的参数,例如:/user/search?username=小王子&address=沙河。 获取请求的querystring参数的方法如下。c.Queryusername := c.DefaultQuery("username", "小王子")//username := c.Query("username")address := c.Query("address")//输出json结果给调用方c.JSON(http.StatusOK, g原创 2021-07-16 20:48:47 · 2097 阅读 · 0 评论 -
Golang的模板与渲染
模板:提前定义好的html文件渲染:就是填充数据或者说替换字符串Go语言内置了用于HTML文档的html/template和文本模板引擎text/template。模板文件通常定义为.tmpl和.tpl为后缀;必须使用UTF8编码;模板文件中使用{{和}}包裹和标识需要传入的数据,除{{和}}包裹的内容外,其他内容均不做修改原样输出。hello.tmpl<!DOCTYPE html><html lang="zh-CN"><head>原创 2021-07-14 22:06:27 · 1456 阅读 · 0 评论 -
Golang的日志记录器
Fatal 系列函数(log.Fatalln)用来写日志消息,然后使用 os.Exit(1)终止程序。Panic 系列函数(log.Panicln)用来写日志消息,然后触发一个 panic。日志记录器是多 goroutine 安全的// This sample program demonstrates how to create customized loggers.package mainimport ( "io" "io/ioutil" "log" "os")var (原创 2021-07-13 21:48:34 · 454 阅读 · 0 评论 -
单元测试与基准测试
1、单元测试:Go 语言的测试工具只会认为以_test.go 结尾的文件是测试文件。测试函数必须是公开的函数,以Test 单词开头,且函数的参数必须接收一个指向testing.T类型的指针,并且不返回任何值。func TestDownload(t *testing.T){ // xxx}t.Fatal 不但报告这个单元测试已经失败,而且会向测试输出写一些消息,并立刻停止这个测试函数的执行。t.Error 方法会报告测试失败,但是并不停止当前测试函数的执行调用go test -v运原创 2021-07-13 19:42:38 · 162 阅读 · 0 评论