这是它的优点,因为编译器在编译时不去确定你传的到底是什么类型,你传一个string,它能接收,你传一个对象struct,它也能接收,它只有一个要求,实现我要求实现的方法!
既然interface是不限定类型,是通用类型,这是一种开放表现,这种开放怎么实现的呢?方法就是不去检验你的类型,既然不检验那也不去记录你的类型!!!!注意interface不记录你的类型,所以不管你是string,struct,int,我都不管,我都不记录,我只记录你的地址,结果是编译器在编译时也不知道你是什么类型,你有什么字段!
但是现在有一个问题,编译器也没办法确定一个interface以前是什么类型!(编译时)这就是因果关系:为了达到通用,interface不做确定工作,结果就是interface也不知道以前的类型。
一个类型转接口的过程,就是放弃自我类型的过程,变成了没有类型。
这样做有什么好处呢,很显然是:通用,如果把一个函数的传入参数设置为空接口(interface{}),那么任何类型当做参数都能够调用该接口,最好的例子就是:
它就是一个很标准的例子,println传入参数可以是任何类型,都能打印出它的值。
当然你可以说你记得,因为是你把它转换成interface,你理所当然的记得,可编译器不知道啊,interface不包含类型,也就是说你没有让它去记录,所以它不知道。
针对这个问题,go语言给了一个解决方案,断言,当将一个interface转换成它原来类型的时候,在它后面指明它的原来类型,这样编译器就知道该按照什么类型去解析了。(其实说白了,这就是通过人的记忆,编译器不知道是什么类型,你告诉编译器就可以了)
断言其实是先获取interface的动态类型,然后与你指定的类型做判断,如果一致,将它转换成你指定的类型。如果不知道动态类型,可以看这篇文章: >
在命令行或终端输入go即可查看所有支持的命令
go get:获取远程包(需提前安装git)
go run:直接运行程序
go build:测试编译,检查是否有编译错误
go fmt:格式化源码(部分IDE在保存时自动调用)
go install:编译包文件并编译整个程序
go test:运行测试文件
go doc:查看文档(CHM手册)
这样。不过只是个精确到纳秒的计时器,不是精确到纳秒的当前时间。windows好像只能拿到ms精度的当前时间吧,不是很清楚。
package main
import (
"syscall"
"time"
"unsafe"
)
func NewStopWatch() func() timeDuration {
var QPCTimer func() func() timeDuration
QPCTimer = func() func() timeDuration {
lib, _ := syscallLoadLibrary("kernel32dll")
qpc, _ := syscallGetProcAddress(lib, "QueryPerformanceCounter")
qpf, _ := syscallGetProcAddress(lib, "QueryPerformanceFrequency")
if qpc == 0 || qpf == 0 {
return nil
}
var freq, start uint64
syscallSyscall(qpf, 1, uintptr(unsafePointer(&freq)), 0, 0)
syscallSyscall(qpc, 1, uintptr(unsafePointer(&start)), 0, 0)
if freq <= 0 {
return nil
}
freqns := float64(freq) / 1e9
return func() timeDuration {
var now uint64
syscallSyscall(qpc, 1, uintptr(unsafePointer(&now)), 0, 0)
return timeDuration(float64(now-start) / freqns)
}
}
var StopWatch func() timeDuration
if StopWatch = QPCTimer(); StopWatch == nil {
// Fallback implementation
start := timeNow()
StopWatch = func() timeDuration { return timeSince(start) }
}
return StopWatch
}
func main() {
// Call a new stop watch to create one from this moment on
watch := NewStopWatch()
// Do some stuff that takes time
timeSleep(1)
// Call the stop watch itself and it will return a timeDuration
dur := watch()
}
这和语言没关系, *** 作系统要提供这样的原语。linux和windows都是可以的。
以上就是关于golang reflect反射(一):interface接口的入门(大白话)全部的内容,包括:golang reflect反射(一):interface接口的入门(大白话)、E 语言按F1提示GO声音怎么写、Golang——常用命令等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)