序Golang 中的结构或 struct 是用户定义的类型,允许将可能不同类型的项分组/组合为单一类型。可以说是一个不支持继承但支持组合的轻量级类。我们使用 Golang 编写代码的时候,你肯定使用过struct。但是,你可能不知道的是,通过简单地重新排序结构中的字段,可以极大地提高 Go 程序的速度和内存使用率!示例演示type EmployeeStruct struct { IsPublic bool Age int64 Status bool Name string Image float32 }我们来看一下Employee结构体的内存大小:IsPublic(boolean) 1 字节Age(int64) 8 字节Status(boolean) 1 字节Name(string) 16 字节Image(float32) 4 字节总计: 30 字节通过unsafe.Sizeof检查一下:package main import ( "fmt" "unsafe"
介绍在平时做项目得时候,经常会看到很多包里面定义了结构体。e.g. 在context包里面Context接口中的Done()方法,Done()返回一个是以空结构体定义数据的通道chan struct{},那这里他是有什么特殊用意吗?我们接下来分析struct{}的作用。struct{} 空结构是没有字段的结构类型。下面看示例:type Demo struct{} var demo struct{}上面定义了一个Demo的结构体,var 声明变量demo结构体。width在介绍空结构前,先来讨论一下这个width。这里说的这个“width”来自于 gc 编译器,它描述类型实例占用的存储字节数(一个字节=8位)。width是类型的一个属性。由于 Go 程序中的每个值都有一个类型,因此该值的width由其类型定义,并且始终是 8 位的倍数。我们可以使用unsafe.Sizeof()函数获取任何值的width:var num int var str string fmt.Println(unsafe.Sizeof(num)) // output: 8 fmt.Println(unsafe.S
在上一篇文章中,我分享了有关context包的第一部分:valueCtx和cancelCtx,我们在这篇文章中继续探索更多内容。WithTimeout 和 WithDeadline我们还是先来一个例子:package main import ( "context" "fmt" "time" ) func main() { cancelCtx, cancel := context.WithTimeout(context.Background(), time.Second*3) defer cancel() go task(cancelCtx) time.Sleep(time.Second * 4) } func task(ctx context.Context) { i := 1 for { select { case <-ctx.Done(): fmt.Println(ctx.Err())
背景context在整个Golang生态体系中被广泛使用,我们在平时开发的时候也会经常用到它,而且Golang的很多标准包都依赖它context。关于context的一些使用方法的应用场景我在前面两篇文章也做了详细介绍,今天这篇文章我们就来介绍context内部的源码。我们先回顾一下context它能解决的一些问题:公共参数或数据的传递通知所有子goroutine优雅退出,从而释放资源业务执行超时或者在截止日期之前执行结束,然后程序优雅地退出或返回上面几种使用方法就不做详细的介绍,下面直接看context包的源码。源码分析我们打开context包里面的context.go文件,发现其实除开注释的一些文档外,差不多也就只有200多行的代码。Context接口和emptyCtxcontext最基本的数据结构是Context如下接口:type Context interface { Deadline() (deadline time.Time, ok bool) Done() <-chan struct{} Err() error Value(key i
介绍今天,我们讨论Go编程中context非常重要的一个东西:context超时。我们先简单举个现实生活中的一个场景:想象一下您在一个游乐场,兴奋地想要坐上巨型过山车。但有一个问题:排队的队伍超级长,而且距离游乐场关闭只有一个小时的时间。你该怎么办?嗯,你可能会等一段时间,但不会等一个小时,对吧?如果你等了 30 分钟但仍未排在队伍的前面,你可以离开队列尝试其他的项目。这个例子就是我们所说的“超时”。现在,想象一下你还在排队,突然下起了大雨。游乐场决定关闭过山车。你肯定不会还坚持去排队等待吧?你会马上离开或者去其他地方。这里就是我们所说的“取消”了。在编程里面,我们经常也会遇到类似的情况。要求我们的程序执行可能需要很长时间或由于某种原因需要停止任务。那么这时候context包发挥作用就来了。它可以让我们能够优雅的去处理这些超时和取消。当然我们在上一篇《goroutine并发控制与通信》文章中也讲到了用context去实现多线程的并发控制与通信,这里我们更详细的去介绍context的使用方法。工作原理我们可以分下面几步去模拟上面的场景:首先创建一个上下文,这里和上面场景的去排队过山车类似
青丝南开
文字、摄影、骑行爱好者