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

golang 文件操作之三

1.打包文件 // This example uses zip but standard library // also supports tar archives package main import ( "archive/zip" "log" "os" ) func main() { // 创建一个打包文件 outFile, err := os.Create("test.zip") if err != nil { log.Fatal(err) } defer outFile.Close() // 创建zip writer zipWriter := zip.NewWriter(outFile) // 往打包文件中写文件。 // 这里我们使用硬编码的内容,你可以遍历一个文件夹,把文件夹下的...阅读全文

博文 2018-02-07 15:34:39 soledad

Go 开发关键技术指南 | 为什么你要选择 GO?(内含超全知识大图)

作者 | 杨成立(忘篱) 阿里巴巴高级技术专家 关注“阿里巴巴云原生”公众号,回复 Go 即可查看清晰知识大图! 导读:从问题本身出发,不局限于 Go 语言,探讨服务器中常常遇到的问题,最后回到 Go 如何解决这些问题,为大家提供 Go 开发的关键技术指南。我们将以系列文章的形式推出《Go 开发的关键技术指南》,共有 4 篇文章,本文为第 1 篇。 Go 开发指南大图 Overview 该指南主要讨论了服务器领域常见的并发问题,也涉及到了工程化相关的问题,还整理了 C 背景程序员对于 Go 的 GC 以及性能的疑问,探讨了 Go 的错误处理和类型系统最佳实践,以及依赖管理的难处、接口设计的正交性,当然也包含我们在服务器开发中对于 Go 实践的总结,有时候也会对一些有趣的问题做深度的挖掘,列出...阅读全文

博文 2019-12-19 14:34:23 阿里巴巴云原生

golang 扩展GC 实验

package main import ( "fmt" "runtime" "time" ) type Garbage struct { a int } func notify(f *Garbage) { stats := &runtime.MemStats{} runtime.ReadMemStats(stats) //go 标准库ReadMemStats将内存申请和分配的统计信息填写进f fmt.Println("Last GC was:", stats.LastGC) //go 标准库uint64 // 上次运行的绝对时间(纳秒) go ProduceFinalizedGarbage() } func ProduceFinalizedGarbage() { x := &Garbage{...阅读全文

博文 2018-12-19 09:20:02 stvenyin

Go 开发关键技术指南 | 为什么你要选择 GO?(内含超全知识大图)

作者 | 杨成立(忘篱) 阿里巴巴高级技术专家 关注“阿里巴巴云原生”公众号,回复 Go 即可查看清晰知识大图! 导读:从问题本身出发,不局限于 Go 语言,探讨服务器中常常遇到的问题,最后回到 Go 如何解决这些问题,为大家提供 Go 开发的关键技术指南。我们将以系列文章的形式推出《Go 开发的关键技术指南》,共有 4 篇文章,本文为第 1 篇。 Go 开发指南大图 Overview 该指南主要讨论了服务器领域常见的并发问题,也涉及到了工程化相关的问题,还整理了 C 背景程序员对于 Go 的 GC 以及性能的疑问,探讨了 Go 的错误处理和类型系统最佳实践,以及依赖管理的难处、接口设计的正交性,当然也包含我们在服务器开发中对于 Go 实践的总结,有时候也会对一些有趣的问题做深度的挖掘,列出...阅读全文

博文 2019-12-19 12:32:41 阿里巴巴云原生

Go 标准库 —— sync.Mutex 互斥锁

Mutex 是一个互斥锁,可以创建为其他结构体的字段;零值为解锁状态。Mutex 类型的锁和线程无关,可以由不同的线程加锁和解锁。 方法 func (*Mutex) Lock func (m *Mutex) Lock() Lock 方法锁住 m,如果 m 已经加锁,则阻塞直到 m 解锁。 func (*Mutex) Unlock func (m *Mutex) Unlock() Unlock 方法解锁 m,如果 m 未加锁会导致运行时错误。 注意 在一个 goroutine 获得 Mutex 后,其他 goroutine 只能等到这个 goroutine 释放该 Mutex 使用 Lock() 加锁后,不能再继续对其加锁,直到利用 Unlock() 解锁后才能再加锁 在 Lock() 之前使...阅读全文

博文 2018-06-05 11:34:38 舆图易稿

Go语言简介

1 配置安装及go的基础语法 https://wizardforcel.gitbooks.io/w3school-go/content/index.html 2 深入解析go语言 go语言的高级语法 https://tiancaiamao.gitbooks.io/go-internals/content/zh/ 3 go语言的标准库 很方便查询标准包的用法 http://studygolang.com/pkgdoc 如果你更喜欢pdf文档,下面地址可以下载 https://pan.baidu.com/s/1b5BXj...阅读全文

博文 2017-07-11 01:03:35 wg_code

用Golang写爬虫(一)

之前一直都是再用Python写爬虫,最近想体验下Golang写爬虫的感觉,所以就有了这个系列。我想要抓取的页面是[豆瓣Top250页面](https://movie.douban.com/top250),选择它的理由有3个: 1. 豆瓣页面代码相对规范 2. 豆瓣对爬虫爱好者相对更宽容 3. Top250页面简洁,很适合拿来练手 我们先看第一版的代码。 按逻辑我把抓取代码分成2个部分: 1. HTTP请求 2. 解析页面中的内容 我们先看HTTP请求,Golang语言的HTTP请求库不需要使用第三方的库,标准库就内置了足够好的支持: ```go import ( "fmt" "net/http" "io/ioutil" ) func fetch (url string) string { f...阅读全文

博文 2019-07-17 12:35:07 169

golang标准库之strconv

字符串转整型 package main import ( "fmt" "strconv" ) func main() { //字符串转为整数 s := "128" // func ParseInt(s string, base int, bitSize int) (i int64, err error) // 返回字符串表示的整数值,接受正负号。 // base指定进制(2到36),如果base为0,则会从字符串前置判断,"0x"是16进制,"0"是8进制,否则是10进制; // bitSize指定结果必须能无溢出赋值的整数类型,0、8、16、32、64 分别代表 int、int8、int16、int32、int64; // 返回的err是*NumErr类型的,如果语法有误,err.Erro...阅读全文

博文 2019-10-04 15:32:45 aside section ._1OhGeD

Golang学习笔记之接口(interface)

接⼝是⼀个或多个⽅法签名的集合,任何类型的⽅法集中只要拥有与之对应的全部⽅法,就表⽰它 "实现" 了该接⼝。 所谓对应⽅法,是指有相同名称、参数列表 (不包括参数名) 以及返回值。当然,该类型还可以有其他⽅法。 • 接⼝命名习惯以 er 结尾,结构体。 • 接⼝只有⽅法签名,没有实现。 • 接⼝没有数据字段。 • 可在接⼝中嵌⼊其他接⼝。 • 类型可实现多个接⼝。 • 引用类型 • 实现接口不需要显式的声明,只需实现相应方法即可 • 多个类型可以实现同一个接口,一个类型可以实现多个接口,实现了某个接口的类型,还可以有其它的方法。 • 接口的 0 值是 nil。 一、接口定义 type Namer interface { method1(param_list) return_list meth...阅读全文

博文 2018-12-15 13:34:44 学生黄哲

使用golang的标准库搭建网站--2.模板解析

模板的解析 既然是搭建网站, fmt.Fprintf(w, "Hello world, this is my first page!") 这种方式肯定就不能用了,得解析模板才行。 模板解析用到的包是”html/template”,先导包,然后改写Index函数: //先导入html/template包 import "html/template" func Index(w http.ResponseWriter, r *http.Request) { //解析指定模板文件index.html t, _ := template.ParseFiles("index.html") //输出到浏览器 t.Execute(w, nil) } 在准备一个html文件,如下: ...阅读全文

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

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

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

博文 2019-06-22 08:56:12 EDDYCJY

Go 开发关键技术指南 | 为什么你要选择 GO?(内含超全知识大图)

导读:从问题本身出发,不局限于 Go 语言,探讨服务器中常常遇到的问题,最后回到 Go 如何解决这些问题,为大家提供 Go 开发的关键技术指南。我们将以系列文章的形式推出《Go 开发的关键技术指南》,共有 4 篇文章,本文为第 1 篇。 Go 开发指南大图 Overview 该指南主要讨论了服务器领域常见的并发问题,也涉及到了工程化相关的问题,还整理了 C 背景程序员对于 Go 的 GC 以及性能的疑问,探讨了 Go 的错误处理和类型系统最佳实践,以及依赖管理的难处、接口设计的正交性,当然也包含我们在服务器开发中对于 Go 实践的总结,有时候也会对一些有趣的问题做深度的挖掘,列出了 Go 重要的事件和资料集合,以及 Go2 的进展和思考。 以下是各个章节以及简介: About the Nam...阅读全文

博文 2019-12-20 14:32:41 阿里云云栖号

Go - atomic包使用及atomic.Value源码分析

1. Go中的原子操作 原子性:一个或多个操作在CPU的执行过程中不被中断的特性,称为原子性。这些操作对外表现成一个不可分割的整体,他们要么都执行,要么都不执行,外界不会看到他们只执行到一半的状态。 原子操作:进行过程中不能被中断的操作,原子操作由底层硬件支持,而锁则是由操作系统提供的API实现,若实现相同的功能,前者通常会更有效率 最小案例: package main import ( "sync" "fmt" ) var count int func add(wg *sync.WaitGroup) { defer wg.Done() count++ } func main() { wg := sync.WaitGroup{} wg.Add(1000) for i := 0; i < 10...阅读全文

博文 2020-01-26 18:34:20 Takagi_san

Go 技篇第二 命名规范

本篇主要讲述Go语言的命名规范。优秀的代码必须具备良好的可读性,而可读性的关键即在于命名风格。 原文链接: http://zablog.me/2017/09/08/go_tricks_and_tips_2/ 优秀的命名优秀的命名应当是一贯的、短小的、精确的。所谓一贯,就是说同一个意义在不同的环境下的命名应当一致,譬如依赖关系,不要在一个方法中命名为depend,另一个方法中命名为rely。所谓短小,不必多言,当命名过长的时候,读者可能更关注命名本身,而忽视真正的逻辑内容。所谓精确,就是命名达意、易于理解 首条经验声明位置与使用位置越远,则命名应当越长。 骆驼命名法Go语言应该使用 MixedCase(不要使用 names_with_underscores)首字母缩写词都应该用大写,譬如Ser...阅读全文

博文 2017-09-09 12:57:40 zablog.me

golang测试

go语言提供了对测试的支持。在go的标准库文档中的testing包页面,对go语言的测试方法有较为详细的使用说明,这里仅仅对go语言的测试进行简单说明。 1.使用概述 使用go语言的测试功能,需要在以_test.go结尾的文件中编写测试函数。文件中需要引入testing包。最后,使用go test命令执行测试。 测试函数形式如下: func TestXxx(*testing.T) { //具体执行步骤 } 其中Xxx是任意字母和数字。 Xxx第一个字母不能是小写字母。可以理解是如果是小写字母,不能识别开头的Test。 函数形参testing.T是执行单元测试的参数,基准测试的参数是testing.B 这里主要以单元测试为例 2.go test的使用 go test 命令的具体用法可以使用go...阅读全文

博文 2019-06-30 23:32:41 太古汤

Golang的json包

本文对常见的json包做一些介绍,方便快速入门。每一小节均有示例说明。大家在实际开发中可以选择适合自己的json包。 encoding/json encoding/json是官方提供的标准json, 实现RFC 7159中定义的JSON编码和解码。使用的时候需要预定义struct,原理是通过reflection和interface来完成工作, 性能低。 常用的接口: func Marshal(v interface{}) ([]byte, error) 生成JSON func Unmarshal(data []byte, v interface{}) error 解析JSON到struct 示例1 生成JSON: type ColorGroup struct { ID int Name st...阅读全文

博文 2019-11-10 20:02:37 飞鸿影

Go1到Go1.10的语法变迁

因为Go1承诺,Go1后序的版本都保持了向前兼容的目标。不过在从Go1发展到Go1.10的过程中,语言依然是增加了一些新的特性。我们简单回顾Go1到Go1.10的变化。1. Go1.2(2013年12月)Go1.2最大的语言变化是切片操作时,可以设置新切片的容量。这个需求在Go1之前就被提出了,但是因为Go1修改工作较大而延期到了Go1.2才被实现。比如下面的代码:1var a = make([]int, 10)23var b = a[i:j:k]其中b切片是从a切片的第i个元素开始到第j个元素前结束,b切片的容量为k(k指定的容量不能超出a切片的容量)。为了配合切片语法的变更,reflect包也增加了相应的方法:1func (v Value) SetCap(cap int)23func (...阅读全文

博文 2019-05-17 12:06:17 Go语言中文网

Golang学习笔记之包(package)

包是结构化代码的一种方式:每个程序都由包的概念组成,可以使用自身的包或者从其它包中导入内容。 一、工作空间 编译⼯具对源码目录有严格要求,每个⼯作空间 (workspace) 必须由 bin、 pkg、 src 三个目录组成。 二、包结构 所有代码都必须组织在 package 中。 • 包由同⼀目录下的多个源码⽂件组成。 • 包名类似 namespace,与包所在目录名、编译⽂件名⽆关。 • 目录名最好不⽤ main、 all、 std 这三个保留名称。 • 可执⾏⽂件必须包含 package main,⼊⼝函数 main。 包声明 "package + 包名" ,必须在源文件中非注释的第一行指明这个文件属于哪个包。如:package main。package main表示一个可独立执行的程...阅读全文

博文 2018-12-07 21:34:44 学生黄哲

Golang 源码剖析:fmt 标准库 -- Print* 是怎么样输出的?

文地址:Golang 源码剖析:fmt 标准库 前言 package main import ( "fmt" ) func main() { fmt.Println("Hello World!") } 标准开场见多了,那内部标准库又是怎么输出这段英文的呢?今天一起来围观下源码吧 ???? 原型 func Print(a ...interface{}) (n int, err error) { return Fprint(os.Stdout, a...) } func Println(a ...interface{}) (n int, err error) { return Fprintln(os.Stdout, a...) } func Printf(format string, a ......阅读全文

博文 2018-12-04 22:34:43 EDDYCJY

Golang 面向对象编程-非侵入式接口

Golang 面向对象编程-非侵入式接口 在go语言中,一个类只需要实现了接口要求的所有函数,我们就说这个类实现了该接口,例如: type File struct { // ... } func (f *File) Read(buf []byte) (n int, err error) func (f *File) Write(buf []byte) (n int, err error) func (f *File) Seek(off int64, whence int) (pos int64, err error) func (f *File) Close() error 这里我们定义了一个File类,并实现了Read()、Write()、Seek()、Close()等方法。设想我们有如下...阅读全文

博文 2020-06-01 11:32:49 __sk

视频笔记:给 Go 库作者的建议-Jack Lindamood

视频信息 命名 Object Creation 日志 interface vs struct 什么时候 panic 检查 error 允许启用库的调试能力 为测试而设计 并发 channels 什么时候发起 goroutine 什么时候使用 context.Context 其它注意事项 视频信息 #Practical Advice for Go Library Authorsby Jack Lindamoodat GopherCon 2016 https://www.youtube.com/watch?v=5v2fqm_8jYI 幻灯地址:http://go-talks.appspot.com/github.com/cep21/go-talks/practical-advice-for-go...阅读全文

博文 2017-10-05 06:38:35 大桥下的蜗牛

go语言碎片整理之标准库log

无论是软件开发的调试阶段还是软件上线之后的运行阶段,日志一直是很重要的环节,我们也应该养成在程序中记录日志的好习惯。 log Go语言内置的log包实现了简单的日志服务。本文介绍了标准库log的基本使用。 使用Logger log包定义了Logger类型,该类型提供了一些格式化输出的方法。本包也提供了一个预定义的“标准”logger,可以通过调用函数Print系列(Print|Printf|Println)、Fatal系列(Fatal|Fatalf|Fatalln)和Panic系列(Panic|Panicf|Panicln)来使用,比自行创建一个logger对象更容易使用。例如,我们可以像下面的代码一样直接通过log包调用上面提到的方法,默认它们会将日志信息打印到终端界面: package ...阅读全文

博文 2019-06-06 01:33:16 霍帅兵

Go 问答汇总篇 二

继上篇 Go 问答汇总,已经过去了一个多月。今天汇总下近一个多月我关于 Go 的回答。 粗略数了一下,一个多月的时间里,大约回答了 18 个与 Go 有关的问题,问题主要是来源于 segmentfault 和 zhihu 两个平台。后面希望加入更多平台,如 stackoverflow、github 的感兴趣主题。 最近在写一个小工具,准备用于帮助自己回答不同平台的问题,同时也便于每个月的问题汇总。写的有点慢,希望月底可以完成。 正文部分开始。 golang中如何将redis取出的map[string]string数据解析到目标struct中? 主要和反射相关。 问题主要是关于 map 中如果存在日期字符格式串,如何解析到 time.Time 类型成员中,而对于结构体而言,reflect.Ki...阅读全文

博文 2019-08-11 02:02:38 波罗学

为什么要选择学习GO语言呢?有什么优势?

Go语言专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美C或C++代码的速度,而且更加安全、支持并行进程。 为什么要选择学习Go语言呢?与其他语言的应用相比,它有什么优点呢? 简单易学,Go语言的作者都有C的基因,那么Go自然而然就有了C的基因,那么Go关键字是25个,但是表达能力很强大,几乎支持大多数你在其他语言见过的特性:继承、重载、对象等。 丰富的标准库,Go目前已经内置了大量的库,特别是网络库非常强大,我最爱的也是这部分。 内置强大的工具,Go语言里面内置了很多工具链,最好的应该是gofmt工具,自动化格式化代码,能够让团队review变得如此的简单,代码格式一模一样,想不一样都很困难。 跨平台编译,如果你写的Go代码不包含cgo,那么就可以做到window系...阅读全文

博文 2019-11-05 16:25:21 zhouzhou2018

学习Golang语言(3):类型--布尔型和数值类型

跟着“码术”一起学习Golang语言。今天讲解Golang语言的基本类型,介绍布尔类型和数值类型。 学习Golang语言(1): Hello World 学习Golang语言(2): 变量 学习Golang语言(3):类型--布尔型和数值类型 学习Golang语言(4):类型--字符串 学习Golang语言(5):类型--数组 布尔类型 布尔类型是 bool。Go语言提供了内置的布尔值true和flase。Go语言支持标准的逻辑和比较操作。这些操作的结果都是布尔值。 布尔值和表达式可以用于if语句中,for语句的条件中以及switch语句的case的判断中。 逻辑操作符: !:逻辑非操作符; ||:逻辑或操作符; &&:逻辑与操作符 比较操作符。 <,>, ==,!=, <=, >= 数值类...阅读全文

博文 2018-08-13 14:32:06 codemanship

Go语言环境搭建

安装包下载地址为:https://golang.org/dl/ 1、下载源码包:go1.8.linux-amd64.tar.gz。 2、将下载的源码包解压至 /usr/local目录。 tar -C /usr/local -xzf go1.8.linux-amd64.tar.gz 3、将 /usr/local/go/bin 目录添加至PATH环境变量: export PATH=$PATH:/usr/local/go/bin 注意:MAC 系统下你可以使用 .pkg 结尾的安装包直接双击来完成安装,安装目录在 /usr/local/go/ 下。 使用go env查看GOROOT和GOPATH GOARCH="amd64" GOBIN="" GOEXE="" GOHOSTARCH="amd64"...阅读全文

博文 2019-04-06 08:34:39 缘来是你ylh

Go 命令行解析 flag 包之快速上手

本篇文章是 Go 标准库 flag 包的快速上手篇。 概述 开发一个命令行工具,视复杂程度,一般要选择一个合适的命令行解析库,简单的需求用 Go 标准库 flag 就够了,flag 的使用非常简单。 当然,除了标准库 flag 外,也有不少的第三方库。比如,为了替代 flag 而生的 pflag,它支持 POSIX 风格的命令行解析。关于 POSIX 风格,本文末尾有个简单的介绍。 更多与命令行处理相关的库,可以打开 awesome-go#command-line 命令行一节查看,star 最多的是 spf13/cobra 和 urfave/cli ,与 flag / pflag 相比,它们更加复杂,是一个完全的全功能的框架。 有兴趣都可以了解下。 目标案例 回归主题,继续介绍 flag 吧...阅读全文

博文 2019-11-23 21:34:14 波罗学

Golang 源码剖析:fmt 标准库 --- Print* 是怎么样输出的?

Golang 源码剖析:fmt 标准库 --- Print* 是怎么样输出的? 前言 package main import ( "fmt" ) func main() { fmt.Println("Hello World!") } 标准开场见多了,那内部标准库又是怎么输出这段英文的呢?今天一起来围观下源码吧 ???? 原型 func Print(a ...interface{}) (n int, err error) { return Fprint(os.Stdout, a...) } func Println(a ...interface{}) (n int, err error) { return Fprintln(os.Stdout, a...) } func Printf(form...阅读全文

博文 2019-03-26 09:31:21 EDDYCJY

Golang-reflect反射的实际中的应用及畅想

1. ???? 解决了什么 原文https://mojotv.cn/go/golang-reflect-string 我有很多行日志数据单行的格式是这样的 HOST;000012000629948340196501;ipv4;3; ips: user_id=2;user_name=172.21.1.102;policy_id=1;src_mac=52:54:00:62:7f:4a;dst_mac=58:69:6c:7b:fa:e7;src_ip=172.21.1.102;dst_ip=172.22.2.3;src_port=48612;dst_port=80;app_name=网页浏览(HTTP);protocol=TCP;app_protocol=HTTP;event_id=1310909...阅读全文

博文 2020-01-14 18:32:39 TechMojotv

Go 问答汇总篇 二

继上篇 Go 问答汇总,已经过去了一个多月。今天汇总下近一个多月我关于 Go 的回答。 粗略数了一下,一个多月的时间里,大约回答了 18 个与 Go 有关的问题,问题主要是来源于 segmentfault 和 zhihu 两个平台。后面希望加入更多平台,如 stackoverflow、github 的感兴趣主题。 最近在写一个小工具,准备用于帮助自己回答不同平台的问题,同时也便于每个月的问题汇总。写的有点慢,希望月底可以完成。 正文部分开始。 golang中如何将redis取出的map[string]string数据解析到目标struct中? 主要和反射相关。 问题主要是关于 map 中如果存在日期字符格式串,如何解析到 time.Time 类型成员中,而对于结构体而言,reflect.Ki...阅读全文

博文 2019-08-11 11:04:13 波罗学

Go圣经-学习笔记入门bufio

bufio数据读取注意项 在go圣经第一章节 bufio-缓存IO,有个例子,不读源码不容易理解。 DEMO 1 func main(){ reader :=bufio.NewReader( strings.NewReader(""http://studygolang.com. \nIt is the home of gophers, yes or no ?"), ) line, _ := reader.ReadSlice('\n') fmt.Printf("line=%s", line) // 注意点:bufio.ReadSlice会把'\n'读取进来, 所以自带换行 n, _ := reader.ReadSlice('\n') fmt.Printf("the line:%s\n", li...阅读全文

博文 2017-10-22 00:30:22 cdh0805010

错误处理

Error Handing with Golang Go errors are values. Naming:Error types end in "Error" and error variables start with "Err" or "err". error:程序还可以继续运行,错误可以被修复或丢弃 error是个简单的内建接口 type error interface { Error() string } 自定义error范例 // PathError records an error and the operation and file path that caused it. type PathError struct { Op string // "open", "unli...阅读全文

博文 2020-02-03 19:32:40 吃猪的蛇

2.go命令源文件分析

回顾 上一节我们成功安装了golang,并设置好了环境变量,能使用go run来测试源码 这里我们介绍下go语言的源码: 以.go结尾的文件认为是go语言的源文件,go语言的源文件可以分为三类: 命令源文件: package声明为main 有且只有一个main函数,会编译成可执行文件 库源文件: package不能声明为main且不能包含main函数,会编译成库文件 测试源文件:以_test.go结尾的文件,主要用来对其他源码的测试。 每个源文件以包的声明语句开始,说明该源文件是属于哪个包。 import 导入依赖的包,少导入或者多导入都会导致报错。 这里我们导入一个标准库:fmt 实现了格式化的IO操作,我们可以用它输出我们想要的东西到命令行 go语言中文网有一个标准库的中文文档:http...阅读全文

golang中container/heap包

任何实现了 heap.Interface 接口的对象都可以使用heap包提供的方法对堆进行操作(堆是一个完成二叉树)。通过对heap.Interface 中的 Less 方法的不同实现,来实现最大堆和最小堆。通常堆的数据结构是一个一维数组。 heap包提供的函数列表: 1)func Init(h Interface) 2)func Pop(h Interface) interface{} 3)func Push(h Interface, x interface{}) 4)func Remove(h Interface, i int) interface{} 5)type Interface 现在对提供的函数进行分析: func Init(h Interface) 参数列表:h,实现了heap...阅读全文

博文 2018-12-07 17:34:43 laijh

通过什么方式能查到标准库的函数或者类是并发安全的?

问题简单明了的如题了. 啰嗦一下问题怎么来的.我在学习go.想要使用go的UDP程序.但是网上的例程基本都这样 sck,_ := net.ListenUDP(....) for { sck.ReadFromUDP() sck.WriteToUDP() } 但是实际用的时候读取数据是阻塞的.发送数据如果没有对方的网卡地址,那么发送也是有阻塞的.那么势必要把读写分开.程序变成了 sck,_ := net.ListenUDP(....) go func() { for { sck.ReadFromUDP() } } func() { for { sck.WriteToUDP() } } 这样读写的过程都使用了同一个UCP...阅读全文

Golang 标准库:strconv 包的应用

strconv包 strconv包主要用于字符串与其他类型的转换。一般来说,几乎所有的类型都能被转换成字符串,但是从字符串转换成其他类型就不一定能成功了。 从数字类型转换到字符串,我们可以使用strconv.Itoa和strconv.FormatFloat()等函数,Itoa是把十进制数转换成字符串,FormatFloat是将64位浮点型的数字转换成字符串。 strconv.FormatFloat(f float64, fmt byte, prec int, bitSize int) 其中,fmt表示格式(其值可以是 'a', 'b', 'c'),prec表示精度,bitSize的值是32就表示float32,是64就表示float64。 从字符串到数字类型,也可以使用strconv.Ato...阅读全文

博文 2020-06-03 16:32:44 sunlingbot

Go并发编程

我想纠正一下 golang 中这(又)一个广为流传的误解:“Channel 优于锁机制” 或者 "Channel 取代锁机制"。对于很多情况下,我们既可以使用锁机制,也可以使用 Channel 来实现同一个目标,然而实际针对某个特定问题时,可能使用 Channel 会更加方便,但另外一些问题,使用锁机制会更加方便。Go wiki 上给出了一个回答:Use whichever is most expressive and/or most simple.Channel 和锁机制在 golang 中不是替代和被替代的关系。如果你试图用一种方式解决所有问题,那么必定会遇到让你抓狂的情况。最后附上一句话:Share memory by communicating, don't communicate ...阅读全文

博文 2019-01-14 17:34:45 下一块巧克力_14b6

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

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

博文 2017-10-08 20:03:21 ios122

Golang 博主走过的有关 error 的一些坑

Desc:为什么值为 nil 的 error 却不等于 nil 本片文章用来记录我在 Golang 开发学习过程中遇到的有关 error 的一些坑。或许你也遇到,或许你能在这里找到答案。当然通过 error 的例子,你也应该联想到其它场景。 err != nil 第一个问题是:为什么值为 nil 的 error 却不等于 nil? 思考如下代码: package main import ( "errors" "fmt" ) type Err struct { err string } func (e *Err) Error() string { return e.err } func returnErr() *Err { return nil } func main(...阅读全文

博文 2017-06-06 09:06:57 deepzz

兄弟连区块链教程区块链背后的信息安全2DES、3DES加密算法原理一

区块链教程区块链背后的信息安全2DES、3DES加密算法原理一,2018年下半年,区块链行业正逐渐褪去发展之初的浮躁、回归理性,表面上看相关人才需求与身价似乎正在回落。但事实上,正是初期泡沫的渐退,让人们更多的关注点放在了区块链真正的技术之上。 # DES、3DES加密算法原理及其GO语言实现 DES加密算法,为对称加密算法中的一种。70年代初由IBM研发,后1977年被美国国家标准局采纳为数据加密标准,即DES全称的由来:Data Encryption Standard。 对称加密算法,是相对于非对称加密算法而言的。两者区别在于,对称加密在加密和解密时使用同一密钥,而非对称加密在加密和解密时使用不同的密钥,即公钥和私钥。 常见的DES、3DES、AES均为对称加密算法,而RSA、椭圆曲线加...阅读全文

Coroutine

概述 协程可能是近几年来最新的并行/并发模型实现,常见语言中最早的实现可能是lua,近年来新晋语言golang的崛起更把这个概念发扬光大。 Kotlin 的实现设计思路有以下几个特点: 尽可能不使用核心语言,而是标准库来实现。 标准库只提供核心功能,官方的第三方库提供应用层接口。 异步等操作使用协程封装,同时协程可用于其他方面尽可能替代线程。 尽管如此,官方也不得不加入suspend关键字来标记协程可挂起函数,同时协程的实现也需要编译器支持。 suspend关键字与C#等语言中的async关键字很接近。线程的调度由操作系统完成,而协程需要由运行时管理。为了标记一个函数可以被运行时挂起,需要此关键字。当然协程的范围比异步更广,这里不再赘述...阅读全文

博文 2018-12-15 21:34:44 weiminsir

笨办法学golang(三)

这是Go语言学习笔记第三篇。 Go语言学习笔记参考书籍「Go语言圣经」以及Go官方标准库 Go语言基本类型主要有布尔类型,数字类型,字符串类型以及新增的错误类型。 布尔(bool)类型 布尔类型的值只能是常量true或false.例如var v bool = true func mian() { var v1, v2 bool v1 = true v2 = 1 v3 := false v4 := (1 != 2) fmt.Printf("%v %v %v %v", v1, v2, v3, v4) } //为了节省篇幅,以后的示例代码自动省略package mian以及import包语句,不再赘述。 运行上述代码,会发现第4行报编译错误,原因是布尔类型不接受其他类型的赋值,不支持自动或强制类型...阅读全文

博文 2019-02-17 17:34:45 Morgansays

fasthttp中运用哪些go优化技巧?

fasthttp刚出道的时候号称比net/http快十倍,更少的内存分配。并同时在github上给出一些go开发上的小技巧。本文主要通过源码来窥探下fasthttp里是如何使用这些技巧的。减少[]byte的分配,尽量去复用它们两种方式进行复用:sync.Poolslice = slice[:0]。所有的类型的Reset方法,均使用此方式。例如类型URI、Args、ByteBuffer、Cookie、RequestHeader、ResponseHeader等。fasthttp里共有35个地方使用了sync.Pool。sync.Pool除了降低GC的压力,还能复用对象,减少内存分配。// 例如类型Servertype Server struct { // ... ctxPool sync.Poo...阅读全文

博文 2019-12-03 19:08:15 木白的技术私厨

使用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-20 05:32:43 zooeymoon

C++标准库读书笔记: Concurrency

由于多核的出现,使用多线程能够显著提高性能。 C++11之前,C++并没有对并发提供语言层面的支持,C++标准库也没有。C++11之后: 语言层面,定义一个内存模型,保证在两个不同线程中对两个对象的操作相互独立,增加了 thread_local 关键字。 标准库提供了对开启多线程、同步多线程的支持。 The High-Level Interface: async() and Futures async() 提供了接口让一个可调用的对象(如某个函数)在独立的线程中运行。 future<> 类 允许等待某个线程完成,并访问其结果。 一个使用 async() 以及 Future 的例子 计算 func1() + func2(): 如果是单线程,只能依次运行,并把结果相加。总时间是两者时间之和。 多...阅读全文

博文 2017-09-30 07:34:47 找不到工作

golang快速入门[3]-go语言helloworld

golang快速入门[3]-go语言helloworld在之前,我们介绍了如何在windows、macos以及linux平台构建go语言的开发环境[golang快速入门[2.1]-go语言开发环境配置-windows]()[golang快速入门[2.2]-go语言开发环境配置-macOS]()[golang快速入门[2.3]-go语言开发环境配置-linux]()本文将介绍如何书写、编译、并运行第一个go语言程序同时详细介绍其内部机制书写第一个go语言程序首先我们可以在任意位置新建一个文件,命名为main.gogo源文件以.go作为后缀,命名时建议统一为小写英文字母用任意的文本编辑器(vim,notepade,emacs…)编辑文件,书写如下代码package main import "fm...阅读全文

博文 2020-02-09 00:33:10 jonson_jackson

001 go语言开发环境配置

ubuntu系统安装Go和liteide及环境配置 一、通过apt-get安装 1、安装 sudo apt-get install golang 2、设置GOPATH变量 GOPATH是扩展库的目录,Go先搜索标准库目录,然后搜索GOPATH库目录,所有的非标准库都放在GOPATH下。以GOPATH为“/home/zzh/gopath”目录为例子: image.png (1)把export GOPATH=/home/zzh/gopath 加入到~/.bashrc文件的最后。 (2)source ~/.bashrc 重新加载配置 image.png 这样就加好了GOPATH。注意:apt-get命令安装只能安装go1.6版本现在很多开源项目都用上了1.7以上建议手动安装更高版本。 二. 压缩包...阅读全文

博文 2019-10-19 10:32:56 aside section ._1OhGeD

Golang IO包的妙用

Golang 标准库对 IO 的抽象非常精巧,各个组件可以随意组合,可以作为接口设计的典范。这篇文章结合一个实际的例子来和大家分享一下。 背景 以一个RPC的协议包来说,每个包有如下结构: type Packet struct { TotalSize uint32 Magic [4]byte Payload []byte Checksum uint32 } 其中 TotalSize 是整个包除去 TotalSize 后的字节数, Magic 是一个固定长度的字串,Payload 是包的实际内容,包含业务逻辑的数据。Checksum 是对 Magic 和 Payload 的adler32 校验和。 编码(encode) 我们使用一个原型为func EncodePacket(w io.Write...阅读全文

博文 2018-11-13 22:34:39 Chole121

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

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

博文 2017-10-09 01:30:02 ios122

golang 项目实战简明指南

开发环境搭建 golang 的开发环境搭建比较简单,由于是编译型语言,写好 golang 源码后,只需要执行 go build 就能将源码编译成对应平台(本文中默认为 linux)上的可执行程序。本文不再赘述如何搭建 golang 开发环境,只说明下需要注意的地方。 从官网下载对应平台的 golang 安装包中包括 golang 的编译器、一些工具程序和标准库源码。早期的 golang 版本中,需要设置 GOROOT 和 GOPATH 两个环境变量。 从 1.8 版开始,GOPATH 不再需要显示设置。如果没有显示设置,则 GOPATH 的默认值为 $HOME/go 。GOPATH 可以设置多个目录,但推荐只设置一个或直接使用默认值,多个 GOPATH 会造成依赖管理的困难。推荐将 $GOP...阅读全文

博文 2018-12-10 14:43:13 litang.me