文章分类 - go
摘要:内存模型介绍 Go语言的内存模型规定了一种规则。这种规则可以保证,在一个goroutine读取某个变量的值,是其他goroutine对同一个变量写入的值。 建议 程序中多个goroutine同时修改相同数据,必须使之能够按序访问。为了按序访问以及保护数据,可以使用channel操作或者其他同步原语例
阅读全文
摘要:一 问题背景 当我们使用 go get、go install、go mod 等命令时,会自动下载相应的包或依赖包。但由于众所周知的原因,类似于 golang.org/x/... 的包会出现下载失败的情况。如下所示: //go get下载包 go get -u golang.org/x/sys //报
阅读全文
摘要:一 介绍 unsafe 包含有关于Go程序类型安全的所有操作 unsafe 库让 go 可以像C语言一样操作计算机内存,但这并不是go推荐使用的,能不用尽量不用,就像它的名字所表达的一样,它绕过了go的内存安全原则,是不安全的,容易使你的程序出现莫名其妙的问题,不利于程序的扩展与维护 unsafe有
阅读全文
摘要:Golang 支持交叉编译,在一个平台上生成另一个平台的可执行程序 一 Mac 下编译 Linux 和 Windows 64位可执行程序 CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go CGO_ENABLED=0 GOOS=windows
阅读全文
摘要:一 Go指针 我们大家都知道,go语言指针是不支持运算的,也就是不支持++/–操作,但是我们借助于unsafe包,可以完成这个操作 我们现在要定义一个数组a:=[3]int8{6,8,9} 取出a[0]的指针,自增后,解引用,即可得到a[1]对应的值 8 二 指针,uintptr,unsafe.Po
阅读全文
摘要:Go语言对json的解析函数在encoding/json包里面,主要是编码和解码两个函数。 1 Marshal函数 func Marshal(v interface{}) ([]byte, error) Marshal函数返回v的json编码 注意: 布尔类型编码为json布尔类型。 浮点数、整数和
阅读全文
摘要:时间和日期是我们编程中经常会用到的,本文主要介绍了Go语言内置的time包的基本用法。 1 time包 time包提供了时间的显示和测量用的函数。日历的计算采用的是公历。 2 时间类型 time.Time类型表示时间。我们可以通过time.Now()函数获取当前的时间对象,然后获取时间对象的年月日时
阅读全文
摘要:Go语言中strconv包实现了基本数据类型和其字符串表示的相互转换。 1 strconv包 strconv包实现了基本数据类型与其字符串表示的转换,主要有以下常用函数: Atoi()、Itia()、parse系列、format系列、append系列。 更多函数请查看官方文档。 2 string与i
阅读全文
摘要:Go语言内置的net/http包十分的优秀,提供了HTTP客户端和服务端的实现。 1 net/http介绍 Go语言内置的net/http包提供了HTTP客户端和服务端的实现。 2 HTTP协议 超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛
阅读全文
摘要:无论是软件开发的调试阶段还是软件上线之后的运行阶段,日志一直都是非常重要的一个环节,我们也应该养成在程序中记录日志的好习惯。 1 log Go语言内置的log包实现了简单的日志服务。本文介绍了标准库log的基本使用。 1.1 使用Logger log包定义了Logger类型,该类型提供了一些格式化输
阅读全文
摘要:fmt标准库是我们在学习Go语言过程中接触最早最频繁的一个了,本文介绍了fmtb包的一些常用函数。 1 fmt fmt包实现了类似C语言printf和scanf的格式化I/O。主要分为向外输出内容和获取输入内容两大部分。 2 向外输出 标准库fmt提供了以下几种输出相关函数。 2.1 Print P
阅读全文
摘要:Go语言内置的flag包实现了命令行参数的解析,flag包使得开发命令行工具更为简单。 1 os.Args 如果你只是简单的想要获取命令行参数,可以像下面的代码示例一样使用os.Args来获取命令行参数。 package main import ( "fmt" "os&
阅读全文
摘要:在 Go http包的Server中,每一个请求在都有一个对应的 goroutine 去处理。请求处理函数通常会启动额外的 goroutine 用来访问后端服务,比如数据库和RPC服务。用来处理一个请求的 goroutine 通常需要访问一些与请求特定的数据,比如终端用户的身份认证信息、验证相关的t
阅读全文
摘要:将字符串写入文件 最常见的写文件就是将字符串写入文件。这个写起来非常的简单。这个包含以下几个阶段。 创建文件 将字符串写入文件 我们将得到如下代码。 package main import ( "fmt" "os" ) func main() { f, err := os.Create("test.
阅读全文
摘要:将整个文件读取到内存 将整个文件读取到内存是最基本的文件操作之一。这需要使用 ioutil]包中的 ReadFile 函数。 让我们在 Go 程序所在的目录中,读取一个文件。我已经在 GOPATH 中创建了文件夹,在该文件夹内部,有一个文本文件 test.txt,我们会使用 Go 程序 fileha
阅读全文
摘要:什么是反射? 反射就是程序能够在运行时检查变量和值,求出它们的类型。Go是静态语言,因此反射的应用不多。 为何需要检查变量,确定变量的类型? 在学习反射时,所有人首先面临的疑惑就是:如果程序中每个变量都是我们自己定义的,那么在编译时就可以知道变量类型了,为什么我们还需要在运行时检查变量,求出它的类型
阅读全文
摘要:使用 New 函数创建自定义错误 创建自定义错误最简单的方法是使用 [errors]包中的 [New]函数。 在使用 New [函数]创建自定义错误之前,我们先来看看 New 是如何实现的。如下所示,是 [errors 包]中的 New 函数的实现。 // Package errors implem
阅读全文
摘要:什么是错误? 错误表示程序中出现了异常情况。比如当我们试图打开一个文件时,文件系统里却并没有这个文件。这就是异常情况,它用一个错误来表示。 在 Go 中,错误一直是很常见的。错误用内建的 error 类型来表示。 就像其他的内建类型(如 int、float64 等),错误值可以存储在变量里、作为函数
阅读全文
摘要:什么是 panic? 主动抛出异常,类似python中的raise。在 Go 语言中,程序中一般是使用[错误]来处理异常情况。对于程序中出现的大部分异常情况,错误就已经够用了。 但在有些情况,当程序发生异常时,无法继续运行。在这种情况下,我们会使用 panic 来终止程序。当[函数]发生 panic
阅读全文
摘要:什么是 defer? defer 语句的用途是:含有 defer 语句的函数,会在该函数将要返回之前,调用另一个函数。这个定义可能看起来很复杂,说白了就是,延迟执行,并且即便程序出现严重错误,也会执行。我们通过一段简单代码,来看看defer是如何执行的: package main import (
阅读全文