随笔分类 - Golang
摘要:在微服务架构的系统中,请求在各服务之间流转,调用链错综复杂,一旦出现了问题和异常,很难追查定位,这个时候就需要链路追踪来帮忙了。链路追踪系统能追踪并记录请求在系统中的调用顺序,调用时间等一系列关键信息,从而帮助我们定位异常服务和发现性能瓶颈。 Opentracing Opentracing是分布式链
阅读全文
摘要:路由是web框架的核心功能。通常路由实现是这样的:根据路由里的 / 把路由切分成多个字符串数组,然后按照相同的前子数组把路由构造成树的结构;寻址时,先把请求的 url 按照 / 切分,然后遍历树进行寻址。 比如:定义了两个路由 /user/get,/user/delete,则会构造出拥有三个节点的路
阅读全文
摘要:go modules 是 golang 1.11 新加的特性。现在1.13 已经发布了,是时候用起来了。Modules官方定义为: 模块是相关Go包的集合。modules是源代码交换和版本控制的单元。 go命令直接支持使用modules,包括记录和解析对其他模块的依赖性。modules替换旧的基于G
阅读全文
摘要:GO111MODULE="off"GOARCH="amd64"GOBIN=""GOCACHE="/Users/js/Library/Caches/go-build"GOENV="/Users/js/Library/Application Support/go/env"GOEXE=""GOFLAGS=
阅读全文
摘要:GCC是一个功能强大的编译器,不仅可以编译我们很熟悉的C/C++,也可以做为Fortran、Pascal、Objective-C等语言的编译器。而GCCGO则是GCC专门用来编译Golang语言的。 GC,全称Golang Compiler,是Go语言官方编译器,也是自带的,通常我们使用的go bu
阅读全文
摘要:常用作编译命令行指定的单个go源码包。会生成一个以文件.o为后缀的目标文件,其文件名与包内第一个源文件的文件名相同。 目标文件可以与其他对象组合成一个包档案或直接传递给链接器(go tool link)。如果使用-pack调用,编译器会直接写入一个档案(archive),绕过中间目标文件。 生成的文
阅读全文
摘要:转自:https://dave.cheney.net/practical-go/presentations/qcon-china.html?from=timeline 1. Guiding principles If I’m going to talk about best practices in
阅读全文
摘要:$ go build -x -x会列出来go build调用到的所有命令。 如果你对Go的工具链好奇,或者使用了一个跨C编译器,并且想知道调用外部编译器用到的具体参数,或者怀疑链接器有bug;使用-x来查看所有调用。 $ go build -x WORK=/var/folders/00/1b8h80
阅读全文
摘要:问题 type User struct { ID int64 Name string Avatar string } func GetUserInfo() *User { return &User{ID: 13746731, Name: "EDDYCJY", Avatar: "https://ava
阅读全文
摘要:一、线程模型 N:1模型,N个用户空间线程在1个内核空间线程上运行。优势是上下文切换非常快但是无法利用多核系统的优点。 1:1模型,1个内核空间线程运行一个用户空间线程。这种充分利用了多核系统的优势但是上下文切换非常慢,因为每一次调度都会在用户态和内核态之间切换。(POSIX线程模型(pthread
阅读全文
摘要:转自:https://www.cnblogs.com/zhangboyu/p/7456606.html 1、什么是Context Context通常被译作上下文,它是一个比较抽象的概念。在公司技术讨论时也经常会提到上下文。一般理解为程序单元的一个运行状态、现场、快照,而翻译中上下又很好地诠释了其本质
阅读全文
摘要:1. 单测 + 压测 压测 go test -bench=. -benchmem 单元测试 go test -v . 2. pprof + 火焰图(查看cpu占用,内存占用) 嵌入代码 import ( rawhttp "net/http" _ "net/http/pprof" ) func ini
阅读全文
摘要:Profiling 在计算机性能调试领域里,profiling 就是对应用的画像,这里画像就是应用使用 CPU 和内存的情况。也就是说应用使用了多少 CPU 资源?都是哪些部分在使用?每个函数使用的比例是多少?有哪些函数在等待 CPU 资源?知道了这些,我们就能对应用进行规划,也能快速定位性能瓶颈。
阅读全文
摘要:一、单元测试 要开始一个单元测试,需要准备一个 go 源码文件,在命名文件时需要让文件必须以_test结尾。单元测试源码文件可以由多个测试用例组成,每个测试用例函数需要以Test为前缀,例如: func TestXXX( t *testing.T ) 测试用例文件不会参与正常源码编译,不会被包含到可
阅读全文
摘要:类似php中的urlencode 和htmlspecialchars: package main import ( "fmt" "html" "net/url" "testing" ) func Test_Escape(t *testing.T) { //url编码 str := "中文-_." u
阅读全文
摘要:一、安装 二、proto 文件 syntax = "proto3"; package gateway; import "google/api/annotations.proto"; message StringMessage { string value = 1; } service Gateway
阅读全文
摘要:一、概念 1、gRPC默认使用protocol buffers,这是google开源的一套成熟的结构数据序列化机制(当然也可以使用其他数据格式如JSON),可以用proto files创建gRPC服务,用protocol buffers消息类型来定义方法参数和返回类型。 二、安装 1、yum ins
阅读全文
摘要:在一个 go 程序中通常包含:包、常量、变量、init()、main()等元素,如果同时存在多个包,包之间存在依赖关系,每个包中存在多个 init 函数,每个文件中存在多个 init 函数,那么问题来了,他们之间的执行顺序是什么样的?通过本文我们来对它们之间的执行顺序做尽可能详尽的说明。如有不正之处
阅读全文
摘要:1、值的高效处理和存储,允许创建紧凑的数据结构,避免不必要的填充字节。紧凑的数据结构能更好地利用缓存。更好的缓存利用率可带来更好的性能。 2、函数的调用有开销,减少函数调用开销的解决方案是内联。简单的函数可以被 Go 编译器内联。 3、强制垃圾回收使 Go 成为一种更简单,更安全的语言。这意味着在堆
阅读全文