Go语言中文网 为您找到相关结果 539

golang利用fmt.Stringer 接口实现自定义日志打印

标准库fmt包中定义了 // Stringer is implemented by any value that has a String method, // which defines the ``native'' format for that value. // The String method is used to print values passed as an operand // to any format that accepts a string or to an unformatted printer // such as Print. type Stringer interface { String() string } 任何对象定义了String方法,即可以St...阅读全文

博文 2019-03-20 14:34:41 yhao917

【转载】使用Golang工作400天后的感受

【转载】使用Golang工作400天后的感受 转载: https://blog.csdn.net/kwame211/article/details/79267088 我在2011年就听说了Go并学习了一段时间,坦白的说,那时候对Go是比较无感的,因为并没有看到Go特别亮眼的地方,可能和我使用C、Erlang、Java有关,这三种语言可以写高性能、高并发、高可用的服务;包含了面向过程、面向并发、面向对象的思想,我觉得我并不需要再学习Go,何况那个时候好像也没宣传的那么优秀。 一切都发生在418天前,因为工作的需要,我开始写Go了,本来预期是一段压抑的旅程(被迫使用其它语言的同学可能都会有此感受),结果收获了非一般的惊喜、非一般的效率、非一般的开发体验。 先用几个词来总结一下我的感受:简洁、标准...阅读全文

博文 2019-12-23 05:33:47 抚琴煮酒

为 Go Mutex 实现 TryLock 方法

目录 [−] 使用 unsafe 操作指针实现自旋锁使用 channel 实现性能比较参考资料 Go标准库的sync/Mutex、RWMutex实现了sync/Locker接口, 提供了Lock()和UnLock()方法,可以获取锁和释放锁,我们可以方便的使用它来控制我们对共享资源的并发控制上。 但是标准库中的Mutex.Lock的锁被获取后,如果在未释放之前再调用Lock则会被阻塞住,这种设计在有些情况下可能不能满足我的需求。有时候我们想尝试获取锁,如果获取到了,没问题继续执行,如果获取不到,我们不想阻塞住,而是去调用其它的逻辑,这个时候我们就想要TryLock方法了。 虽然很早(13年)就有人给Go开发组提需求了,但是这个请求并没有纳入官方库中,最终在官方库的清理中被关闭了,也就是官方库...阅读全文

博文 2017-06-21 03:32:58 smallnest

centos6.5 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 ...阅读全文

博文 2018-07-31 10:34:49 sun_line

gRPC+gRPC Gateway 能不能不用证书?

如果你以前有涉猎过 gRPC+gRPC Gateway 这两个组件,你肯定会遇到这个问题,就是 “为什么非得开 TLS,才能够实现同端口双流量,能不能不开?” 又或是 “我不想用证书就实现这些功能,行不行?”。我被无数的人问过无数次这些问题,也说服过很多人,但说服归说服,不代表放弃。前年不行,不代表今年不行,在今天我希望分享来龙去脉和具体的实现方式给你。 原文地址:gRPC+gRPC Gateway 能不能不用证书? 过去 为什么 h2 不行 因为 net/http2 仅支持 "h2" 标识,而 "h2" 标识 HTTP/2 必须使用传输层安全性(TLS)的协议,此标识符用于 TLS 应用层协议协商字段以及识别 HTTP/2 over TLS。 简单来讲,也就 net/http2 必须使用 ...阅读全文

博文 2019-06-22 10:32:38 煎鱼

Go编码规范指南

自 序言 看过很多方面的编码规范,可能每一家公司都有不同的规范,这份编码规范是写给我自己的,同时希望我们公司内部同事也能遵循这个规范来写Go代码。如果你的代码没有办法找到下面的规范,那么就遵循标准库的规范,多阅读标准库的源码,标准库的代码可以说是我们写代码参考的标杆。 格式化规范 go默认已经有了gofmt工具,但是我们强烈建议使用goimport工具,这个在gofmt的基础上增加了自动删除和引入包.go get golang.org/x/tools/cmd/goimports 不同的编辑器有不同的配置, sublime的配置教程:http://michaelwhatcott.com/gosublime-goimports/LiteIDE默认已经支持了goimports,如果你的不支持请点击...阅读全文

博文 2017-03-05 19:45:26 紫若丹枫

golang 标准库间依赖的可视化展示

简介 预览 国庆看完 << Go 语言圣经 >>,总想做点什么,来加深下印象.以可视化的方式展示 golang 标准库之间的依赖,可能是一个比较好的切入点.做之前,简单搜了下相关的内容,网上也要讨论,但是没有发现直接能拿过来用的.标准库之间,是必然存在依赖关系的,不同库被依赖的程度必然是不一样的.但究竟有多大差别呢? 以下内容,数据源自真实环境的 golang 1.9 版本的标准库.所以,本文不仅是一篇可视化相关的讨论文章,更是提供了一个可以直接探究 golang 标准库间依赖关系的快速梳理工具. 数据准备 标准库各个包之间的相互关系,可以直接通过命令获取,然后简单变换为一个标准的 JSON 对象: go list -json std 示例输出: { "Dir": "/usr/local/g...阅读全文

博文 2017-10-08 20:34:48 ios122

golang标准库io

本文主要为学习《Go语言标准库》https://books.studygolang.com/The-Golang-Standard-Library-by-Example的笔记 Go语言中的IO操作封装在以下4个包中: 1) io: 为IO原语(I/O primitives)提供基本的接口。 2) io/ioutil: 封装一些实用的I/O函数。 3) fmt: 实现格式化I/O。 4) bufio: 实现带缓冲I/O。 1. io——基本的IO接口 该包主要内容是定义了很多io相关的interface,作为标准库中其它函数的参数出现,其中最基础重要的两个接口是io.Reader和io.Writer。 type Reader interface { Read(p []byte) (n int,...阅读全文

博文 2018-08-10 18:30:03 xiaochuizi

Go语言学习笔记9

5.Go语言流程控制方法 5.2 defer语句 defer 语句被用于预定对一个函数的调用。被 defer 语句调用的函数称为延迟函数。defer 语句只能出现在函数或方法的内部。 一条 defer 语句总是以关键字 defer 开始。在 defer 的右边还会有一条表达式语句,且它们之间要以空格分隔。例如: defer fmt.Println("The finishing touches.") 如上的表达式语句必须代表一个函数或方法的调用。但是像针对各种内建函数的那些调用表达式,因为它们并不能称为表达式语句,所以不允许出现在这里。同时这个位置出现的表达式语句是不能被圆括号括起来的。 defer 语句的执行时机总是在直接包含它的那个函数(简称外围函数)把流程控制权交还给它的调用方的前一刻,...阅读全文

博文 2016-08-09 14:00:02 u012855229

golang讲解(go语言)标准库分析之os(5)

/*640*60,创建于2013-5-24*/ var cpro_id = "u1290382"; Golang标准库 今天我们继续os包分析~~~木有废话~~ (1)os.Rename()这个函数的原型是func Rename(oldname, newname string) error,输入的是旧文件名,新文件名,然后返回一个error其实这个函数的真正实现用的syscall.Rename()然后通过MoveFile(from *uint16, to *uint16) (err error) = MoveFileW来重新命名这个我们讲syscall的时候再给大家说 [php] import ( "fmt" "os" ) func main() { err := os.Rename("1....阅读全文

博文 2017-02-09 18:38:49 widuu

Golang使用心得

Golang使用心得 转自:http://blog.jobbole.com/84554/ 13年上半年接触了Golang,对Golang十分喜爱。现在是2015年,离春节还有几天,从开始学习到现在的一年半时间里,前前后后也用Golang写了些代码,其中包括业余时间的,也有产品项目中的。一直有想法写点Golang相关的总结或者感想,决定还是在年前总结下吧。注明下:我只是Golang的喜好者,不是脑残粉,也无意去挑起什么语言之争。 特性少,语法简单。GO是崇尚极简主义的,提倡少即是多。这点在它的Spec上尤其凸显,一下午的时间绝对可以看完。GO的特性很少,很多GO的使用者都反馈,GO的关键字至少完全可以记在大脑里。同时它的语法极为简单,而且语义清晰。 部署方便。GO是一个强类型静态语言,可以...阅读全文

博文 2016-08-06 18:00:02 yueguanyun

golang中compress/bzip2

一、bzip2的简介 bzip2包实现bzip2的解压缩,bzip2是对单个文件进行压缩,可以先进行tar归档,然后进行压缩。 二、bzip2的使用 go标准库中提供了一个对bzip2压缩包进行读取的操作,但是并没有提供进行bzip2压缩操作。 package main import ( "compress/bzip2" "os" "log" "fmt" ) func main() { fz, err := os.Open("1.go.bz2") if err != nil { log.Fatal(err) } w := bzip2.NewReader(fz) buf := make([]byte, 1024 * 100) for { n, err := w.Read(buf) if n =...阅读全文

博文 2018-12-06 16:34:47 laijh

Golang web之http标准库简析

本文首先介绍使用http标准库搭建web服务,共三种方式,然后简析内部实现原理,最后对http的使用做出总结。阅读本文需要简单的go基础知识和web开发相关知识。 1.使用http搭建简单的web服务 1.1 单个handler形式 func main() { server := http.Server{ Addr: "127.0.0.1:8081", Handler: &helloHandler{}, } _ = server.ListenAndServe() } type helloHandler struct{} func (h *helloHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { _, _ = fmt.F...阅读全文

博文 2019-06-03 23:34:20 郁乎文

最近学go语言的小结

因为单位业务需要(据说是http://www.oschina.net/p/docker 这个方向),最近开始学go语言。google做这门语言的目的在于代替部分C/C++在服务器端开发,这门语言是以C为主干,模仿java,javascript及C++的基础上,做了些微创新。个人感觉就是强类型语言版的javascript++。 1、文件结构,和C/C++一样的主文件。主函数如main可以写在主文件前面,而全局变量及函数写在后面,C/C++这样做要专门的声明,这个功能php也有,不过应该是php4以后的事。 2、变量的作用域和javascript类似,因而很方便地实现了闭包。 3、模块及结构体的变量及函数没有显式声明public及private,而是第一个字母大写就是public,小写反之。模块...阅读全文

博文 2015-06-17 23:01:36 erlanp

一个学习爱好者,应该怎么学习golang

如何学习一门看似简单,比较深奥的golang语言 1.前期多练 多学习25个关键字 为什么golang语言的关键字比较少(相对于其他语言),看似很少。 但是相帮25个关键字灵活运用和理解,说明你已经是个老司机。我虽软说自己是个老司机,但是自己觉得自己还是差的远。 2.进入公司,通过业务,熟悉golang语言的一下用法。 特定的场景才会用到特定的知识 处理数据,并发处理会用到 chan ,go,sync...等 代码规整:易于查看,需要了解interface.为什么这么说。我觉得golang 中的interface特别灵活。善于借鉴其他语言的理解,去理解和设计golang的方式和方法。作为21世纪的新语言。有多强的生命力,看后期的发展吧。 其他的我就一一介绍了,如果有特定场景讨论。可以留言。我...阅读全文

15.Go语言标准库之log介绍

1.log 1.1使用Logger log包定义了Logger类型,该类型提供了一些格式化输出的方法。 本包也提供了一个预定义的"标准"logger,可以通过调用Print系列(Print|Printf|Println)、Fatal系列(Fatal|Fatalf|fatalln)和Panic系列(Panic|Panicf|PanicLn)来使用,比自行创建一个logger对象更容易使用。 例如:我们可以像下面的代码一样,直接通过log包来调用上岸提到的方法,默认它们会把日志信息大隐刀终端界面。 package main import ( "log" ) func main() { log.Println("这是一条很普通的日志。") v := "很普通的" log.Printf("这是一条%...阅读全文

博文 2020-02-07 01:33:11 DevOperater

golang之cgo---调用C/C++动态库函数

之前说过golang调用C代码的方式可以通过cgo或者是swig,而cgo是不能使用C++相关的东西的,比如标准库或者C++的面向对象特性。怎么办,将c++的功能函数封装成C接口,然后编译成动态库,或者是功能较为简单的可以直接嵌入到go源文件中。   cgo的使用是在linux平台上,在windows平台上可以配置交叉编译器。 动态库头文件:myfuns.h #pragma once #include #include #include #include void fun1(); void fun2(int a); int func3(void **b); // others 动态库名:myfuns.so...阅读全文

博文 2016-09-07 09:00:08 FreeApe

使用golang的标准库搭建网站--3.模板函数

和大多数语言的的模板语法类似:{{.Name | FuncName}} go本身自带了一些模板函数,我们现在来看一看如何自定义模板函数: 先来看一个函数声明: func (t *Template) Funcs(funcMap FuncMap) *Template Funcs函数就是用来创建我们模板函数的函数了,它需要一个FuncMap类型的参数,继续看手册 type FuncMap map[string]interface{} 官方文档里是这么解释的 FuncMap is the type of the map defining the mapping from names to functions. Each function must have either a single retur...阅读全文

博文 2017-01-07 07:00:41 这里好像没有人

golang讲解(go语言)标准库分析之string开篇

/*640*60,创建于2013-5-24*/ var cpro_id = "u1290382"; 今天我们继续讲golang标准库的string这个包,我选定这个是看了下别的包真的需要这个功能所以我们来这个包,string包实现了简单的函数方法来操作字符串。其中的type Reader很简单,因为会返回一个*Reader这就用到我们前边讲的io了,废话不多说进入正题 (1)func Contains(s, substr string) bool这个函数是查找某个字符是否在这个字符串中存在,存在返回true [php] import ( "fmt" "strings" ) func main() { fmt.Println(strings.Contains("widuu", "wi")) /...阅读全文

博文 2017-02-09 18:40:36 widuu

Golang-import-introduce

本文主要讲解golang中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,让很多新手很费解,下面是三种导入包的使用 点操作: 有时候会看到如下的方式导入包...阅读全文

博文 2016-01-20 03:00:00 liujb

Go日志,打印源码文件名和行号造成的性能开销

日志中打印源码文件名和行号,是非常实用的功能,尤其是开发阶段的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...阅读全文

博文 2020-05-31 14:32:46 就想叫yoko

Go语言_反射篇

Go语言的基本语法的使用已经在前几篇陆陆续续学完了,下面可能想写一些Go的标准库的使用了。 先是reflect库。 reflect库的godoc在http://golang.org/pkg/reflect/ Type和Value 首先,reflect包有两个数据类型我们必须知道,一个是Type,一个是Value。 Type就是定义的类型的一个数据类型,Value是值的类型 具体的Type和Value里面包含的方法就要看文档了: http://golang.org/pkg/reflect/ 这里我写了个程序来理解Type和Value: package main import( "fmt" "reflect" ) type MyStruct struct{ name string } func ...阅读全文

博文 2016-07-11 02:00:07 yjf512

Go 开发关键技术指南 | 敢问路在何方?(内含超全知识大图)

作者 | 杨成立(忘篱) 阿里巴巴高级技术专家 Go 开发关键技术指南文章目录: 为什么你要选择 Go? Go 面向失败编程 带着服务器编程金刚经走进 2020 年 敢问路在何方? Go 开发指南大图 Engineering 我觉得 Go 在工程上良好的支持,是 Go 能够在服务器领域有一席之地的重要原因。这里说的工程友好包括: gofmt 保证代码的基本一致,增加可读性,避免在争论不清楚的地方争论; 原生支持的 profiling,为性能调优和死锁问题提供了强大的工具支持; utest 和 coverage,持续集成,为项目的质量提供了良好的支撑; example 和注释,让接口定义更友好合理,让库的质量更高。 GOFMT 规范编码 之前有段时间,朋友圈霸屏的新闻是码农因为代码不规范问题枪...阅读全文

博文 2020-01-10 12:34:20 阿里巴巴云原生

自动算法转换 Pseudo

Pseudo利用一个算法/一个简单程序,然后在Python, JavaScript, C#, Go 和 Ruby 中生成为惯用代码。 Pseudo实现两层翻译:它采取目标 语言的语法 ,可以使用Y语言的本地标准库表达出X语言的标准库的方法/API。 应用实例: * generate code for the same task/algorithm in different languages (parser generators etc) * port a library/codebase * develop core logic in one language and use it in other language codebases * write a compil...阅读全文

golang 基础(7)条件语句

images.png 条件语句 if 语句 if true { fmt.Println("this is true) } func bounded(num int) int { if num > 100 { return 100 }else if num < 0 { return 0 }else{ return 0 } } if 的条件里不需要括号的 引入用于读取文件的io/ioutil标准库 func main() { const filename = "abc.txt" body, err := ioutil.ReadFile(filename) if err != nil{ fmt.Println(err) }else{ fmt.Printf("%s\n",body) } } iout...阅读全文

博文 2019-03-16 18:34:41 zidea

26.笔记go语言——beedb库使用

26.笔记go语言——beedb库使用 beedb是一个Go进行ORM操作的库,它采用了Go style方式对数据库进行操作,实现了struct到数据表记录的映射。是一个十分轻量级的Go ORM框架,本意降低复杂的ORM学习曲线,尽可能在ORM的运行效率和功能之间寻求一个平衡. 安装 支持go get方式安装,是完全按照Go Style的方式来实现的。 命令行执行:go get github.com/astaxie/beedb 需要import相应的数据库驱动包、database/sql标准接口包以及beedb包 import ( "database/sql" "github.com/astaxie/beedb" _"github.com/ziutek/mymysql/godrv" ) 初始...阅读全文

博文 2017-11-28 12:01:02 notbaron

Golang访问SQL like数据库(一)——思想、driver需实现接口

Golang官方没有提供数据库驱动,只是为开发数据库驱动定义了一些标准接口,开发者可以根据官方定义的标准接口来开发相应的数据库驱动。这样做的好处是:只要是按照标准接口开发的代码,需要迁移数据库时不需要任何的修改。 Golang通过package database/sql定义了这一系列的针对SQL(或SQL-like)数据库的通用接口。sql package必须与一个database driver结合使用。SQL database drivers列表可以参考SQL Drivers。 sql和sql/driver的设计目标 sql package主要由两部分组成,database/sql和database/sql/driver。sql和sql/driver的设计目标是: 为SQL或SQL-Lik...阅读全文

博文 2016-11-02 22:00:03 xingwangc2014

golang标准库之net/url包

完整的URL格式为: [scheme:][//[userinfo@]host][/]path[?query][#fragment] URL package main import ( "fmt" "net/url" ) func main() { urlString := "https://www.baidu.com/s?ie=UTF-8&wd=github#test" // func Parse(rawurl string) (url *URL, err error) // Parse函数解析rawurl为一个URL结构体,rawurl可以是绝对地址,也可以是相对地址。 u, err := url.Parse(urlString) if err != nil { return } fmt....阅读全文

(十四)golang unsafe.Pointer

golang 的指针 Go语言是个强类型语言。也就是说Go对类型要求严格,不同类型不能进行赋值操作。指针也是具有明确类型的对象,进行严格类型检查 package main import ( "fmt" ) func main() { u := string(32) i := int32(1) fmt.Println(&u, &i) // 打印出地址 p := &i // p 的类型是 *int32 p := &u // &u的类型是 *string,于 p 的类型不同,不能赋值 会报错 p := (*string)(&u) // 这种类型强制转换也是无效的 会报错 fmt.Println(p) } 针对刚刚的问题,我们可以采用 unsafe 标准库来解决。在官方的诠释中,有如下概述: 围绕 ...阅读全文

博文 2019-07-01 20:32:58 杰克慢

Go 语言压缩库合集 compress

compress 的目标是提供 Go 语言除了标准库以外的其它纯粹、流行的压缩算法合集。 这些包的**目标**如下: * 可维护性:代码保持良好的文档,良好的测试,可读性,易于维护,并且易于验证它符合正在实现的格式的规范 * 执行者:能够以 C 接口实现至少80%来压缩和解压缩 * 灵活:代码提供相对低级和精细的压缩流 **安装** 运行命令 `go get -u github.com/dsnet/compress` 要求 `Go1.5` 或更高版本的库才能构建。 **性能:** 相对于 Go1.5 中的标准库: BZip2 解压速度大约是 1.5x到3.0x DEFLATE 解压大约是 1.5x到1.8x 甚至更快 相对于规范的C实现: Brotli ...阅读全文

go语言载入json的一个坑

问题简介 go语言标准库汇总内置了对 json 文件的处理,非常方便,最近在写一个应用的时候,需要从 json 文件中载入 配置,由于是 go 新手,忽略一个细节,导致载入内容始终为空 代码演示 代码是最好的说明载体 package config type config struct{ a string `json:"a"` b string `json:"a"` } func Load(file string)(*config, error){ c = &config{} file, err := os.Open(file) if err != nil { //file open failed todo } jsonParser := json.NewDecoder(file) err =...阅读全文

博文 2017-07-04 16:04:59 luxixing

第 02 课:基础模板用法

在上一节课中,我们学习了如何使用 Go 语言编写 HTTP 服务器的 N 种写法。但是,总是响应固定的字符串对用户和开发者而言都会显得非常无趣。因此,这堂课我们来学习如何使用 Go 语言标准库的 [`text/template`](https://gowalker.org/text/template) 包来向客户端(即浏览器或终端)响应动态的内容。 ## 初识文本模板引擎 标准库中的 [`text/template`](https://gowalker.org/text/template) 包是 Go 语言内置的文本模板引擎,虽然在灵活性上不如其它语言中第三方框架自带的模板引擎(如 Django、Ruby on Rails 等等),但功能依旧十分强大。根据标准库给出的定义,它的主要特性如下:...阅读全文

博文 2019-11-09 09:47:04 Unknwon

go lang中的import

import 我们在写Go代码的时候经常用到import这个命令用来导入包文件,而我们经常看到的方式参考如下: import( "fmt" ) 然后我们代码里面可以通过如下的方式调用 fmt.Println("hello world") 上面这个fmt是Go语言的标准库,其实是去GOROOT环境变量指定目录下去加载该模块,当然Go的import还支持如下两种方式来加载自己写的模块: 1. 相对路径 import “./model” //当前文件同一目录的model目录,但是不建议这种方式来import 2. 绝对路径 import “shorturl/model”//加载gopath/src/shorturl/model模块 上面展示了一些import常用的几种方式,但是还有一些特殊的imp...阅读全文

博文 2015-06-17 23:08:19 rznice

通过例子来学习 Go 和 Rust ---- RwLock 读写锁

读写锁顾名思义就是只允许单进程同时写,在数据没有被写的情况下允许多进程同时读,的锁。 rust 里和 Mutex 类似,使用RAII(Resource Acquisition Is Initialization)来保证在值被Drop的时候自动解锁。而 go 里依然是需要手动解锁。 举个改写自Go标准库测试的栗子 import ( . "sync" "sync/atomic" ) const NumIterations = 1000 const NumReaders = 1000 func writer(rwm *RWMutex, activity *int32, cdone chan bool) { for i := 0; i < NumIterations; i++ { rwm.Lock(...阅读全文

博文 2020-03-06 11:33:22 Tericoder

关于收集,标准化和集中化处理Golang日志的一些建议

依赖分布式系统的公司组织和团队经常使用Go语言编写其应用程序,以利用Go语言诸如通道和goroutine之类的并发功能。如果你负责研发或运维Go应用程序,则考虑周全的日志记录策略可以帮助你了解用户行为,定位错误并监控应用程序的性能。 这篇文章将展开聊一些用于管理Go日志的工具和技术。我们将首先考虑要使用哪种日志记录包来满足各种记录要求。然后会介绍一些使日志更易于搜索和可靠,减少日志资源占用以及使日志消息标准化的技术。 日志包的选择 Go标准库的日志库非常简单,仅仅提供了print,panic和fatal三个函数对于更精细的日志级别、日志文件分割以及日志分发等方面并没有提供支持. 所以催生了很多第三方的日志库,流行的日志框架包括logrus、zap、glog等。我们先来大致看下这些日志库的特点...阅读全文

博文 2020-03-25 12:32:43 KevinYan_a990

go标准库(fmt)学习

go标准库(fmt)学习 每种编程语言都有自己的格式化输入和输出。c语言是通过标准输入输出库(stdio),python语言是语言的一部分(print)。go语言是通过库(fmt)来实现格式化输入输出的功能。 1 打印 1.1 打印格式 格式符号 描述 %v 打印默认格式 %+v 当打印结构体时,会添加字段名 %#v go语法展示数据 %T go语法展示数据的类型 %% 打印% 测试数据: type Person struct { Name string age int } var SimpleData = map[string]interface{}{ "int": 1, "string": "hello", "float": 1.23, "complex": complex(1, 2),...阅读全文

博文 2019-04-23 12:34:40 今生路人甲

利用CPU cache特性优化Go程序

demo 如下Go语言伪代码,开启两个协程,分别对一个结构体变量中的两个相邻的数据成员进行n次原子自增操作,当打开_ [56]byte这个看似多余的代码后,程序运行速度加快了一倍!你知道是为什么吗? ... type Foo struct { a uint64 // _ [56]byte b uint64 // _ [56]byte } ... go func() { for i := 0; i < 1000 * 1000; i++ { atomic.AddUint64(&foo.a, 1) } }() go func() { for i := 0; i < 1000 * 1000; i++ { atomic.AddUint64(&foo.b, 1) } }() // 等待两个协程执行完毕,...阅读全文

博文 2019-12-29 19:32:38 就想叫yoko

阿里云发布ECS磁盘加密, 一键加密, 业务0改动

摘要: 当下,数据安全问题层出不穷,数据安全已经成为企业用户的生命线。为了保障用户数据安全,阿里云ECS云服务器正式向全网客户发布了“ECS磁盘加密”功能。 阿里云 ECS 磁盘加密功能可以对云盘和共享块存储加密,并提供了一种简单但非常安全的加密手段,对新创建的云盘进行加密处理。​ 传统的加密手段会给用户带来极高的使用成本:搭建密钥管理基础设施,更改业务流程,在安全性得到提高的同时,却降低了运营效率,提高了运营成本。 ECS磁盘加密与传统的加密手段不同的是,客户无需在公共云构建、维护和保护自己的密钥管理基础设施,也无需更改任何已有的应用程序和运维流程,无需做额外的加解密操作,磁盘加密功能对于业务是全面无感的。通过该功能,阿里云的客户能对ECS云服务器上指定的云盘进行数据加密,每个新创...阅读全文

Golang标准库深入 - 双向链表(container/list)

1. 什么是双向链表 (引用) 和单链表比较,双向链表的元素不但知道自己的下线,还知道自己的上线(越来越像传销组织了)。小煤车开起来,图里面可以看出,每个车厢除了一个指向后面车厢的箭头外,还有一个指向前面车厢的箭头(车头、车尾除外)。车头只有指向后面车厢的箭头,车尾只有指向前面车厢的箭头。 2. 和单向链表相比的优势 1. 插入删除不需要移动元素外,可以原地插入删除 2. 可以双向遍历 插入数据到中间 删除中间数据 3、双向链表与Go的对应结构 1.节点分析 我们先把车厢分解开来。每节车厢都由煤炭、车体、拉前车厢绳索、拉后车厢绳索这4部分组成。车体是我们的运输工具,在Go语言里我们用结构提DNode表示;煤炭代表运的货物,用data变量表示;拉前车厢绳索和拉后车厢绳索我们分别用指针prev和...阅读全文

博文 2018-05-16 11:33:06 90design

Golang学习--开篇

最近开始接收一个新项目,是使用Golang写的,需要重新捡起Golang来,于是就有了这个系列博客。 Golang的环境配置,我就不说了,让我们直接开始。 Golang官网:https://golang.org Golang标准库文档:https://golang.org/pkg Golang中文标准库文档:https://studygolang.com/pkgdoc 下面我们先来执行一个Hello World,代码如下: package main import "fmt" func main() { fmt.Println("Hello World") } 编译执行,输出 Hello World 我们再来使用go启动一个web server,大家通过浏览器可以访问到相应的页面 我们先来实现...阅读全文

博文 2017-11-16 17:00:10 CraryPrimitiveMan

golang讲解(go语言)标准库分析之io(2)

/*640*60,创建于2013-5-24*/ var cpro_id = "u1290382"; 今天我们继续讲golang的io的标准库 [1]type PipeReader [php] type PipeReader struct { // contains filtered or unexported fields } [/php] (1)func Pipe() (*PipeReader, *PipeWriter)创建一个管道,并返回它的读取器和写入器,这个会在内存中进行管道同步,它的开启会io.Reader然后等待io.Writer的输入,没有内部缓冲,它是安全的调用Read和Write彼此和并行调用写 [php] import ( "fmt" "io" "reflect" ) f...阅读全文

博文 2017-02-09 18:39:41 widuu

Go Gisp

Gisp 是简单 (非标准) 的 Lisp/Scheme 到 Go 的编译器。 ## 包括: * 基于 Rob Pike [Lexical Scanning in Go](http://cuddle.googlecode.com/hg/talk/lex.html#title-slide)  的Lexer [](http://cuddle.googlecode.com/hg/talk/lex.html#title-slide) * 简单递归解析器,支持 ints, floats, strings, bools * TCO * AST generating REPL ### 构建运行

阅读全文

Go 语言标准库之 strings包

(1)func Contains(s, substr string) bool这个函数是查找某个字符是否在这个字符串中存在,存在返回true [php] import ( "fmt" "strings" ) func main() { fmt.Println(strings.Contains("widuu", "wi")) //true fmt.Println(strings.Contains("wi", "widuu")) //false } [/php] (2)func ContainsAny(s, chars string) bool这个是查询字符串中是否包含多个字符 [php] import ( "fmt" "strings" ) func main() { fmt.Println(...阅读全文

博文 2016-11-16 07:00:11 gjy211

Go语言的一些使用心得

序 起初一直使用的Python,到了18年下半年由于业务需求而接触了Golang,从开始学习到现在的快半年里,也用Golang写了些代码,公司产品和业余写的都有,今天就写点Golang相关的总结或者感想吧。 PS:运维人员学习一两门开发语言是很重要切明智的,不会开发的运维我认为会逐渐被淘汰的,转型是迟早的事情。 语法简单 GO是崇尚极简主义的,提倡少即是多,GO的特性很少,内部关键字也不多,基础的话一天就可以学完,同时它的语法极为简单,很容易看懂。 部署方便 GO是一个强类型静态语言(最初不习惯),直接把代码编程成可执行文件,不依赖系统环境,完全可以做到轻松的发布。而且还可以交叉编译。这点我很喜欢。 标准库 GO自身带的标准库现在已经很全面的了,目前从文件归档、压缩、数据库到数据序列化,字符...阅读全文

博文 2019-04-13 01:34:40 程序员同行者

xstrings:Go 语言字符串库的补完

项目地址:https://github.com/huandu/xstrings xstrings 是一个很简单的 Go 语言库,简单说就是提供了一些标准库 strings 没提供但依然很有用的字符串算法。每个字符串算法都对效率进行了优化,所有函数都可以做到不超过 O(n) 的复杂度,并且尽量节省内存使用,仅在需要分配内存的时候分配。 现在实现的算法几乎都是其他语言(主要是 Python/Ruby/PHP/Perl)标准库里提供的算法,用 Go 重新实现一遍。未来也许我还会继续加入更多的方法,不过我不希望这个库成为一个算法大杂烩,因此仅仅会考虑那些特别有名且语言无关的函数。 Go 的 strings 操作字符串的时候都是以 rune 为单位进行,但 string 类型却只能以 byte 为单位...阅读全文

博文 2017-02-09 13:43:22 huandu

使用go/scanner库来查找golang标准库源码中最常用的标识符

在YouTube上又看了Francesc Campoy大神的视频。这一期他主要讲了go/scanner库的用法。那么什么是go/scanner呢? 官方的定义是: Package scanner implements a scanner for Go source text. It takes a []byte as source which can then be tokenized through repeated calls to the Scan method. 翻译过来就是: scanner包实现了一个对于go源码文本的扫描器,它把[]byte作为一个源,通过重复的调用Scan方法来进行标记 以下是官方给的例子: package main import ( "fmt" "go/sc...阅读全文

博文 2020-03-22 12:32:40 zooeymoon

Golang包——bytes

byte.Buffer 扩容策略 b.buf = b.buf[:length+need] 新容器的容量 =2* 原有容量 + 所需字节数 内容泄露 内容泄露是指,使用Buffer值的一方通过某种非标准的(或者说非正式的)的方法,得到了本该得不到的内容 性能测试 func BenchmarkStrBuilder(b *testing.B) { str := strings.Builder{} str.WriteString("test") for i := 0; i < b.N; i++ { str.String() } } func BenchmarkByteBuffer(b *testing.B) { byte := bytes.Buffer{} byte.WriteString("tes...阅读全文

博文 2019-04-02 20:34:41 羊羽share

使用golang+java实现基于ecb的3eds加解密

http://www.100hack.com/2014/04/14/golang%E4%B8%AD%E7%9A%84des%E5%8A%A0%E5%AF%86ecb%E6%A8%A1%E5%BC%8F/ henry(454213807) 0:26:14继续下午问的 ECB 问题. 在 go 的 issues 里找到https://code.google.com/p/go/issues/detail?id=5597有人为标准库写好了补丁. 但是项目管理者拒绝了. 另外这个补丁的地址还在 https://codereview.appspot.com/7860047/还有完整的例子. 我直接拷贝下来, 跑了一下, 和 java 的一致 Golang中的DES加密ECB模式 Golang其实已经实现...阅读全文

博文 2016-09-07 07:00:02 zolo

golang 标准库(encoding/json)学习

golang 标准库(encoding/json)学习 什么是json json的全称是 JavaScript Object Notation,是一种轻量级的数据交换格式。易于人阅读和编写,同时易于机器解析和生成。json有两种类型的数据,用go语言来描述这两种类型: map “名称/值”对,用{}标识 slice 也可以说是数组,用[]标识 { "Name": "Joe", "Age": 18, } ["apple", "banana", "pear"] golang如何处理json golang标准库encoding/json是用来处理json数据的,它有两组函数或者方法来处理json数据。 函数名 输入 输出 描述 Marshal v interface{} []byte, error...阅读全文

博文 2019-04-24 18:34:40 今生路人甲

理解Go接口的实际应用

Go是静态类型的编程语言,自2009年发布以来,已经十多岁了。现在,Go广泛应用于云原生系统、微服务、web开发、运维等场景,并且在webassembly、嵌入式等也有进一步的探索。尤其在中国,Go语言越来越多的被众多公司和开发者所采用,相关的研究文章也不断的涌现,从编译器的优化、运行时的内部机制、标准库的设计、语言规范的探索、第三库的研究和应用、产品中的应用、不同语言的比较等等目不暇接。 Go是面向对象的编程语言吗? 官方FAQ给出了标准答案: Yes and No。 当然,Go有面向对象编程的类型和方法的概念,但是它没有继承(hierarchy)一说。Go语言的接口实现和其它的编程语言不一样,Go开发者的初衷就是保证它易于使用,用途更广泛。 还有一种“模拟”产生子类的方法,拿就是通过在类...阅读全文

博文 2020-03-21 21:48:34 smallnest