golang 常用配置

前言

记录一些常用环境变量配置或者命令,提高开发效率

环境变量

软件基础环境变量

# linux 修改环境变量
vim /etc/profile    

# 必要配置
export GOROOT="/usr/local/go" # go安装位置
export PATH=$PATH:$GOROOT/bin # go可执行文件加入全局

# 非必要配置
export GOPATH="/home/mygo"  # 项目位置
export PATH=$PATH:$GOPATH/bin # 项目可执行文件加入全局

# 环境变量生效
source /etc/profile 

# 检验
echo $GOROOT 
echo $GOPATH 
echo $PATH
go version 

开发配置

常用的一些开发配置也可以通过环境变量设置,这里采用go env对进行快速切换

# go 环境变量操作
go env              #查询
go env -w KEY=VALUE #写入

# go 设置 go get 代理
# 解决一些go get无响应问题
go env -w GOPROXY=https://goproxy.cn,direct

# go 过滤私有库不走代理(逗号隔开)
go env -w GOPRIVATE=*.gitlab.com,*.gitee.com

# 关闭校验or切换国内
# 解决go get sum校验慢问题
go env -w GOSUMDB=off                    #关闭包sum.golang.org
go env -w GOSUMDB="sum.golang.google.cn" # 国内提供的sum 验证服务
# 镜像源代理
# 官方提供的 jfrog
export GOPROXY=https://gocenter.io
# 官方提供的 golang 
export GOPROXY=https://proxy.golang.org
# 阿里云
export GOPROXY=https://mirrors.aliyun.com/goproxy/
# nexus社区提供的
export GOPROXY=https://gonexus.dev
# goproxy.io 的
export GOPROXY=https://goproxy.io/
# 基于athens的公共服务
export GOPROXY=https://athens.azurefd.net
# 七牛云赞助支持的
export GOPROXY=https://goproxy.cn

交叉编译

go 编译可执行文件时如果存在跨平台需要进行交叉编译到目标平台可运行的执行文件。

GOOS:目标平台的操作系统(darwin、freebsd、linux、windows)
GOARCH:目标平台的体系架构(386、amd64、arm)
CGO:交叉编译不支持

mac

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go  # linux
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go # win

linux

CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build main.go  # mac
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go # win

win

# mac
SET CGO_ENABLED=0
SET GOOS=darwin
SET GOARCH=amd64
go build main.go
# linux
SET CGO_ENABLED=0
SET GOOS=linux
SET GOARCH=amd64
go build main.go
<think>好的,用户想了解Golang常用的软件设计模式及其最佳实践。首先,我需要回忆Golang的设计模式常见资料,并结合用户提供的引用内容。 用户提供的引用里提到了选项模式、单例模式,还有领域驱动设计。引用2详细说明了选项模式的应用,因为Golang不支持默认参数,选项模式可以优雅地处理可选参数。引用4提到了单例模式的最佳实践,使用sync.Once和atomic包确保线程安全且高效。引用3提到了领域驱动设计在Golang中的实践,可能涉及工厂模式或仓储模式。引用1提到创建型模式,比如工厂方法和单例模式,这些都是常见的设计模式。 接下来,我需要整理Golang常用的设计模式,确保涵盖创建型、结构型和行为型。除了用户提到的选项模式和单例模式,可能还有工厂模式、装饰器模式、策略模式等。需要结合Go语言的特点,比如接口、组合、并发等,说明这些模式的具体实现。 例如,选项模式通常用于构建复杂对象,通过传递函数选项来设置属性。单例模式使用sync.Once确保只实例化一次。工厂模式可以利用Go的接口和结构体来创建对象。装饰器模式可以通过函数闭包实现。策略模式则可以利用接口实现不同算法的替换。 还要注意引用中的最佳实践,比如实例5的单例模式实现,强调正确性和性能。同时,选项模式如何解决默认参数的问题,提高代码的可读性和扩展性。 需要确保回答结构清晰,分点列出每个模式,说明用途、实现方式和示例代码。同时,生成相关问题,可能涉及其他模式、具体实现细节或性能优化等。 最后,检查是否符合用户的要求,比如使用中文回答,正确使用LaTeX格式,引用标记正确。确保每个模式都有对应的引用支持,比如选项模式引用2,单例模式引用4,领域驱动设计引用3,创建型模式引用1。</think>### Golang常用软件设计模式及最佳实践 在Go语言开发中,设计模式的应用既遵循通用软件工程原则,又需结合Go特有的语法特性。以下是几种典型模式及其实现: #### 1. 选项模式(Functional Options) *适用场景*:需要处理多个可选参数的复杂对象初始化 *实现方式*:通过函数闭包传递配置参数 ```go type Server struct { Host string Port int } type Option func(*Server) func WithHost(host string) Option { return func(s *Server) { s.Host = host } } func NewServer(opts ...Option) *Server { s := &Server{Host: "localhost", Port: 8080} // 默认值 for _, opt := range opts { opt(s) } return s } // 使用示例:NewServer(WithHost("192.168.1.1")) ``` 此模式解决了Go不支持默认参数的问题,同时保持API简洁[^2]。 #### 2. 单例模式(Singleton) *适用场景*:全局唯一实例的线程安全创建 *最佳实践*:使用`sync.Once`确保原子性 ```go var ( instance *Database once sync.Once ) type Database struct { // 数据库连接字段 } func GetInstance() *Database { once.Do(func() { instance = &Database{} // 初始化操作 }) return instance } ``` 此实现保证线程安全且避免重复初始化,优于双重检查锁定等传统方式[^4]。 #### 3. 工厂模式(Factory) *适用场景*:对象创建逻辑封装 *Go实现*:通过接口隐藏具体类型 ```go type Document interface { Export() string } type PDFDocument struct{} func (p PDFDocument) Export() string { return "PDF content" } func NewDocument(format string) Document { switch format { case "pdf": return &PDFDocument{} // 其他格式实现 } return nil } ``` #### 4. 装饰器模式(Decorator) *适用场景*:动态扩展功能 *Go实现*:利用函数闭包 ```go type HttpHandler func(w http.ResponseWriter, r *http.Request) func WithLogging(h HttpHandler) HttpHandler { return func(w http.ResponseWriter, r *http.Request) { log.Println("Request started") h(w, r) log.Println("Request completed") } } ``` #### 5. 策略模式(Strategy) *适用场景*:算法替换 *Go实现*:接口组合 ```go type CompressionStrategy interface { Compress(data []byte) []byte } type ZipStrategy struct{} func (z ZipStrategy) Compress(data []byte) []byte { // zip压缩实现 } type Compressor struct { strategy CompressionStrategy } func (c *Compressor) SetStrategy(s CompressionStrategy) { c.strategy = s } ``` ### 领域驱动设计实践 在复杂业务系统中,Go可通过以下方式实现DDD: - 使用`聚合根`管理领域对象生命周期 - 通过`仓储模式`隔离数据访问层 - 采用`CQRS`分离读写操作 如GoDDD项目展示了如何将Java的DDD模式适配到Go语言[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mars'Ares

请我喝杯咖啡吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值