包含标签 go 的文章

为什么 Go 适合微服务

去年早些时候,我们决定改用 Go(Golang) 作为我们(SafetyCulture)开发微服务的选择。在这之前,我们的微服务使用 Node.js(CoffeeScript, Javascript 和 TypeScript 的混合 ) 编写。下来我将分享我们更改的原因。 1. 静态类型 Go 是一种静态类型语言,这意味着编译器可以为您做更多的工作。人们倾向于强调这一点的重要性。 生产事故的故事 去年,在……

阅读全文

Go Struct Tag 是怎么玩的

利用 go 反射机制,通过 不同的 tag name 进行不同的处理 package main import ( "fmt" "reflect" // 这里引入reflect模块 ) // 自定义 tag const tagName = "validate" type employee struct { ID int `json:"id"` Name string `json:"名字" validate:"presence,min=2,max=40"` Age int `json:"年龄"` Desc string `json:"描述" back:"好看否"`……

阅读全文

Go xml json 小结

最常见错误 struct 字段小写,序列化反序列化都无法访问——无法外部访问 解析 XML,反序列化,Unmarshal 如果 struct 的一个字段是 string 或者[]byt 类型且它的 tag 含有",inner xml “,Unmarshal 将会将此字段所对应的元素内所有内嵌的原始 xml 累加到此字段上 比如下边例子……

阅读全文

Go 时区设置

获取 time 对象 设置时区 按设置的时区输出 package main import ( "fmt" "time" ) func main() { now := time.Now() // 1. 获取 time 对象 // 2. 设置时区 local1, err1 := time.LoadLocation("") //等同于"UTC" if err1 != nil { fmt.Println(err1) } local2, err2 := time.LoadLocation("Local")//本地的时区 if err2 != nil { fmt.Println(err2) } local3, err3 := time.LoadLocation("America/Los_Angeles") if err3 != nil { fmt.Println(err3) } // 3. 按设置的……

阅读全文

Go 逃逸分析

参考:Go 逃逸分析 堆和栈 要理解什么是逃逸分析会涉及堆和栈的一些基本知识,如果忘记的同学我们可以简单的回顾一下: 堆(Heap):一般来讲是人为手动进行管理,手动申请、分配、释放。 堆适合不可预知大小的内存分配,这也意味着为此付出的代价是分配速度较慢,而且会形成内存碎片。 栈(Stack……

阅读全文

Go 堆栈的理解

来源:Go 堆栈的理解 在讲 Go 的堆栈之前,先温习一下堆栈基础知识。 什么是堆栈?在计算机中堆栈的概念分为:数据结构的堆栈和内存分配中堆栈。 数据结构的堆栈: 堆:堆可以被看成是一棵树,如:堆排序。在队列中,调度程序反复提取队列中第一个作业并运行,因为实际情况中某些时间较短的任务将等待很长时……

阅读全文

Go GC

参考:GO GC 垃圾回收机制 Go 作为一门高级语言,具有 自动垃圾回收 的功能。 常见垃圾回收机制 1. 引用计数:引用计数通过在对象上增加自己被引用的次数,被其他对象引用时加 1,引用自己的对象被回收时减 1,引用数为 0 的对象即为可以被回收的对象 优点: 1. 方式简单,回收速度快。 缺点: 1. 需要额外的空间存放……

阅读全文

go test 工具的简单介绍和使用

简单介绍 go test 子命令是 Go 语言包的测试驱动程序,在一个包目录中,以*_test.go 命名方式的文件,是 go test 编译的目标(不是 go build) 在*_test.go 文件中,三种函数需要特殊对待,即功能测试函数、基准测试函数和示例函数: 功能测试函数:以 Test 前缀命名的函数,用来检测一些程序逻辑的正……

阅读全文

channel 总结

1. 声明和类型 ChannelType = ( "chan" | "chan" "<-" | "<-" "chan" ) ElementType . 声明 双向:var ReadAndWriteChannel chan int 仅可读:var OnlyReadChannel <- chan int 仅可写:var OnlyWriteChannel chan <- int 初始化: make(chan int) //坑:没有数据,读取阻塞,直至写入数据 make(chan int,100) // 容量 缓存 buffer 2. 操作 c := make(chan int) 读:i := <- c 写: c <- (7+2) 遍历: range c 关闭: close(c) 坑:关闭channel,可读,不可写(panic) 多值……

阅读全文