Go语言中常见100问题-#14 Ignoring package name collisions
2023-06-13 09:15:58 时间
忽视包名冲突
当变量名与包名相同时会发生包冲突,会阻止包被重用。下面来看一个Redis客户端库的具体例子。
package redis
type Client struct { ... }
func NewClient() *Client { ... }
func (c *Client) Get(key string) (string, error) { ... }
上述代码保存在redis库中,现在有一个客户端程序,使用到上面的redis包提供的功能。尽管调用的包名是redis,但在Go语言中创建一个名为redis的变量是完全有效的。
redis := redis.NewClient()
v, err := redis.Get("foo")
上面这个客户端调用程序中变量名和包名都是redis,虽然语法上没有任何问题,但是应该避免这种做法。这会导致在整个redis变量的作用域范围内,redis包将无法访问。
假设在一个函数中同时使用了变量redis和包名redis,在这种情况下,阅读代码的时候可能混淆不清。有哪些方法可以避免这种冲突呢?第一种处理方法是使用不同的变量名,例如像下面变量取名为redisClient。
redisClient := redis.NewClient()
v, err := redisClient.Get("foo")
虽然上面这种做法非常直接有效,但是,如果出现某种原因我们更喜欢保留名为redis的变量,这时可以在导入包上做点文章,给导入包起一个别名,代码中使用包的别名可以避免冲突,示例程序如下。使用redisapi导入别名来引用redis包,这样就可以保留变量名redis.
import redisapi "mylib/redis"
// ...
redis := redisapi.NewClient()
v, err := redis.Get("foo")
「NOTE:还有一种做法是导包时使用 . 导入来访问没有包限定符的包中的所有公共元素。然而,这种方法往往会增加混淆,在大多数情况下应该避免使用。」
还要注意,我们应该避免变量名和内置函数名之间的名称相同冲突。例如,下面这个拷贝操作, 函数 copyFile 返回结果赋值给了变量 copy, 与内置的函数 copy 冲突了,导致内置的copy函数无法访问。我们应该防止变量名冲突以避免歧义。如果遇到冲突,我们应该找到另一个有意义的名称或使用导入包别名。
copy := copyFile(src, dst)
相关文章
- Go语言内建方法之append、delete 、copy (十四)
- Go语言结构体之属性及函数(十八)
- 【R语言】解决GO富集分析绘图,标签重叠问题
- go语言 ssh_websshpro
- GoLang12 - Go语言指针
- Go语言中常见100问题-#1 Unintended variable shadowing
- Go语言中常见100问题-#2 Unnecessary nested code
- Go语言中常见100问题-#7 Returning interfaces
- Go语言中常见100问题-#9 Being confused about when to use generics
- Go语言中常见100问题-#11 Not using the functional options pattern
- Go语言中常见100问题-#13 Creating utility packages
- Go语言中常见100问题-#19 Not understanding floating points
- Go语言中常见100问题-#20 Not understanding slice length and capacity
- 「Go工具箱」一个对语义化版本进行解析、比较的库:go-version
- 「Go工具箱」go语言csrf库的使用方式和实现原理
- Go语言之旅[一]详解大数据
- Go语言网络爬虫下载器接口
- Go语言爬取图片小程序
- Go语言组合和方法集
- Go语言使用匿名结构体解析JSON数据
- Go语言连接Oracle数据库实战(go连接oracle)
- 深度探索Go语言与Redis结合(go-redis)
- 程序Linux上运行Go语言程序的指南(linux运行go)
- Go语言环境配置:在 Linux 下实现(go环境搭建linux)
- 使用Go语言操作MongoDB数据库的教程(mongodbgo)
- Go语言快速安装Oracle数据库(go语言安装oracle)
- 新技术Go语言解析Oracle数据库日志(go解析oracle日志)
- 语句使用Oracle中的Go语句来简化编程(oracle中go)