Go 系列教程 —— 5. 常量

这是我们 Golang 系列教程的第 5 篇。 ### 定义 在 Go 语言中,术语"常量"用于表示固定的值。比如 `5` 、`-89`、 `I love Go`、`67.89` 等等。 看看下面的代码: ```go var a int = 50 var b string = "I love Go" ``` **在上面的代码中,变量 `a` 和 `b` 分别被赋值为常量 `50` 和 `I love GO`**。关键字 `const` 被用于表示常量,比如...阅读全文

2017-12-07 15:06:56 polaris
阅读:26354 评论:15

golang channel 使用总结

[原文地址](http://litang.me/post/golang-channel/) 不同于传统的多线程并发模型使用共享内存来实现线程间通信的方式,golang 的哲学是通过 channel 进行协程(goroutine)之间的通信来实现数据共享: > Do not communicate by sharing memory; instead, share memory by communicating. 这种方式的优点是通过提供原子的通信原语,避免了竞态情形(race cond...阅读全文

2018-11-09 15:34:34 darlingtangli
阅读:1128 评论:2

【Go】优雅的读取http请求或响应的数据

原文链接:https://blog.thinkeridea.com/... 从 http.Request.Body 或 http.Response.Body 中读取数据方法或许很多,标准库中大多数使用 ioutil.ReadAll 方法一次读取所有数据,如果是 json 格式的数据还可以使用 json.NewDecoder 从 io.Reader 创建一个解析器,假使使用 pprof 来分析程序总是会发现 bytes.makeSlice 分配了大量内存,且总是排行第一,今天就这个问题来说一下如何...阅读全文

2019-01-26 20:34:41 thinkeridea
阅读:1656 评论:0

golang 进度条功能实现

最近在做一个需求,功能很简单,就是开发一个轻量级客户端,将一个指定文件中的内容通过TCP发送到服务器。由于该文件特别大,有可能到达100G的数量级,因此处理起来会比较慢,为了给用户提供比较友好的展示界面,因此,在其中加入了进度条显示功能。 在这里,说一下我在实现该进度条功能时的一些思路。 成果演示 先看一下最终的成品效果展示: 该进度条一共分三部分组成,第一部分是主体进度条,第二部分是百分比,第三部分是当前完成的数据和总数据的一个动态展示。 源码分析 由于是要在终端上打印出进度条的效果,因此,主...阅读全文

2020-07-31 14:32:35 禹鼎侯
阅读:3856 评论:0

Go 每日一库之 mapstructure

简介mapstructure用于将通用的map[string]interface{}解码到对应的 Go 结构体中,或者执行相反的操作。很多时候,解析来自多种源头的数据流时,我们一般事先并不知道他们对应的具体类型。只有读取到一些字段之后才能做出判断。这时,我们可以先使用标准的encoding/json库将数据解码为map[string]interface{}类型,然后根据标识字段利用mapstructure库转为相应的 Go 结构体以便使用。快速使用本文代码采用 Go Modules。首先创建目录...阅读全文

2020-08-03 20:32:33 darjun
阅读:689 评论:0

Go 中可取消的读取操作

在使用 Go 进行工作时,使用 `io.Reader` 和 `io.Writer` 接口是最常见的情场景之一。这很合理,它们是数据传输的主力接口。 关于 `io.Reader` 接口,有一点令我困惑:它的 `Read()` 方法是阻塞的,一旦读取操作开始,你没有办法去抢占它。同样,也无法在读取操作上执行 `select` 操作,异步协调多个 `io.Reader` 时的读取操作会有点棘手。 `io.ReadCloser` 是 Go 提供的一个常用的退出通道,在许多情况下,它确实允许你...阅读全文

2020-08-18 14:49:05 DoubleLuck
阅读:1861 评论:0

为什么 Golang 函数赋值会产生内存分配?

缘起这几天在重构某段代码后,做了一次性能测试,火焰图中发现了一个十分奇怪的runtime.newobject的调用,大致占用2%,而找遍了整段代码都没有发现有新建对象相关的逻辑。于是迫不得已,祭出了汇编大法,终于定位到了问题所在。这篇文章会使用一段最小可复现的代码来分享这个问题以及背后的原因。Show me the code12345678910111213141516171819202122232425262728293031323334353637383940414243444546pack...阅读全文

阅读:738 评论:0

Dockerfile文件万字全面解析

Dockerfile是一个文本文件,包含一些Docker指令。执行docker build,Docker就会执行Dockerfile里面的指令,来自动创建镜像。 用法 image-20200822110105335_副本.png Dockerfile里面的指令可以访问context这些文件。 context是递归的,PATH包含所有子目录,URL包含所有子模块。 例子,把当前目录当做context, $ docker build . Sending build context to Docker...阅读全文

2020-08-25 22:32:42 东方888888
阅读:623 评论:0

golang实现jwt

go实现jwt-demo 1.JSON web token(jwt) 是自己携带一些信息,jwt现在越来越流行原因如下: ·1.jwt是无状态,因此不需要任何数据库来存储 2.jwt签名是安全 3.jwt可以设置有效时间,可以减少黑客攻击 jwt官网介绍 2.用户登录之后生成token func Login(c *gin.Context) { var user models.User if err := c.ShouldBindJSON(&user); err != nil { c.JSON(h...阅读全文

2020-09-01 20:32:40 左洁
阅读:1467 评论:0

我的golang error 最佳实践

背景在完成API接口、公共包给他人使用等类似工作时,除了对外提供功能外,文档也是非常重要的内容。文档输出的是可复制的能力,使用者通过文档快速学习了解使用,而不用多次找到开发人员重复答疑。其中问的最多最频繁的就是错误码定义了,通常是需要给出所有返回错误的文档。本文将分享我golang中error最佳实践,该实践不仅编码非常简单,而且做到了代码即文档,写完就自动生成了交付文档。直接上代码package api import ( "fmt" "runtime" "strconv" "strings" ...阅读全文

2021-02-01 10:14:03 mb6013c3565bec6
阅读:877 评论:0

Golang面向对象编程之构造函数【struct&new】

Golang面向对象编程之构造函数【struct&new】 201808 构造函数是一种特殊的方法,主要用来在创建对象时初始化对象,即为对象成员变量赋初始值。特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们,即构造函数的重载。 Golang里面没有构造函数,但是Golang却可以像C++一样实现类似继承、构造函数一样等面向对象编程的思想和方法。Golang里面要实现相关的构造函数定义可以通过通过new来创建构造函数。 一个简单的构造函数的实现 定义一个结构 ty...阅读全文

2021-04-02 11:22:36 mob604756e7db9c
阅读:351 评论:0

Golang的反射reflect深入理解和示例

Golang的反射reflect深入理解和示例 【记录于2018年2月】 编程语言中反射的概念 在计算机科学领域,反射是指一类应用,它们能够自描述和自控制。也就是说,这类应用通过采用某种机制来实现对自己行为的描述(self-representation)和监测(examination),并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。 每种语言的反射模型都不同,并且有些语言根本不支持反射。Golang语言实现了反射,反射机制就是在运行时动态的调用对象的方法和属性,官方自...阅读全文

2021-04-02 11:27:16 mob604756e7db9c
阅读:331 评论:0

go中x/sync/semaphore解读

go中x/sync/semaphore解读semaphoreAcquireTryAcquireReleasesemaphore的作用如何使用分析下原理总结参考semaphoresemaphore的作用信号量是在并发编程中比较常见的一种同步机制,它会保证持有的计数器在0到初始化的权重之间,每次获取资源时都会将信号量中的计数器减去对应的数值,在释放时重新加回来,当遇到计数器大于信号量大小时就会进入休眠等待其他进程释放信号。go中的semaphore,提供sleep和wakeup原语,使其能够在其它同...阅读全文

2021-04-03 21:27:27 mb6063e380e7d47
阅读:571 评论:0

golang 性能优化分析:benchmark 结合 pprof

前面 2 篇 golang 性能优化分析系列文章:golang 性能优化分析工具 pprof (上)golang 性能优化分析工具 pprof (下)一、基准测试 benchmark 简介在 golang 中,可以通过 benchmark 基准测试来测试代码性能。基准测试主要是通过测试 cpu 和内存的效率问题,来评估被测试代码的性能。基准测试的指标:程序所花费的时间内存使用的情况cpu 使用情况基准测试文件名和函数规定:go 基准测试文件都是以 _test.go 结尾,和单元测试用例在同一个文...阅读全文

2021-04-03 21:41:21 mb6063e380e7d47
阅读:823 评论:0