随笔分类 - Go-basics
摘要:protobuf是一种高效的数据格式,平台无关、语言无关、可扩展,可用于 RPC 系统和持续数据存储系统。 1. protobuf介绍 Protobuf是Protocol Buffer的简称,它是Google公司于2008年开源的一种高效的平台无关、语言无关、可扩展的数据格式,目前Protobuf作
阅读全文
摘要:https://www.liwenzhou.com/posts/Go/performance_optimisation/
阅读全文
摘要:来源: https://www.liwenzhou.com/posts/Go/16_test/ go test工具 Go语言中的测试依赖go test命令。编写测试代码和编写普通的Go代码过程是类似的,并不需要学习新的语法、规则或工具。 go test命令是一个按照一定约定和组织的测试代码的驱动程序
阅读全文
摘要:1.作用 go build:用于测试编译包,在项目目录下生成可执行文件(有main包)。 go install:主要用来生成库和工具。一是编译包文件(无main包),将编译后的包文件放到 pkg 目录下($GOPATH/pkg)。二是编译生成可执行文件(有main包),将可执行文件放到 bin 目录
阅读全文
摘要:package main import ( "fmt" ) func main() { //基本数据类型(默认值) //如果是java,报错,变量未初始化 var a int fmt.Println(a) //0 a = 100 fmt.Println(a) //100 //数组(零) //数组是数
阅读全文
摘要:package main import ( "fmt" "net" "strings" ) // UDP server func main() { //源码:func ListenUDP(network string, laddr *UDPAddr) (*UDPConn, error) { conn
阅读全文
摘要:1. 服务端 package main import ( "bufio" "fmt" "net" "os" "strings" ) // tcp server端 func processConn(conn net.Conn) { defer conn.Close() // 3. 与客户端通信 var
阅读全文
摘要:package main import ( "encoding/json" "fmt" ) // 结构体与json // 1.序列化: 把Go语言中的结构体变量 --> json格式的字符串 // 2.反序列化: json格式的字符串 --> Go语言中能够识别的结构体变量 type person
阅读全文
摘要:package main import "fmt" func main() { var s []student fmt.Printf("%T\n", s) //[]main.student fmt.Println(s) //[] //初始化结构体切片 s = []student{ { name: "
阅读全文
摘要:1. 反射例子 2. 反射介绍 3. 反射实现的功能 一、引入 不同语言的反射模型不尽相同,有些语言还不支持反射。《Go 语言圣经》中是这样定义反射的: Go 语言提供了一种机制在运行时更新变量和检查它们的值、调用它们的方法,但是在编译时并不知道这些变量的具体类型,这称为反射机制。 为什么要用反射
阅读全文
摘要:go语言的最大两个亮点,一个是goroutine,一个就是chan了。二者合体的典型应用CSP,基本就是大家认可的并行开发神器,简化了并行程序的开发难度,我们来看一下CSP。 11.1、CSP是什么 CSP 是 Communicating Sequential Process 的简称,中文可以叫做通
阅读全文
摘要:select 是 Go 中的一个控制结构。select 语句类似于 switch 语句,但是select会随机执行一个可运行的case。如果没有case可运行,它将阻塞,直到有case可运行。 select语句的语法结构和switch语句很相似,也有case语句和default语句: select
阅读全文
摘要:1. NewTimer package main import ( "time" "fmt" ) func main() { /* 1. func NewTimer(d Duration) *Timer 创建一个计时器,d时间以后触发 */ timer := time.NewTimer(3 *tim
阅读全文
摘要:1. 非缓冲和缓冲 package main import ( "fmt" "strconv" ) func main() { /* 非缓冲通道:make(chan T) 一次发送,一次接收,都是阻塞的 缓冲通道:make(chan T , capacity) 发送:缓冲区的数据满了,才会阻塞 接收
阅读全文
摘要:通道可以被认为是Goroutines通信的管道。类似于管道中的水从一端到另一端的流动,数据可以从一端发送到另一端,通过通道接收。 在前面讲Go语言的并发时候,我们就说过,当多个Goroutine想实现共享数据的时候,虽然也提供了传统的同步机制,但是Go语言强烈建议的是使用Channel通道来实现Go
阅读全文
摘要:1. 临界资源 package main import ( "fmt" "time" ) func main() { /* 临界资源: */ a := 1 go func() { a = 2 fmt.Println("goroutine中。。",a) }() a = 3 time.Sleep(1)
阅读全文
摘要:package main import ( "fmt" "runtime" "time" ) //写在init函数里,main函数运行之前就先设置cpu func init() { //获取逻辑cpu的数量 fmt.Println("逻辑CPU的数量-->", runtime.NumCPU()) /
阅读全文
摘要:package main import ( "fmt" ) func main() { /* 一个goroutine打印数字,另外一个goroutine打印字母,观察运行结果。。 并发的程序的运行结果,每次都不一定相同。 不同计算机设备执行,效果也不相同。 go语言的并发:go关键字 系统自动创建并
阅读全文
摘要:1. 进程、线程、协程 进程(Process),线程(Thread),协程(Coroutine,也叫轻量级线程) 进程 进程是一个程序在一个数据集中的一次动态执行过程,可以简单理解为“正在执行的程序”,它是CPU资源分配和调度的独立单位。 进程一般由程序、数据集、进程控制块三部分组成。我们编写的程序
阅读全文
摘要:1. ioutil包的方法 // Discard 是一个 io.Writer 接口,调用它的 Write 方法将不做任何事情 // 并且始终成功返回。 var Discard io.Writer = devNull(0) // ReadAll 读取 r 中的所有数据,返回读取的数据和遇到的错误。 /
阅读全文