百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

GO语言入门 go语言入门书籍推荐

bigegpt 2024-10-29 12:58 5 浏览

一、GO基础

1. GOPATH

2. GO 命令源码文件

1)命令源码文件定义:

命令源码文件是程序的运行入口,如果一个源码文件声明属于main包,并且包含一个无参数声明的main函数,那么它就是命令源码文件

2)命令源码文件接收参数的包:

GO语言标准库中有一个代码包flag专门用于接收和解析程序参数

A. flag.StringVar()

 flag.StringVar(&name, "name", "everyone", "The greeting object.")

需要4个参数:

  • 1)用于存储该命令参数的值地址,一般取先前定的变量的地址。如先前生命var name string; 则取&name
  • 2)指定该命令参数名称
  • 3)该命令参数的默认值
  • 4)该命令参数的简短说明

B. flag.String(): 直接返回一个已给分配好的用于存储命令参数值的地址

 flag.String("name", "everyone", "The greeting object.")

3)命令源码文件传入参数及查看参数说明C. flag.Parse(): 用于真正解析命令参数,并把它们的值赋给相应的变量

a. demo2.go文件
package main

import (
	"flag"
	"fmt"
)

func init() {
	flag.StringVar(&name, "name", "everyone", "The greeting object.")
}

var name string

func main() {
	flag.Parse()
	fmt.Printf("Hello, %s!\n", name)
}
b. 传参数name,执行
$go run demo2.go -name="wujun"
$Hello, wujun!
C. 执行help查看命令参数说明
$go run demo2.go --help
$Usage of /var/folders/tc/25kk9vz522v3f6j_tffxzrwr0000gn/T/go-build732294726/b001/exe/demo2:
  -name string
        The greeting object. (default "everyone")
exit status 2

二、 GO常用工具

1. 常用字符串函数处理包

  • strings
  • strconv

2. 常用Go依赖管理工具

  • godep
  • glide
  • dep

3. GO相关库

  • GO测试断言库:https://github.com/stretchr/testify
  • GO BDD相关库:https://github.com/smartystreets/goconvey
  • GO Json库:https://github.com/mailru/easyjson
  • GO Router库:https://github.com/julienschmidt/httprouter
  • GO相关限流库:https://github.com/didip/tollbooth

4. 测试相关

  • 单元测试 : go test
  • Bechmark测试 , 包括性能消耗: go test -bench=. -benchmem

三、GO GC

1. 避免内存分配和复制

(1) 复杂对象尽量传递引用

  • 数组的传递
  • 结构体的传递

(2) 初始化至合适的大小

  • 自动扩容是有代价的

(3) 复制内存

2. 打开GC日志

(1) 加上GODEBUG环境变量

GODEBUG=gctrace=1 go test -bench=.
GODEBUG=gctrace=1 go run main.go

(2) 日志详情信息参考:https://godoc.org/runtime

3. go tool trace

(1) 普通程序输出trace信息



(2) 测试程序输出trace信息

go test -trace trace.out

(3) 可视化trace信息

go tool trace trace.out

四、GO 性能调优

1)安装graphviz

brew install graphviz

3)安装go-torch2) 将GOPATH/bin 加入 $PATH

  • go get github.com/uber/go-torch
  • 下载并复制flamegraph.pl(https://github.com/brendangergg/FlameGraph) 至 $GOPATH/bin路径下
  • 将$GOPATH/bin加入$PATH

4)通过文件方式输出Profile

灵活性高,适用于特定代码段的分析,通过手动调用runtime/pprof的API,API相关文档:https://studygolang.com/static/pkgdoc/pkg/runtime_pprof.htm
go tool pprof [binary] [binary.prof]
go build xxx.go
./xxxx
go tool pprof prof xxx.prof
top
list  [function]
svg 生成图
go-touch [binary.prof]

5) Go支持的多种Profile

  • go help testflag
  • https://golang.org/src/runtime/pprof/pprof.go

6)通过HTTP方式输出Profile

简单,适合于持续性运行的应用,在应用程序的中导入import_ "net/http/pprof", 并启动http server即可

http://<host>:<port>/debug/pprof
go tool pprof _http://<host>:<port>/debug/pprof/profile?seconds=10 (默认为30s)
go-torch -seconds 10 http://<host>:<port>/debug/pprof/profile

7)常见性能优化指标

  • Wall Time : 挂钟时间(函数运行的绝对时间)
  • CPU Time
  • Block Time
  • Memory allocation
  • GC times/time spent

8) 通过Benchmark进行性能分析

go test -bench=.    //benchmark测试
go test -brench=. -cpuprofile=cpu.prof   //生成cpu prof分析文件
go test -brench=. -memprofile=mem.prof  //生成mem prof分析文件
go tool pprof mem.prof  // 性能分析

9)锁对性能的影响

(1)减少锁的影响范围

(2)减少发生锁冲突的概率

A. sync.Map
  • 场景:读多写少场景
  • 原理:https://my.oschina.net/qiangmzsx/blog/1827059
B. Concurrent Map
  • 场景:读写相当场景
  • 地址:https://github.com/easierway/concurrent_map

(3) 避免锁的使用

  • LAMX Disruptor: https://martinfowler.com/articles/lmax.html

10)字符串连接

常见字符串连接方式:
  • +
  • fmt.Sprintf
  • strings.Builder
  • bytes.Buffer
上述方式的性能:strings.Builder >= bytes.Buffer > + > fmt.Sprintf

五、 GO设计思路

1) 面向错误的设计

A. 隔离

隔离错误:Micro Kernel(微内核设计)



隔离错误:部署


B. 重用VS隔离


C. 冗余



D. 单点失效



E. 慢响应

  • 不要无休止的等待(给阻塞操作都加上一下超时限制)

D. 错误传递

断路器(配合服务降级)


2) 面向恢复的设计

A. 健康检查

a. 注意僵尸进程
  • 池化资源耗尽
  • 死锁
b. let it crash!

B. 构建可恢复的系统

a. 拒绝单体系统
b. 面向错误和恢复的设计
  • 在依赖服务不可用时,可以继续存活
  • 快速启动
  • 无状态
C. 与客户端协商

3) Chaos Engineering

如果问题经常发生人们就会学习和思考解决它的方法



A. Chaos Engineering原则

  • 构建一个我们想要的稳定的形为
  • 尝试各种真实事件
  • 在生产环境运行实验
  • 自动持续的实验
  • 最小化影响半径

B. 相关开源项目

https://github.com/Netflix/chaosmonkey

https://github.com/easierway/service_decorators/blob/master/README.md

六、GO相关书籍推荐


相关推荐

悠悠万事,吃饭为大(悠悠万事吃饭为大,什么意思)

新媒体编辑:杜岷赵蕾初审:程秀娟审核:汤小俊审签:周星...

高铁扒门事件升级版!婚宴上‘冲喜’老人团:我们抢的是社会资源

凌晨两点改方案时,突然收到婚庆团队发来的视频——胶东某酒店宴会厅,三个穿大红棉袄的中年妇女跟敢死队似的往前冲,眼瞅着就要扑到新娘的高额钻石项链上。要不是门口小伙及时阻拦,这婚礼造型团队熬了三个月的方案...

微服务架构实战:商家管理后台与sso设计,SSO客户端设计

SSO客户端设计下面通过模块merchant-security对SSO客户端安全认证部分的实现进行封装,以便各个接入SSO的客户端应用进行引用。安全认证的项目管理配置SSO客户端安全认证的项目管理使...

还在为 Spring Boot 配置类加载机制困惑?一文为你彻底解惑

在当今微服务架构盛行、项目复杂度不断攀升的开发环境下,SpringBoot作为Java后端开发的主流框架,无疑是我们手中的得力武器。然而,当我们在享受其自动配置带来的便捷时,是否曾被配置类加载...

Seata源码—6.Seata AT模式的数据源代理二

大纲1.Seata的Resource资源接口源码2.Seata数据源连接池代理的实现源码3.Client向Server发起注册RM的源码4.Client向Server注册RM时的交互源码5.数据源连接...

30分钟了解K8S(30分钟了解微积分)

微服务演进方向o面向分布式设计(Distribution):容器、微服务、API驱动的开发;o面向配置设计(Configuration):一个镜像,多个环境配置;o面向韧性设计(Resista...

SpringBoot条件化配置(@Conditional)全面解析与实战指南

一、条件化配置基础概念1.1什么是条件化配置条件化配置是Spring框架提供的一种基于特定条件来决定是否注册Bean或加载配置的机制。在SpringBoot中,这一机制通过@Conditional...

一招解决所有依赖冲突(克服依赖)

背景介绍最近遇到了这样一个问题,我们有一个jar包common-tool,作为基础工具包,被各个项目在引用。突然某一天发现日志很多报错。一看是NoSuchMethodError,意思是Dis...

你读过Mybatis的源码?说说它用到了几种设计模式

学习设计模式时,很多人都有类似的困扰——明明概念背得滚瓜烂熟,一到写代码就完全想不起来怎么用。就像学了一堆游泳技巧,却从没下过水实践,很难真正掌握。其实理解一个知识点,就像看立体模型,单角度观察总...

golang对接阿里云私有Bucket上传图片、授权访问图片

1、为什么要设置私有bucket公共读写:互联网上任何用户都可以对该Bucket内的文件进行访问,并且向该Bucket写入数据。这有可能造成您数据的外泄以及费用激增,若被人恶意写入违法信息还可...

spring中的资源的加载(spring加载原理)

最近在网上看到有人问@ContextConfiguration("classpath:/bean.xml")中除了classpath这种还有其他的写法么,看他的意思是想从本地文件...

Android资源使用(android资源文件)

Android资源管理机制在Android的开发中,需要使用到各式各样的资源,这些资源往往是一些静态资源,比如位图,颜色,布局定义,用户界面使用到的字符串,动画等。这些资源统统放在项目的res/独立子...

如何深度理解mybatis?(如何深度理解康乐服务质量管理的5个维度)

深度自定义mybatis回顾mybatis的操作的核心步骤编写核心类SqlSessionFacotryBuild进行解析配置文件深度分析解析SqlSessionFacotryBuild干的核心工作编写...

@Autowired与@Resource原理知识点详解

springIOCAOP的不多做赘述了,说下IOC:SpringIOC解决的是对象管理和对象依赖的问题,IOC容器可以理解为一个对象工厂,我们都把该对象交给工厂,工厂管理这些对象的创建以及依赖关系...

java的redis连接工具篇(java redis client)

在Java里,有不少用于连接Redis的工具,下面为你介绍一些主流的工具及其特点:JedisJedis是Redis官方推荐的Java连接工具,它提供了全面的Redis命令支持,且...