golang源码观感
最近看golang的源码。 整个库的完成体现io Writer Reader的一致性。 从网络,文件,到内存都抽象出Writer Reader。 encoding bufio net包完美体现。 计算机程序就是io。 读入数据。输出数据。 函数 数据从参数中读入。返回值中返回数据。 一切皆文件的unix思想...阅读全文
最近看golang的源码。 整个库的完成体现io Writer Reader的一致性。 从网络,文件,到内存都抽象出Writer Reader。 encoding bufio net包完美体现。 计算机程序就是io。 读入数据。输出数据。 函数 数据从参数中读入。返回值中返回数据。 一切皆文件的unix思想...阅读全文
你愿意做码农吗? 恍然间,发现自己在这个行业里已经摸爬滚打了五年了,原以为自己就凭已有的项目经验和工作经历怎么着也应该算得上是一个业内比较资历的人士了,但是今年在换工作的过程中却遭到了重大的挫折。详细过程我就不再叙述,在此,只想给大家说一说被拒绝的原因,看看大家有没有相似的经历,和类似的感悟。 面试官对我的答复大致是这样的,我们不需要熟练工,我们需要在某领域拥有超过常人的积累认知,和拥有整套完整思维模式和优秀认知事物能力的人…他很诚恳地告诉我,你还年轻,真的应该好好地静下心来,深入地研究一些东西,自己写一些东西,而不是这也用过,那也知道,但是多半都是局限于仅仅见过,会用,却从来没有认真思考过其代码背后蕴含的思想,更少有人研究过源码,进而体会大师们在某些问题的解决上秉承的思想和思维的风格。个人...阅读全文
iota是golang语言的常量计数器,只能在常量的表达式中使用。 iota在const关键字出现时将被重置为0(const内部的第一行之前),const中每新增一行常量声明将使iota计数一次(iota可理解为const语句块中的行索引)。 使用iota能简化定义,在定义枚举时很有用。 举例如下: 1、iota只能在常量的表达式中使用。 fmt.Println(iota) 编译错误: undefined: iota 2、每次 const 出现时,都会让 iota 初始化为0. const a = iota // a=0 const ( b = iota //b=0 c //c=1 ) 3、自定义类型 自增长常量经常包含一个自定义枚举类型,允许你依靠编译器完成自增设置。 type Stere...阅读全文
第一篇go database/sql 源码分析 的文章对其作者(Brad Fitzpatrick大神 memcached的作者 go语言项目组成员)给予高度评价,但是个人认为go database/sql 的实现不是完美无瑕的 优点: 接口设计简单,清晰,一致,友好:应用层的调用接口和驱动层的实现接口几乎一致,使用者毫无压力; 缺点: 包内部实现异常复杂、杂乱,给人一种错觉到底是因为逻辑就复杂还是实现的有问题; 这也是大牛的特点,你不要管我的实现,我只要保持接口的清晰,你只管用就好了,至于内部实现是我自己的事情,我不保证可读性,我可以使用我认为的任何技巧; 个人觉得database/sql包内部实现的不科学的地方: 1.为了实现并发,大量的使用锁的结构: 这个有违golang 的编程哲学,但...阅读全文
《Go语言编程》中 第一个项目是calc,按照作者在书中的描述,在linux下运行没有问题。但经过实践,程序运行后不能打印出书中所描述的效果。 经过测试,发现windows命令行在执行calc add 2 3时,把calc也作为一个参数,这样使得真个程序中的参数数组下标与书中描述的有所不同。 现上传修改后的程序,供大家参考。 calc.go package main import "os" import "fmt" import "simplemath" import "strconv" var Usage = func() { fmt.Println("USAGE: calc command [arguments] ...") fmt.Println("\nThe commands are...阅读全文
一直想将前段时间研究fabric1.0源码的一些心得体会分享出来,一是在写的过程中自己可以加深理解,二是有些地方代码是看过了,但是总感觉看得不到位,没到火候。 看过1.0的同学应该知道,shim与cc与peer之间千丝万缕的关系,剪不断理还乱。写了这么多年的Java,确实觉得Golang代码别扭,而且goroutine+channel的组合简直是阅读者大杀器。但是Golang的好处显而易见,如果fabric用Java实现,一倍的代码量都不止,而且性能差很多。扯远了,总之习惯成自然。 鉴于fabric已经出到1.4了,更新不可谓不快,改动不可谓不大,再来讲解1.0的实现估计大家都没什么兴趣,我就基于新版做一个系列吧,希望能坚持下来。请大家监督...阅读全文
求 recover函数的源码,或者 它的返回值类...阅读全文
前言 在我基于 beego 写博客的时候遇到一个很奇怪的问题,那就是在使用 Memory Cache 类型缓存的时候,缓存不生效很是奇怪,但是使用 redis 就没问题。由于时间问题我就没有深究,毕竟那时候实际上也会选用Memory做缓存的。所以就放了下来,直到今天在群里有人问了同样的问题。我决定去研究一下这个坑。 我们先来看一个例子 Set Cache 代码: var ( urlcache cache.Cache ) func init() { urlcache, _ = cache.NewCache("memory", `{"interval":10}`) } func (this *SetController) Get() { urlcache.Put("test", "test re...阅读全文
导航条基础 导航条(navbar)和上一节介绍的导航(nav),就相差一个字,多了一个“条”字。其实在Bootstrap框架中他们还是明显的区别。在导航条(navbar)中有一个背景色、而且导航条可以是纯链接(类似导航),也可以是表单,还有就是表单和导航一起结合等多种形式。在这一节中将一起探讨Bootstrap框架中导航条的使用。 导航条和导航一样,在Bootstrap框架中是一个独立组件,所以你也可以根据自己的需求使用不同的版本: •LESS版本:对应的源文件navbar.less •Sass版本:对应的源文件_navbar.scss •编译后的版本:查看bootstrap.css文件第3642行~第4111行(注意这个所说的Bootstrap版本是3....阅读全文
上一期我们以1.2版本为背景,介绍了K8S的服务发现和kube-dns插件的相关内容。有了上一期内容作为基础,这期了解最新版本的kube-dns就会容易很多。 本文主要对比1.2和1.4版本中kube-dns 的主要变化,以及最新版本中kube-dns的内部实现。满满的干货来了,你准备好了吗? ## 大纲 ● kube-dns的主要变化 ● kube-dns的实现原理 ● kubedns容器详解 ● dnsmasq容器简介 ● exechealthz容器简介 ## 主要变化 **● 服务发现机制未变化** 也就是说kube-dns对外的接口是基本没变的。变化主要在于kub...阅读全文
文地址: https://www.goinggo.net/2013/07/how-packages-work-in-go-language.html 自从开始用Go编程,如何最好的组织我的代码和使用package这个关键词对我来说很神秘。package关键字类似于C#中使用的namespace,通常将包名和目录结构绑定。 Go有如下web页面尝试解释如何编写Go代码:http://golang.org/doc/code.html 当我开始用Go进行编程时,这是我阅读的第一份文档。它被放在我的手头,主要因为我一直使用Visual Studio开发,代码以solution和工程文件的形式为你打包。 "如何写Go代码"开始于工作空间的概念。想一下你项目的根目录。如果你使用Visual St...阅读全文
选择golang日志库时, 使用logrus的主要原因就是因为star比较多, 而且社区活跃度非常高. 在项目使用过程中, 发现logrus的调用入口, 性能, 插件, 自定义插件, 输出格式等都非常优秀, 值得学习一下 整体结构图 logrus 整体来看总共提供两种方式调用: logrus.Info("hello logrus") logrus.WithField(logruns.Fields{"key1":"v1"}).Info("hello logrus") 这些函数都在exported.go文件中. 当然为了提供不同级别输出日志的功能, 里面实现了各种各样的print函数, 如: Infof, Error, Errorf, Panic等等 在直接使用logrus等情况下exporte...阅读全文
Golang 学习:基础命令 本文内容整理自郝林老师的《go语言第一课》 一、go run 用于运行命令源码文件,只能接收一个命令源码文件以及若干个库源码文件作为参数。先将源码文件编译成临时文件,然后再运行这个临时文件,临时文件可能包括可执行文件和归档文件。这些临时文件如果不做命令标记,会在被运行后被删除。 下面是go run命令常用的标记: –a : 强制编译相关代码文件,无论代码文件是否有更新 –n : 打印编译过程中所需要的命令,但是不执行它 –p N : 并行编译,其中N为CPU逻辑个数 –v : 列出被编译的代码包名称 –work : 显示编译时创建的临时工作目录,注意这些目录并不会删除 –x : 打印编译过程中需要的命令,并执行 二、go build 用于编译源码文件或代码包,编...阅读全文
~~~ go编译 不生成在Bin文件下 而生成在src源码目录下什么问题呢 ~~...阅读全文
今天让官方文档虐了几条街。 需要能够对JSON数据进行编码,将内部的中文字符串转成Unicode编码。编码这种东西接触也不少了,随便搜一下就能解决。果断去搜了一下。本文所有编码 rs := []rune("golang中文unicode编码") j := "" html := "" for _, r := range rs { rint := int(r) if rint < 128 { j += string(r) html += string(r) } else { j += "\\u" + strconv.FormatInt(int64(rint), 16) // json html += "&#" + strconv.Itoa(int(r)) + ";" // 网页 } } fmt....阅读全文
文地址https://mojotv.cn/go/golang-2fa 1. 前言 双重认证(英语:Two-factor authentication,缩写为2FA), 又译为双重验证、双因子认证、双因素认证、二元认证,又称两步骤验证(2-Step Verification,又译两步验证), 是一种认证方法,使用两种不同的元素,合并在一起,来确认用户的身份,是多因素验证中的一个特例. 使用银行卡时,需要另外输入PIN码,确认之后才能使用其转账功能. 登陆电脑版微信时,用已经登录同一账号的手机版微信扫描特定二维码进行验证. 登陆校园网系统时,通过手机短信或学校指定的手机软件进行验证. 登陆Steam和Uplay等游戏平台时,使用手机令牌或Google身份验证器进行验证. 2. TOTP的概念 T...阅读全文
前言: 当我们使用编程语言编写代码时,我们都知道代码都是写给人看的,只是除了人能看外编译器可以编译和执行。而这些复杂的代码其实是一堆堆字符串,只是我们训练编译器拆分解读。 而编译器将一堆堆代码的字符串分组的过程,我们把这个过程称之为词法解析。 本文中工具:lex:3.1golang : 1.13.4 darwin/amd64dlv: 1.3.2编译过程一般分为 6 步:扫描、语法分析、语义分析、源代码优化、代码生成、目标代码优化。 下图来自《程序员的自我修养》 词法解析相关知识: 说到词法解析我们可以关注两个工具:Lex(LEXical compiler)和yacc(Yet Another Compiler Compiler),Lex 是一种生成扫描器的工具。扫描器是一种识别文本中的词汇模式...阅读全文
gorun 是以脚本形式执行go程序代码的工具。 例如一个 go 的源文件:
#!/usr/bin/gorun package main func main() { println("Hello world!") }执行方法:
$ chmod +x hello.go $ ./hello.go Hello world!阅读全文
Go 1.5 之后,由于实现了自举,需要先安装之前的版本,然后得配置 GOROOT_BOOTSTRAP 环境变量: ``` ERROR: Cannot find xxx/go1.4/bin/go. Set $GOROOT_BOOTSTRAP to a working Go tree >= Go 1.4. ``` Go 1.10 之后,不再需要配置该环境变量,能够自动找到,对新手越来越友好了!安装过程的日志输出简单很多 ``` Building Go cmd/dist using /usr/local/go1.9. Building Go toolchain1 using /usr/local/go1.9. Building Go bootstrap cmd/go...阅读全文
# base64Captcha快速生成base64编码图片验证码字符串 支持多种样式,算术,数字,字母,混合模式,语音模式. Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一。Base64编码可用于在HTTP环境下传递较长的标识信息, 直接把base64当成是字符串方式的数据就好了 减少了http请求;数据就是图片; 为APIs微服务而设计 #### 为什么base64图片 for RESTful 服务 Data URIs 支持大部分浏览器,IE8之后也支持. 小图片使用base64响应对于RESTful服务来说更便捷 #### [godoc文档](https://godoc.org/github.com/mojocn/bas...阅读全文
https://github.com/lwldcr/gohive 还没有封装的很完备,后续有时间再更新。 目前网上能找到的hive客户端都是不支持SASL的,需要额外配置hive.server2.authentication为NOSASL。 gohive参考pyhs2这个python包实现了SASL的PLAIN模式认证,其他模式后面看需要酌情添加吧。调试花了不少时间,通过爬Hive的源码,配合log一点点debug出来的,拿出来分享一下,也许有人也会用到 ...阅读全文
``` func NewLogBackend(out io.Writer, prefix string, flag int) *LogBackend { if f, ok := out.(file); ok { println(f) b.f = f } return b } type file interface { Fd() uintptr } out.(file) ``` out.(file)这个语法是怎么解释,菜鸟一只求问。。。? 源码地址:https://github.com/op/go-logging/blob/master/log_windows.go 第77...阅读全文
根据go源码中的time/time.go文件中的代码片段写了一个main方法,如下: package main import ( "fmt" "time" ) // A Weekday specifies a day of the week (Sunday = 0, ...). type Weekday int const ( Sunday Weekday = iota Monday Tuesday Wednesday Thursday Friday Saturday ) var days = [...]string{ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", } // Stri...阅读全文
在使用Go开发web项目的过程中, 数据库读写操作与JSON格式的输入输出是两块最基础的模块, Go的标准库已经帮我们做了很多, 熟悉database/sql与encoding/json这两个库能帮我们更自在地开发web应用. 但此篇文章抛开基础不说, 只说一些在开发中遇到一些真实存在的痛点. 如何处理Null值? Go的一大特色就是zero value, 比如int类型的zero value是0, string为"", struct为每个field里各自类型的zero value. 因此在Go的很多ORM处理NULL值时, 都是通过zero value机制入库或出库的, 因此, 使用ORM操作的数据库, 如何没有明确指明, 基本上看不到NULL值. 一个可能为NULL的varchar字段,...阅读全文
相信很多人都听过这一个故事,一个计算机老师给自己的学生出了到程序题 题目如下: 请用最简单的方法打印如下字符,不用考虑其他任何因素 1 1 2 1 2 3 1 2 3 4 1 2 3 4 5 于是,有一位聪明的同学很快就就在自己的屏幕上打出了这串字符,于是,这位计算机老师过去看了下,他的程序,他说,你的程序写错了,他的程序如下: ``` package main import ( "fmt" ) func main() { var nums []int for i := 1; i < 6; i++ { nums = append(nums, i) for _, num := range nums { fmt.Printf("%d ", num) } fmt.Println() } } ```...阅读全文
4月9号那天,出了一个线上bug,回家分析了半天,主观原因就不说了,客观原因就在于beego提供的编译打包工具bee不支持配置文件检查。。。研究了半天,关于配置文件的预编译检查,我也没啥想法,不过看了看bee的源码,还是懂了不少,记录一下。 围绕bee run命令说一下。 用这个命令,要进入当前包,检查目录./conf/app.conf文件,得到appname。 编译。go install controllers,编译生成静态链接库到pkg文件夹下面。此命令还可编译出执行文件到bin文件夹下面。 生成可执行文件go build -o Cyeam main.go,编译出可执行文件Cyeam。可执行文件的名字就是第一步得到的appnane。 启动应用。 appname = "./" + appn...阅读全文
Mybatis解析判断表达式源码分析在我们开发过程中用 Mybatis 经常会用到下面的例子Mapper如下Map
如题, 公司有个golang 版的API,需要给客户调用,但是不希望开源,有什么办法吗?我看现在go项目引入第三方包的方式都是需要GOPATH/src 下的源码的。求教,谢谢...阅读全文
最近再看 `goim` 源码,发现一个命令还是很不理解,查了下还是没找到答案 安装 $ yum install hg $ go get -u github.com/Terry-Mao/goim $ mv $GOPATH/src/github.com/Terry-Mao/goim $GOPATH/src/goim $ cd $GOPATH/src/goim $ go get ./... 这里的 ` go get ./... ` 是什么意思,实在搞不懂,求解...阅读全文
go 语言源码安装依赖 ,gcc ,make glibc库,等,上述工具安装省略, 另外,其源代码更新采用的是mercurial 工具,安装前先安装mercureal : 1.mercurial安装使用 yum install mercurial 2.设置环境变量在.bash_profile中 #go set export GOROOT=/usr/local/go export GOOS=linux export GOARCH=386 export GOBIN=$GOROOT/bin PATH=$PATH:$GOBIN export PATH alias cdg="cd /project/go" 2.下载go安装包: hg clone -r release https://go.google...阅读全文
导读 都说完成比完美更重要! 软件开发模式经过多年的演化,从传统的瀑布开发模型升级到了敏捷开发模型。 而到了互联网时代,迭代再次加快,产品直接是在互联网上生长。 然而,做产品总是要先出一个版本,再不断迭代,那从0到1的第一步应该怎么走?后续的迭代又应该如何演进呢? 重点笔记 迭代就是小步快跑,把最内核的部分先放出来,不断优化、小范围试错。 版本规划能力是产品经理的重要能力。 判断一个产品经理是否厉害,很重要的一条就是判断他设计的产品第一个版本有多简单、直接、切中要点,能不能直指人心。 产品复杂是因为产品经理不自信,只能从附加功能中找心理安慰。 产品设计应该找到内核,小步快迭代,而不是憋大招。 迭代中,重要的是次序,前一个动作是后一个动作的预动作。 迭代的价值: 对外部,可以快速得到用户的反馈...阅读全文
LiteIDE简介 go语言开发工具,更新至0.1.6,支持WIN32/Linux64bit。 实现特征: *) UTF8文件读写 *) GO语法高亮 *) 项目管理 *) 支持.pro项目编译 *) 支持无项目单独文件编译 *) gopromake自动编译工具 *) 可以从编译错误中定位到源码 项目主页: http://code.google.com/p/golangide/ 项目下载: http://code.google.com/p/golangide/downloads/list 操作系统支持: WIN32 LINUX LiteIDE简介 go语言开发工具,更新至0.1.6,支持WIN32/Linux64bit。 实现特征: *) UTF8文件读写 *) GO语法高亮 *) 项目管理...阅读全文
1:如果安装的版本是>=1.5版本的 需要先安装 go.1.4版本。 1.1为什么需要安装go 1.4版本呢? (已下参考:https://www.kejianet.cn/go-5/) Go 项目组发布了 Go 1.5 的计划,Go 1.5 将使用 Go 1.4 进行构建,Go 源码树将完全消除所有 C 的代码。移除 C 编译器 (5c,6c,8c,9c)。剩下的 C 程序将转成 Go 语言,包括 Go compilers (golang.org/s/go13compiler), 汇编器和连接器 (golang.org/s/go13linker) 以及 cmd/dist. 如果这些程序都采用 Go 编写,这会引发一个在完整构建源码的启动问题 —— 你需要一个可用的 Go 工具链来构建 Go ...阅读全文
今天研究了一下channel的源码,对channel的安全退出有了一些小见解。在此结合实际应用,对select 于channel结合对情况下,安全退出channel做一下记录。场景1:直接退出(会丢失数据) 因为退出时,直接程序就中断了,channel里存对数据直接丢失。package main import ( "fmt" "sync" "time" ) var ( wg sync.WaitGroup channel = make(chan int, 10) ) func main() { //先写满一个channel for i := 0; i < 10; i++ { channel <- i } wg.Add(1) go func() { defer wg.Done() for { s...阅读全文
package main import ( "bufio" "code.google.com/p/mahonia" "fmt" "io" "net" "os" ) func main() { fmt.Println("create a server or client?") reader := bufio.NewReader(os.Stdin) input, _, _ := reader.ReadLine() if string(input) == "server" { Server() } if string(input) == "client" { Client() } else { fmt.Println(Show("err arguments,entering again!.\r\n...阅读全文
本文来自网易云社区作者:孙娇严选iOS客户端的现有打包方式是通过远程连接打包机执行脚本去打包,打完包会输出相应的ipa的二维码,扫一扫二维码可以安装,但是随着测试队伍的壮大,外包同学越来越多,在打包机输入命令的方式可用度越来越低,手动输入命令的缺陷有:1、必须手动输入分支名,和buildversion(手动计算自增)2、远程连接打包机不稳定,经常断线,影响效率3、切换分支不方便(还经常切换失败)基于以上的各个问题,我决定改造一下现有的打包方式,让任何一个新来的测试同学都可以直接动手自己打包,最终定下的方案是:底层使用fastlane来执行打包(不要问我选它的原因,毕竟github上有2w的star,好处自然是多到不用说),然后使用Jenkins来执行打包脚本,最终依然生成二维码以供方便的扫码...阅读全文
在Go语言中根据如下的数字2006-01-02 15:04:05标示格式,当时觉得很奇怪,后来看了源码才知道作者设计的原因 The reference time used in the layouts is the specific time: Mon Jan 2 15:04:05 MST 2006 which is Unix time 1136239445. Since MST is GMT-0700, the reference time can be thought of as 01/02 03:04:05PM ‘06 -0700 参考: format.go $(function () { $('pre.prettyprint code').each(function () { var...阅读全文
//下载插件工具 go get -v github.com/gpmgo/gopm //自动导入包插件 gopm get -g -v golang.org/x/tools/cmd/goimports //转码插件 gopm get -g -v golang.org/x/text //自动检测网页编码 gopm get -g -v golang.org/x/net/html package main import ( "net/http" "io/ioutil" "fmt" "golang.org/x/text/transform" "io" "golang.org/x/text/encoding" "golang.org/x/net/html/charset" "bufio" "regexp"...阅读全文
Golang: 思路:DFS 代码如下: func allPathsSourceTarget(graph [][]int) [][]int { var res [][]int path:=[]int{0} dfs797(graph,&path,&res) return res } func dfs797(graph [][]int,path *[]int,res *[][]int){ temp:=(*path)[len(*path)-1] if temp==len(graph)-1{ cpy:=make([]int,len(*path)) copy(cpy,*path) *res=append(*res,cpy) return } if len(graph[temp])==0{ return...阅读全文
在阅读 编译原理相关书籍时,意识到编译器设计本质上是语言翻译的简化问题; 我们把高级语言书写的代码,通过编译器 + 解释器 的过程 变成计算机可以理解的机器码;就是相当于把一段文字翻译给一个外国人听;当然编译器的翻译工作要比自然翻译的过程简单很多;但是设计思想可以借鉴; 现在选取一个角度,来思考一些问题; 一个由语言L编写的,将语言X程序文件翻译成语言Y程序文件的翻译程序称为编译器,记作CLXY 编译器应该选择什么语言来实现呢?假设没有任何前人的工作,那必须用汇编写一套编译器去编译高级语言,编译器毫无疑问是一项复杂的工作的,用汇编这种低级语言去直接实现它,基本上是一个难到无法发成的工作;这是一个核心问题,汇编实现编译器这种复杂软件难度太大! 先放下上面的问题稍后再说,假设已经历经千辛万苦实现...阅读全文
Golang: 思路:简单的并查集问题 代码如下: func findCircleNum(M [][]int) int { res:=len(M) students:=make([]int,len(M)) for k,_ :=range students{ students[k]=k } for i:=0;i
01.chan 的数据结构: golang 中 chan 的源码在 src/runtime/chan.go 文件中,hchan 则为 chan 的结构体 hchan: type hchan struct { qcount uint // 当前缓存数据的总量 dataqsiz uint // 缓存数据的容量 buf unsafe.Pointer // 缓存数据,为一个循环数组,容量大小为 dataqsiz,当前大小为 qcount elemsize uint16 // 数据类型的大小,比如 int 为 4 closed uint32 // 标记是否关闭 elemtype *_type // 数据的类型 sendx uint // 发送队列 sendq 的长度 recvx uint // 接收队...阅读全文
介绍 package io主要包含以下文件: io.go 基础的io操作,如读写,较底层 multi.go 多个Reader封装成一个 pipe.go ioutil 常用操作 ioutil.go 封装了ioutil tempfile.go 有关创建临时文件 Reader & Writer 这两个接口是用途最广的接口之一,所以重点学习一下,后续会用在os,net等各种常用包。 io.Reader type Reader interface { Read(p []byte) (n int, err error) } io.Writer type Writer interface { Write(p []byte) (n int, err error) } 具体例子,以strings.Reader...阅读全文
最近写一个文档,由于文档太长,加上页面导航后,发现页面导航只能在页面顶部,查看文档很不方便。所以就写了个工具可以把生成好的HTML页面顶部导航移到左侧。我自己觉得挺好用的就分享出来了。 ```text 程序使用方式: ./mdleft -s ./test.html -d ./test_v0.1.0.html -t markdown左侧导航 说明: -s 原HTML文件 -d 输出文件 -t 左侧导航标题和HTML文件标题 ``` ---  --- --- ## 源码 ```go package main import (...阅读全文
注:该文作者是 Katrina Owen,原文地址是 iota: Elegant Constants in Golang 有些概念有名字,并且有时候我们关注这些名字,甚至(特别)是在我们代码中。 const ( CCVisa = "Visa" CCMasterCard = "MasterCard" CCAmericanExpress = "American Express" ) 在其他时候,我们仅仅关注能把一个东西与其他的做区分。有些时候,有些时候一件事没有本质上的意义。比如,我们在一个数据库表中存储产品,我们可能不想以 string 存储他们的分类。我们不关注这个分类是怎样命名的,此外,该名字在市场上一直在变化。 我们仅仅关注它们是怎么彼此区分的。 const ( CategoryBook...阅读全文
关键词:delve 安装delve 确保编译工具存在,如果不在的话,则安装 $ xcode-select --install 安装delve $ go get -u github.com/go-delve/delve/cmd/dlv delve会将源码下载到$GOPATH下的src目录下 开启开发者模式 $ sudo /usr/sbin/DevToolsSecurity -enable 通过vscode打开工程,安装Go language support image.png 配置launch.json image.png 配置信息示例如下: { "version": "0.2.0", "configurations": [ { "name": "Launch", "type": "go", ...阅读全文
// string转[]byte a := "hello world" arr := []byte(a) // []byte转string str := fmt.Sprintf("%x", arr) // str := string(arr)//这种转string的方式会出现乱码 顺便给出golang中的sha1算法调用 h := sha1.New() h.Write([]byte(timeStamp + nonce + token)) res := fmt.Sprintf("%x", h.Sum(nil)...阅读全文
我想通过源码学习httprouter 发现下面这句话,但是不知道意义何在,谢谢解答 https://github.com/julienschmidt/httprouter/blob/master/router.go line: 165 // Make sure the Router conforms with the http.Handler interface var _ http.Handler = New() 注释说是确保实现 ServeHTTP 接口,但是是怎么确保的呢...阅读全文
日志中打印源码文件名和行号,是非常实用的功能,尤其是开发阶段的debug日志,可以快速通过日志找到对应的源码位置。 Go标准库中的package log也支持打印源码文件名和行号,打开方式是设置以下两个标志中的任意一个: Llongfile // full file name and line number: /a/b/c/d.go:23 Lshortfile // final file name element and line number: d.go:23. overrides Llongfile 标准库中所有的日志打印最后都要调用Output函数,再在里面调用runtime.Caller获取源码文件名和行号: // package log func (l *Logger) Outpu...阅读全文