欢迎来到代码驿站!

Golang

当前位置:首页 > 脚本语言 > Golang

Golang中禁止拷贝的实现代码

时间:2021-01-09 11:14:07|栏目:Golang|点击:

前言

Go中没有原生的禁止拷贝的方式,所以如果有的结构体,你希望使用者无法拷贝,只能指针传递保证全局唯一的话,可以这么干,定义 一个结构体叫 noCopy,要实现 sync.Locker 这个接口

方法如下:

// noCopy may be embedded into structs which must not be copied
// after the first use.
//
// See https://golang.org/issues/8005#issuecomment-190753527
// for details.
type noCopy struct{}

// Lock is a no-op used by -copylocks checker from `go vet`.
func (*noCopy) Lock() {}
func (*noCopy) UnLock() {}

然后把 noCopy 嵌到你自定义的结构体里,然后 go vet 就可以帮我们进行检查了。

举个例子:

package main

import (
"fmt"
)

type noCopy struct{}

func (*noCopy) Lock() {}
func (*noCopy) Unlock() {}

type Demo struct {
noCopy noCopy
}

func Copy(d Demo) {
CopyTwice(d)
}
func CopyTwice(d Demo) {}

func main() {
d := Demo{}
fmt.Printf("%+v", d)

Copy(d)

fmt.Printf("%+v", d)
}

执行一下:

$ go vet main.go
# command-line-arguments
./main.go:16: Copy passes lock by value: main.Demo contains main.noCopy
./main.go:17: call of CopyTwice copies lock value: main.Demo contains main.noCopy
./main.go:19: CopyTwice passes lock by value: main.Demo contains main.noCopy
./main.go:23: call of fmt.Printf copies lock value: main.Demo contains main.noCopy
./main.go:25: call of Copy copies lock value: main.Demo contains main.noCopy
./main.go:27: call of fmt.Printf copies lock value: main.Demo contains main.noCopy
  • https://golang.org/issues/8005#issuecomment-190753527
  • https://github.com/jiajunhuang/go/blob/annotated/src/sync/cond.go#L94:6
  • https://stackoverflow.com/questions/52494458/nocopy-minimal-example

总结

上一篇:Golang编程实现删除字符串中出现次数最少字符的方法

栏    目:Golang

下一篇:Golang 内存模型详解(一)

本文标题:Golang中禁止拷贝的实现代码

本文地址:http://www.codeinn.net/misctech/42526.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有