Go使用变量类型声明和方法的注意事项

摘要:
当我们将现有类型定义为新类型时,新类型将不会继承现有类型的方法。一个简短的错误代码:packagemainimport“sync”typemyMutex sync。Mutexfuncmain(){varmtxmyMutexmx.Lock()mtx.Unlock()}输出:#命令行参数。mtx。锁定已定义。mtx Unlockundefined乍一看,代码似乎正常。报告了实际错误“myMutex类型没有字段或方法锁”?

当我们通过把一个现有(非interface)的类型定义为一个新的类型时,新的类型不会继承现有类型的方法。

神马意思?来一段简短错误的代码:

package main
import "sync"
type myMutex sync.Mutex
func main() {
    var mtx myMutex
    mtx.Lock() 
    mtx.Unlock()
}

输出:

# command-line-arguments
.mtx.Lock undefined (type myMutex has no field or method Lock)
. mtx.Unlock undefined (type myMutex has no field or method Unlock)

初步看代码貌似没啥问题。实际报错“myMutex类型没有字段或方法锁”?怎么解决?
如果我们确实需要原有类型的方法,可以定义一个新的struct类型,用匿名方式把原有类型嵌入进来即可:

package main
import "sync"
type myLocker struct {
    sync.Mutex
}
func main() {
    var mtx myLocker
    mtx.Lock()
    mtx.Unlock()
}

换成interface类型的声明也会保留它们的方法集合:

package main
import "sync"
type myLocker sync.Locker
func main() {
    var mtx  myLocker = new(sync.Mutex)
    mtx .Lock()
    mtx .Unlock()
}

类型声明和方法大家注意下即可。

免责声明:文章转载自《Go使用变量类型声明和方法的注意事项》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇CTR预估模型C# 生成不重复随机字符串 (1秒内生成1000000个) PHP下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

你注意到 .Net Framework 和 .Net Core 中使用 Session 的区别了吗?

起因 在测试一个例子时发现的问题,这个示例实现的功能是刷新页面也能保持表格锁定列的状态,先看下页面的完成效果: 测试中发现,几乎相同的代码: 在 FineUIMvc(Net Framework)下没有问题:http://mvc.fineui.com/#/GridLockColumn/SaveToDB 但是在 FineUICore(Net Core)下...

Code Tips: 线程读写锁自旋导致的死循环

发现问题        项目测试的时候,发现运行一段时间后会出现cpu百分之百的情况。     想着可能是哪里出现了死循环,于是打算用gdb跟一下,结果gdb居然无法attach到进程。 定位问题     查了查去,原来有一个优先级为RT的实时线程出现了死循环,并且由于配置了CPU的亲和属性,使得进程只运行在第一个核上,此时gdb就无法attach了   ...

C++11多线程编程系列-相关库函数使用

1、C++11 新标准中引入了多个头文件来支持多线程编程,分别是<atomic>,<thread>,<mutex>,<condition_variable>和<future>。 <atomic>:该头文主要声明了两个类, std::atomic 和 std::atomic_flag,另...