Golang Go语言中全局变量的一个疑问?

发布于 1周前 作者 nodeper 来自 Go语言

Golang Go语言中全局变量的一个疑问?

看别人写的 go 代码里面,经常在文件开头定义一些空的全局变量

var _ XX = XX{}

请问这有啥用?

6 回复

就是为了没啥用用的

开发的时候导入一个很可能用到的包, 但是一开始根本没用到, 总不能为了不报 unused import 的错, 每次编译都改来改去吧, 就直接让它没啥用一下…

更多关于Golang Go语言中全局变量的一个疑问?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


参考 uber go 规范

一般应该是 “var _ Client = &kubernetesClient{}” 或者 “var _ Client = (*kubernetesClient)(nil)” 的形式。

主要是为了快速查看 kubernetesClient 是否实现了 Client 的接口。

主要是用来保证 interface 的实现是完整的吧,因为如果实例没有完全实现接口是可以编译过去的,但是加了这个就编译不过去了

比如这样是没问题的,但是其实你可能是想要实现 TestInterface,这么写也不会给你报错,但和预期结果就不一样了

go<br>type TestInterface interface {<br> func1()<br> func2()<br>}<br><br>type test struct {<br>}<br><br>func (t *test) func1() {<br>}<br>

这样写就会有报错了

go<br>type TestInterface interface {<br> func1()<br> func2()<br>}<br><br>var _ TestInterface = test{}<br><br>type test struct {<br>}<br><br>func (t *test) func1() {<br>}<br>

<br>Cannot use 'test{}' (type test) as type TestInterface Type does not implement 'TestInterface' as some methods are missing: func2()<br>

1 楼正解, 这句话并不是告诉编译器 XX 实现了 XX

在Go语言中,全局变量是一个在包级别声明的变量,它可以在该包内的所有函数中被访问和修改。关于全局变量,这里有几个关键点可以帮助解答你的疑问:

  1. 声明与访问:全局变量通常在包的最顶层,即所有函数之外,使用var关键字声明。一旦声明,包内的任何函数都可以直接访问和修改它。

  2. 并发安全性:需要注意的是,如果全局变量在多个goroutine之间共享,那么对它的读写操作需要谨慎处理,以避免数据竞争。通常,可以通过使用互斥锁(sync.Mutex)来保护全局变量的访问。

  3. 生命周期:全局变量的生命周期贯穿整个程序的运行过程,从程序启动到结束。这意味着全局变量会占用内存资源,因此在不需要时应考虑是否使用全局变量。

  4. 设计考量:虽然全局变量在某些情况下可以简化代码,但它们也可能导致代码难以维护和理解,特别是当程序变得复杂时。因此,在可能的情况下,优先考虑使用局部变量、函数参数或接口来传递数据,而不是依赖全局变量。

  5. 命名规范:为了保持代码的可读性和可维护性,全局变量应该使用清晰、描述性的命名,并且遵循Go语言的命名约定。

总之,全局变量在Go语言中是一个有用的工具,但应谨慎使用,以避免潜在的问题。

回到顶部