这篇文章主要介绍“Golang如何实现不被复制的结构体”的相关知识,小编通过实际案例向大家展示操作过程,操免费云主机域名作方法简单快捷,实用性强,希望这篇“Golang如何实现不被复制的结构体”文章能帮助大家解决问题。sync包中的许多结构都是不允许拷贝的,比如sync.Cond
,sync.WaitGroup
,sync.Pool
, 以及sync包中的各种锁,因为它们自身存储了一些状态(比如等待者的数量),如果你尝试复制这些结构体:那么你将在你的 IDE 中看到一个醒目的警告:IDE是如何实现这一点的呢?我们自己又能否利用这一机制来告诉别人,不要拷贝某个结构体呢?(懒得看原理,只想知道怎么用,可以直接下划至结论部分)大部分编辑器/IDE都会在你的代码上运行go vet
,vet是Go官方提供的静态分析工具,我们刚刚得到的提示信息就是vet分析代码后告诉我们的。vet的实现在Go源码的cmd/vet
中,里面注册了很多不同类型的分析器,其中copylock
这个分析器会检查实现了Lock
和Unlock
方法的结构体是否被复制。copylock Analyser
在cmd/vet
中注册,具体实现代码在golang.org/x/tools/go/analysis/passes/copylock/copylock.go
中, 这里只摘抄部分核心代码进行解释:init
函数中把包级别的全局变量lockerType
进行了初始化,lockerType
内包含了两个方法: Lock
和Unlock
, 只有实现了这两个方法的结构体才是copylock Analyzer
要处理的对象。lockPath
会检测传入的参数是否实现了Lock
和Unlock
方法,如果是则返回类型的信息。而vet会在AST上每个需要检查的节点上调用lockPath
函数(如赋值、函数调用等场景)。如果在这些会导致复制的场景中,发现了锁结构体的复制,则会报告给用户:上面只列出了赋值操作的实现代码,其它类型的检查这里就不一一解释了,感兴趣的同学可以自行查看源码。只要你的IDE会帮你运行go vet
(目前主流的VSCode和GoLand都会自动帮你运行),你就能通过这个机制来提醒他人,尽量避免复制结构体。如果你的结构体也因为某些原因,不希望使用者复制,你也可以使用该机制来警告使用者:定义一个实现了Lock
和Unlock
的结构体将其放入你的结构体中:或直接让你的结构体实现Lock
和Unlock
方法:这样别人在尝试复制Foo
的时候,就会得到IDE的警告信息了。关于“Golang如何实现不被复制的结构体”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注百云主机行业资讯频道,小编每天都会为大家更新不同的知识点。
本文小编为大家详细介绍“Go语言变量与常量如何声明与使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Go语言变量与常量如何声明与使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。什么是变量?变量是一块可以随时存放数据的内存区域。…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。