golang
文章平均质量分 72
一闪一闪满天星
总有人仰望星空
展开
-
go语言性能测试go test
go test语法:go test [build/test flags] [package] [build/test flags && test binary flags]test flaggo help testflag-bench 指定运行的基准测试,默认不进行基准测试,常用-bench=.来运行所有的基准测试-benchtime 指定每个基准测试运行的时间,默认是1s,例如-benchtime=3s制定每个基准测试运行3s,也可以通过Nx的方式来指定基准测试运行的次数,例原创 2022-01-10 20:26:02 · 1163 阅读 · 0 评论 -
go程序启动过程
go程序编译过程当使用go build main.go时进行编译,将go源码文件转化成可执行目标文件,主要经历了以下几个过程:将.go后缀的源文件,通过编译器,编译成以.s为后缀的汇编程序将汇编程序,通过汇编器,编译成以.o为后缀的二进制可重定向目标文件将.o文件,通过链接器进行链接,最终胜出可执行目标文件。在编译过程中,go编译器主要进行了一下几个过程:4. 词法分析,通过设定的关键字,将字符序列转换成token序列5. 词法分析,对token序列进行分析,确定其语法结构(语法树)的过原创 2022-01-10 19:20:16 · 936 阅读 · 0 评论 -
golang清理字符串类型的内存
敏感数据字符串内存清楚原创 2021-12-29 10:48:23 · 882 阅读 · 0 评论 -
golang context应用场景
Golang contextContext数据结构type Context interface { Deadline() (deadline time.Time, ok bool) Done() <-chan struct{} Err() error Value(key interface{}) interface{}}Context是一个接口类型。Deadline():当ctx有结束时间时,返回结束时间和true。WithTimeout和WithDeadline方法都有结束时间。原创 2021-06-14 16:15:14 · 443 阅读 · 0 评论 -
golang内存分配(三)
文章目录golang内存分配3数据结构2. class2. span是内存管理的基本单元3. cache4. central5. heap总结Spans资料golang内存分配3golang中实现了内存分配器,原理与tcmalloc类似。从内存申请一大块内存,通过内存分配器自己管理这块内存。在64位系统中,go程序启动时会向系统申请512MB的spans 、16GB的的bitmap、512G的arena。为了方便管理,arena区被划分成一个个页,每个页为8KB,一共有 512G/8K 个页 = 6原创 2021-05-31 23:00:48 · 580 阅读 · 1 评论 -
golang内存分配(二)进程地址空间
文章目录golang内存分配2进程地址空间golang内存分配2进程地址空间32位系统,cpu一次能处理32位的二进制数,一次最多可以用32位二进制数来表示一个地址,共可以表示2^32个地址,每个byte对于一个地址,所以共可以寻址4GB的空间虚拟内存到物理内存的映射,以页(4096)为单位。用页目录和页表组合来表示一个虚拟页的地址,一个虚拟页对于一个物理页。一个虚拟页用12位bit表示,最大能寻址4096个地址,也就是最大能寻址4KB的物理内存。虚拟内存分段:0-10bit为页目录 11-20b原创 2021-05-31 22:47:11 · 345 阅读 · 0 评论 -
golang内存分配(一)内存和虚拟内存
文章目录golang内存分配go语言内存分配概述go语言实现跨平台计算机内存golang内存对齐虚拟内存Reference本节关键词golang内存分配go语言内存分配概述go语言的内存分配是基于tcmalloc模型的,关于tcmalloc可以搜索《图解TCMalloc》go语言跟大多数内置运行时(runtime)的编程语言一样,抛弃传统内存分配的方式,改为自己管理。这样可以完成类似预分配、内存池等操作,以闭开系统调用带来的性能问题,防止每次分配内存都需要系统调用。go的内存分配的核心思想分为以下原创 2021-05-31 22:36:00 · 1612 阅读 · 0 评论 -
golang struct详解
Go struct详解内存模型go语言的结构体的内存模型,是连续的内存。内存对齐package mainimport ( "fmt" "unsafe")type StructA struct { A bool}type StructB struct { A bool B int16}func main() { a := StructA{} fmt.Println(unsafe.Sizeof(a)) b := StructB{}原创 2021-05-27 23:19:00 · 1224 阅读 · 1 评论 -
beego运行过程
beego 运行过程1. 入口文件main.gopackage mainimport ( _ "source/routers" "github.com/astaxie/beego")func main() { beego.Run()}1. 加载了 source/routers 2. 加载了 github.com/astaxie/beego 2.routes/router.go路由package routersimport ( "source/controllers"原创 2021-05-27 23:04:07 · 808 阅读 · 1 评论 -
深入理解golang channel
channel详解CSP模型go语言的并发是基于CSP并发模型实现的。golang的并发哲学:Do not communicate by sharing memory; instead, share memory by communicating。channel主要用于在多个goroutine之间进行通信。channel是并发安全的。channel的使用方法:var ch chan int // 声明一个int类型的channel,不进行初始化var ch = make(chan int)原创 2021-05-19 22:02:06 · 253 阅读 · 1 评论 -
golang接口interface类型断言的补充说明
接口类型断言补充空接口断言示例:type User struct { name string}func main() { var a interface{} a = User{name: "hello"} val, ok := a.(int) if ok { fmt.Println("is int", val) } else { fmt.Println("not int") }}打印汇编信息:go tool compile -S -N -l main.go >原创 2021-05-19 21:59:42 · 429 阅读 · 0 评论 -
深入理解golang接口interface
Golang interface详解interface在go语言中,interface有两种用法。第一种是空接口,代表任意类型,空接口也可以理解为没有任何要求的接口类型,也可以说所有的类型都实现了空接口。另一种是有方法的接口,在接口中定义一系列方法,一个类型如果实现了这些方法,那么我们就说这个类型实现了这个接口。接口声明空接口:var any interface{}any = 1 any = trueany = "hello"带方法的接口:类型不需要显式声明它实现了某个接口:接口原创 2021-05-19 21:58:32 · 1199 阅读 · 0 评论 -
深入理解golang string
golang stringstring的定义// string is the set of all strings of 8-bit bytes, conventionally but not// necessarily representing UTF-8-encoded text. A string may be empty, but// not nil. Values of string type are immutable.type string stringstring里存储的是字符原创 2021-05-19 21:57:26 · 1256 阅读 · 1 评论 -
深入理解golang数组和切片
golang 数组和切片数组数组是一组有序的元素序列,数组在声明时必须指定数组的长度。数组是值类型,数组内的元素在内存中的地址是连续的。声明与赋值// 数组声明时需要指定长度var arr [4]int// 数组元素赋值arr[1] = 1// 打印数组地址fmt.Println(unsafe.Pointer(&arr)) //0xc0000103a0// 打印各元素的地址,元素在内存中是连续的fmt.Println(unsafe.Pointer(&arr[0原创 2021-05-09 15:35:58 · 286 阅读 · 0 评论 -
深入理解golang map
golang map版本go1.14正确使用func main() { var m map[int]string // 初始化map // [问题1] make初始化map时指定size和不指定size有什么区别 m = make(map[int]string) m[0] = "hello" m0, ok := m[0] if ok { fmt.Println("get m0:", m0) } m1, ok := m[1] if ok { fmt.Println("get原创 2021-05-09 15:33:49 · 638 阅读 · 0 评论 -
gopsutil
gopsutilproject:github.com/shirou/gopsutildocumentation:http://godoc.org/github.com/shirou/gopsutilgo 系统监控 cpu、内存等指标cpuimport “github.com/shirou/gopsutil/cpu”获取CPU核心数// 获取cpu的逻辑核心数logicalCount, _ := cpu.Counts(true)// 获取cpu的物理核心数physicalCount,原创 2021-01-10 12:00:01 · 1240 阅读 · 2 评论 -
go内存布局
计算机 1byte=8bitutf8 格式 1个英文字符是1byte,1个数字是1byte(0-9)这个是相对于字符编码来说的而代码里的数据类型不同go数据类型:int=int64 =用64位bit表示一个int也就是8个字节byte,int的取值范围为-2的31次方到2的31次方(-21 4748 3648 ~ 21 4748 3647 )rune的底层是uint32,所以rune占4个字节,用4个字节表示一个字符,所以它可以表示的字符更多,比如中文。byte底层是uint8,所以byte原创 2021-01-10 11:59:15 · 183 阅读 · 0 评论 -
beego Orm高级查询
beego Orm高级查询环境go1.14预置条件注册mysql驱动注册database定义User,并注册type User struct { ID int `orm:"column(id)"` Name string `orm:"column(name)"`}func (User)TableName()string{ return "user"}实验中的db为:db:=orm.NewOrm().QueryTable("user")实原创 2021-01-10 11:56:48 · 2003 阅读 · 0 评论 -
golang zip压缩和解压缩
package ziputilimport ( "archive/zip" "errors" "io" "io/ioutil" "os" "path" "path/filepath" "strings")func IsZip(src string) (bool, error) { f, err := os.Stat(src) if err != nil { return false, nil } if f.IsDir() { return false, nil原创 2020-11-24 21:19:31 · 265 阅读 · 0 评论 -
golang Slice和Map并发安全问题
golang Slice和Map并发安全问题多个goroutine对同一个Slice进行写是不安全的。func main() {s := []int{}for i := 0; i < 10000; i++ {go func(num int) {s = append(s, num)}(i)} time.Sleep(2 * time.Second) for i, v := range s { //同时打印索引和值 fmt.Println(i, ":", v) }}打原创 2020-11-22 21:09:59 · 1430 阅读 · 1 评论 -
使用gomock进行单元测试
使用gomock进行单元测试下载&安装go get -u -v github.com/golang/mock/gomockgo get -u -v github.com/golang/mock/mockgengo install github.com/golang/mock/mockgen在 mockgen 命令中,支持两种生成模式:source:从源文件生成 mock 接口(通过 -source 启用)mockgen -source=foo.go [other options]原创 2020-11-22 21:02:28 · 519 阅读 · 0 评论 -
go语言进行http请求和处理http响应的几种方式
发送http请求的方式方法一:使用http.Get、http.Postfunc Get() { u := "http://localhost:8080" v := make(url.Values) v["name"] = []string{"jim"} v["age"] = []string{"12"} // v.Encode = "name=jee&age=12" res, err := http.Get(u + "?" + v.Encode()) if err != nil原创 2020-11-12 21:43:51 · 2990 阅读 · 0 评论 -
golang recover异常处理
go程序在运行过程中发生panic,会导致程序崩溃,我们可以通过recover来捕获panic,并进行异常处理。panic会导致程序崩溃:func main(){ panic("process error")}goroutine里面的panic也会使程序崩溃:func main(){ go func(){ panic("goroutine panic") } time.Sleep(1*time.Second) fmt.Println("ok")}在goroutine里使用de原创 2020-09-28 21:39:54 · 862 阅读 · 0 评论 -
golang模拟客户端请求
package mainimport ( "bytes" "encoding/json" "fmt" "io" "io/ioutil" "net/http" "net/url" "time")var u = "http://localhost:7896/form"// http请求的几种方式func Get() { //1.方法一:通过http.get获取 res, err := http.Get(u + "?name=jee&age=12") if err !原创 2020-09-28 21:14:45 · 451 阅读 · 0 评论 -
进程、线程和go协程
进程、线程和协程Go的CSP并发模型实现:M, P, G原创 2020-06-15 20:59:07 · 418 阅读 · 0 评论 -
go语言实现定时器-time
go time包定时器golang的time包的Timer和Ticker都可以实现定时功能,两者的区别是Timer用于定时执行一次的任务,Ticker用于循环定时执行多次任务。Stop用于关闭定时器,在关闭后,将不会往定时器发送信息。官方描述:Stop不会关闭通道t.C,以避免从该通道的读取不正确的成功。基本用法package mainimport ( "fmt" "time"...原创 2020-04-30 17:58:04 · 816 阅读 · 0 评论 -
gin源码-ShouldBindQuery
Bind原创 2020-04-27 20:11:18 · 4778 阅读 · 1 评论 -
go语言defer语句实践
defer原创 2020-04-18 15:22:30 · 114 阅读 · 0 评论