golang

Golang error 的突围

℡╲_俬逩灬. 提交于 2019-11-29 23:19:34
目录 error 的困局 尝试破局 Errors are just values handle not just check errors Only handle errors once 小结 胎死腹中的 try 提案 go 1.13 的改进 fmt.Errorf Unwrap Is As 总结 参考资料 写过 C 的同学知道,C 语言中常常返回整数错误码(errno)来表示函数处理出错,通常用 -1 来表示错误,用 0 表示正确。 而在 Go 中,我们使用 error 类型来表示错误,不过它不再是一个整数类型,是一个接口类型: type error interface { Error() string } 它表示那些能用一个字符串就能说清的错误。 我们最常用的就是 errors.New() 函数,非常简单: // src/errors/errors.go func New(text string) error { return &errorString{text} } type errorString struct { s string } func (e *errorString) Error() string { return e.s } 使用 New 函数创建出来的 error 类型实际上是 errors 包里未导出的 errorString 类型,它包含唯一的一个字段 s

Go Modules使用教程

爱⌒轻易说出口 提交于 2019-11-29 22:24:29
Go Modules 不完全教程 文章转载自公众号 Golang 成神之路 , 作者 L Go Modules 是 Golang 官方最近几个版本推出的原生的包管理方式,在此之前,社区也不乏多种包管理方案。在讨论 Go Modules 之前,我们先回顾一下 Golang 的包管理历史的发展。然后讨论一下 Go Modules 的使用以及一些特性,篇幅有限,有些地方不方便展开,后面有时间再深入。行文仓促,不当之处,多多指教。 0. 包管理的历史 Golang 的包管理一直被大众所诟病的一个点,但是我们可以看到现在确实是在往好的方向进行发展。下面是官方的包管理工具的发展历史: 在 1.5 版本之前,所有的依赖包都是存放在 GOPATH 下,没有版本控制。这个类似 Google 使用单一仓库来管理代码的方式。这种方式的最大的弊端就是无法实现包的多版本控制,比如项目 A 和项目 B 依赖于不同版本的 package,如果 package 没有做到完全的向前兼容,往往会导致一些问题。 1.5 版本推出了 vendor 机制。所谓 vendor 机制,就是每个项目的根目录下可以有一个 vendor 目录,里面存放了该项目的依赖的 package。 go build 的时候会先去 vendor 目录查找依赖,如果没有找到会再去 GOPATH 目录下查找。 1.9 版本推出了实验性质的包管理工具

Golang理解-匿名结构体

ぐ巨炮叔叔 提交于 2019-11-29 22:01:45
结构体嵌套 go中使用结构体嵌套来扩展类型 嵌入到结构体中的字段,完全可以当作自己是自己的字段 import "image/color" type Point struct{ X, Y float64 } type ColoredPoint struct { Point Color color.RGBA } ColoredPoint嵌套了Point结构体,从而ColoredPoint就拥有了Point的字段X,Y。 可以直接通过"."操作符来访问; 如果Point拥有自己的方法,那么ColoredPoint也拥有这些方法,而不需要在自己定义 用这种方式,内嵌可以使我们定义字段特别多的复杂类型,我们可以将字段先按小类型分组,然后定义小类型的方法,之后再把它们组合起来。 读者如果对基于类来实现面向对象的语言比较熟悉的话,可能会倾向于将Point看作一个基类,而ColoredPoint看作其子类或者继承类,或者将ColoredPoint看作"is a" Point类型。 但这是错误的理解 。请注意上面例子中对Distance方法的调用。Distance有一个参数是Point类型,但q并不是一个Point类,所以尽管q有着Point这个内嵌类型,我们也必须要显式地选择它。尝试直接传q的话你会看到下面这样的错误:---go语言圣经 var p = ColoredPoint{Point{1,

Atitit golang开发环境搭建 目录 1. 编辑helo.go 1 1.1. 调试编译 1 2. Ide选择liteide 2 3. 问题解决 2 4. 附录 2 4.1. Go语言标准库常

怎甘沉沦 提交于 2019-11-29 21:51:21
Atitit golang开发环境搭建 目录 1. 编辑helo.go 1 1.1. 调试编译 1 2. Ide选择liteide 2 3. 问题解决 2 4. 附录 2 4.1. Go语言标准库常用的包及功能 2 4.2. golang调试工具delve 之前一直在烦心不知道怎么打印所有goroutine的stack,最近终于发现一个该工具。 4 编辑helo.go // gohelo package main import ( "fmt" ) func main() { fmt .Println( "Hello World! attilaz" ) } 调试编译 生产 C:/BaiduYunDownload/liteide/x36.1/liteide/bin/dlv.exe --headless --api-version=2 --accept-multiclient exec C:/Users/aaa.ATTILAXPC188/aaa.ATTILAXPC188.debug.exe [C:/Users/aaa.ATTILAXPC188] time="2019-09-17T18:28:02+08:00" level=warning msg="CGO_CFLAGS already set, Cgo code could be optimized." layer=dlv C:

golang时间戳

柔情痞子 提交于 2019-11-29 20:51:09
/* go时间戳 程序的一个通常需求是 计算从unix起始时间开始 到某个时刻的秒数 毫秒数 微妙数 */ package main import ( "fmt" "time" ) func main() { /* 使用unix UnixNano 来分别获取从Unix起始时间到现在所经过的秒数和微妙数 */ now := time.Now() secs := now.Unix() nanos := now.UnixNano() fmt.Println(now) millis := nanos / 1000000 time.Unix(secs, 0) time.Unix(0, nanos) } 来源: https://blog.csdn.net/boshuzhang/article/details/100916027

zz`golang import基础

社会主义新天地 提交于 2019-11-29 19:01:44
一 包的导入语法 在写Go代码的时候经常用到import这个命令用来导入包文件,看到的方式参考如下: import( "fmt" ) 然后在代码里面可以通过如下的方式调用 fmt.Println("hello world") 上面这个fmt是Go语言的标准库,他其实是去GOROOT下去加载该模块,当然Go的import还支持如下两种方式来加载自己写的模块: 相对路径 import "./model" //当前文件同一目录的model目录,但是不建议这种方式import 绝对路径 import "shorturl/model" //加载GOPATH/src/shorturl/model模块 上面展示了一些import常用的几种方式,但是还有一些特殊的import,让很多新手很费解,下面是三种导入包的使用方法。 1. 点操作 有时候会看到如下的方式导入包 import( . “fmt” ) 这个点操作的含义就是这个包导入之后在你调用这个包的函数时,你可以省略前缀的包名,也就是前面你调用的fmt.Println(“hello world”) 可以省略的写成Println(“hello world”) 2. 别名操作 别名操作顾名思义可以把包命名成另一个用起来容易记忆的名字 import( f “fmt” ) 别名操作调用包函数时前缀变成了重命名的前缀,即f.Println(“hello

golang panic的错误回收和简单的使用场景

为君一笑 提交于 2019-11-29 18:33:20
golang panic的错误回收和简单的使用场景 代码示例 package main import( "fmt" ) func main(){ _,err:=deferPanic(8,0) if err!=nil{ fmt.Println(err) } fmt.Println("这里还是会执行的") } //panic 回收测试 func deferPanic(x,y int)(z int,err error){ //使用defer回收接收panic值 defer func(){ if e:=recover();e!=nil{ err = e.(error) fmt.Println("看来deferPanic出错了",err) } }() z = x/y return } 注意:deferPanic返回值的设计。返回值里面有声明变量了,这就相当与deferPanic中的一个变量,并且deferPanic返回值为变量的值。 原因:减少在函数中定义变量的代码 return、panic、defer的执行顺序 panic先捕获错误信息 执行return defer回收错误信息 应用 用于无法预知的错误。例如:数组方面、map 来源: https://www.cnblogs.com/MyUniverse/p/11526284.html

使用SWIG桥接Golang和Windows DLL

柔情痞子 提交于 2019-11-29 18:06:15
最近看了下Go语言,利用Dynamsoft Barcode SDK做了一个简单的Golang条形码扫描。这里分享下如何使用SWIG来快速封装底层C/C++接口。 参考原文: How to Use SWIG to Link Windows DLL with Golang 作者: Xiao Ling 翻译:yushulx 下载安装 mingw-w64 SWIG Go Dynamsoft Barcode Reader 如何使用SWIG实现Cgo封装 运行cmd.exe,设置GOPATH: set GOPATH=f:\go-project set DBR=<Dynamsoft Barcode Reader Directory> 创建一个package: mkdir %GOPATH%\src\github.com\dynamsoftsamples\go-barcode-reader\dbr 从SDK目录中把 DynamsoftBarcodeReaderx64.dll 拷贝到 %GOPATH%\src\github.com\dynamsoftsamples\go-barcode-reader\dbr\bin 。 接下来把头文件都拷贝到 %GOPATH%\src\github.com\dynamsoftsamples\go-barcode-reader\dbr\include 。 创建dbr.c

像Go一样写Java,从Go的特性,讨论一种编程风格。

非 Y 不嫁゛ 提交于 2019-11-29 15:41:48
上篇转帖的blog里面提到了Go的特性,作为编写Java时也可以给自己点编程风格的参考。 下面是提到的改进 下面简单学习和分析一下重点的风格提示,领会Ken和Pike的编程思想: 规范的语法(不需要符号表来解析) 垃圾回收(独有) 无头文件 明确的依赖 无循环依赖 常量只能是数字 int和int32是两种类型 字母大小写设置可见性(letter case sets visibility) 任何类型(type)都有方法(不是类型) 没有子类型继承(不是子类) 包级别初始化以及明确的初始化顺序 文件被编译到一个包里 包package-level globals presented in any order 没有数值类型转换(常量起辅助作用) 接口隐式实现(没有“implement”声明) 嵌入(不会提升到超类) 方法按照函数声明(没有特别的位置要求) 方法即函数 接口只有方法(没有数据) 方法通过名字匹配(而非类型) 没有构造函数和析构函数 postincrement(如++i)是状态,不是表达式 没有preincrement(i++)和predecrement 赋值不是表达式 明确赋值和函数调用中的计算顺序(没有“sequence point”) 没有指针运算 内存一直以零值初始化 局部变量取值合法 方法中没有“this” 分段的堆栈 没有静态和其它类型的注释 没有模板 没有异常

golang接口的封装

独自空忆成欢 提交于 2019-11-29 15:08:23
一、声明接口 1 type Result interface { 2 LastInsertId() (int64, error) 3 RowsAffected() (int64, error) 4 } 二、实现接口,这里却将接口作为成员变量,进而将接口的实现转换为接口的调用,仅仅是封装了接口,实际上并没有真的实现,而是坐等别人去实现 1 // 一把锁 2 // 一个结果集的假接口实现,表示需要的功能,让他人来具体实现。假装实现了某个接口,其实是调用了内部接口的对应方法 3 type driverResult struct { 4 sync.Locker 5 resi driver.Result 6 } 7 // Result 是对已执行 SQL 命令的总结,。 8 // LastInsertId() 会返回一个由数据库生成的整数, 这个整数是对命令的响应。 在插入一个新的数据行时, 这个整数通常来源于数据表中的自增数据列。 9 // 并不是所有数据库都支持这个特性, 并且各个数据库在实现这个特性时使用的语句也会有所不同。 10 // RowsAffected() 返回受到更新、插入或者删除操作影响的行数量, 并不是所有数据库或者所有数据库驱动都支持这个特性。 11 type Result interface { 12 LastInsertId() (int64, error) 13