栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Go中独特功能的集合

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Go中独特功能的集合

您可以使用

reflect.Value
Uvelichitel提出的功能,也可以使用功能地址作为的
string
获取者,也可以使用
fmt.Sprint()
地址作为的
uintptr
获取者
reflect.Value.Pointer()
,但是我建议您反对使用它。

由于语言规范不允许比较函数值,也不允许采用它们的地址,因此您不能保证程序中一次起作用的东西总是可以起作用,包括特定的运行,并且包括不同的(未来)去编译器。我不会用它。

由于规范对此非常严格,因此这意味着允许编译器生成代码,例如,它们将在运行时更改函数的地址(例如,卸载未使用的函数,然后在以后再次需要时再次加载)。我目前不知道这种行为,但这并不意味着将来的Go编译器将不会利用这种行为。

如果您以任何格式存储函数地址,则该值不再视为保留函数值。如果没有其他人会“拥有”函数值,那么生成的代码(和Go运行时)将是“自由的”,可以修改/重新定位函数(从而更改其地址),而不会违反规范和Go的类型安全性。因此,您不能理会并责怪编译器,而只能怪您自己。

如果要检查重用,则可以使用接口值。

假设您需要带有签名的函数:

func(p ParamType) RetType

创建一个接口:

type EventResponse interface {    Do(p ParamType) RetType}

例如,您可以具有未导出的

struct
类型,并且指向它的指针可以实现您的
EventResponse
接口。使导出函数返回单个值,因此不能创建新值。

例如:

type myEvtResp struct{}func (m *myEvtResp) Do(p ParamType) RetType {    // Your logic comes here}var single = &myEvtResp{}func Get() EventResponse { return single }

是否真的需要将实现隐藏在包中,并且仅创建和“发布”单个实例?不幸的是,是的,因为否则您可以创建其他值,例如

&myEvtResp{}
可能是具有相同
Do()
方法的不同指针,但接口包装器值可能不相等:

接口值是可比较的。如果两个接口值具有相同的动态类型和相等的动态值,或者两个接口值都具有value,则它们是相等的

nil

[…和…]

指针值是可比较的。如果两个指针值指向同一个变量,或者两个指针值均为nil,则它们相等。指向不同零大小变量的指针可以相等或可以不相等。

该类型

*myEvtResp
实现
EventResponse
,因此您可以注册它的值(唯一的值,可通过访问
Get()
)。您可以具有一个类型映射,可以
map[EventResponse]bool
在其中存储注册的处理程序,接口值作为键和
true
值存储。使用不在地图中的键为地图编制索引会产生地图的值类型的零值。因此,如果地图的值类型为
bool
,则使用不存在的键对其进行索引将导致
false
–告诉它不在地图中。用已经注册
EventResponse
的键(现有键)建立索引将得到存储的值
true
–告诉它在地图中,它已经被注册。

您可以简单地检查一个是否已经注册:

type EventResponseSet map[*EventResponse]boolfunc (ers EventResponseSet) Add(r EventResponse) {    if ers[r] {        // warn here        return    }    ers[r] = true}

结束语: 为避免重复使用,这似乎有点麻烦。我同意,我不会去做。但是如果你想…



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/468987.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号