golang reflect反射(一):interface接口的入门(大白话)

​ 这是它的优点,因为编译器在编译时不去确定你传的到底是什么类型,你传一个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——常用命令等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/9613924.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存