这似乎是一个愚蠢的问题,但我想创建一个包含函数集合的结构,但函数绑定(bind)到该结构。我可以看出这是一个循环,但请用这个例子来逗我:
type FuncType func() error
type FuncSet struct {
TokenVariable int
FuncTyper FuncType
}
我希望能够创建一个绑定(bind)到 FuncSet 类型的函数,以便它可以对 TokenVariable 进行操作,因此:
func (f *FuncSet) FuncType() error {
f.TokenVariable = 100
return nil
}
但是,这会更改类型的签名(我找不到任何有关类型绑定(bind)的信息作为函数类型规范的一部分),因此将此函数分配给结构元素会告诉我未找到此函数/变量。
我可以看到一个简单的解决方法,通过在参数前加上一个指向结构类型的指针,这有点难看。
我四处看了看,发现我正在寻找的东西有点像一个闭包,因为它可以从直接的外部范围传递一个变量但是......好吧,我很高兴得到纠正关于函数类型中缺少类型绑定(bind)的问题,但目前将指针传递给该类型看起来是可行的方法。
我想我找到了解决方案:
type nullTester func(*Bast, uint32) bool
type Bast struct {
...
isNull nullTester
...
}
func isNull(b *Bast, d uint32) bool {
return d == 0
}
然后我可以将它绑定(bind)到这样的类型:
func NewBast() (b *Bast) {
...
b.isNull = isNull
...
}
// IsNull - tests if a value in the tree is null
func (b *Bast) IsNull(d uint32) bool {
return b.isNull(b, d)
}
这似乎有点老套,我不确定在我将要编写的第二个库中会发生什么,它为 uint32 参数设置了不同的类型,但是 go vet 很高兴,所以也许这是正确的方法
在我看来,func 类型确实应该在语法中有一个字段来指定绑定(bind)类型,但也许我只是发现了一个可以让我进行多态性的 hack。在调用程序时,他们将看到的只是按计划绑定(bind)到类型的良好导出函数,我获得了可读性以及能够重新定位基础库以存储不同类型的数据。
我认为这是正确的解决方案。我只是找不到任何东西来确认或否认在类型名称函数规范中是否有任何断言类型的方法。它确实不应该匹配,因为绑定(bind)是签名的一部分,但是带有函数的类型的语法似乎没有这种类型绑定(bind)。
我的实际代码在这里,您可以通过查看它来了解我的目标: https://github.com/calibrae-project/bast/blob/master/pkg/bast/bast.go
树存储的数据类型之间的差异完全是表面的,因为它主要用于对各种长度的无符号整数进行排序,并且它需要具备的一件重要事情是能够从一个,例如,64 位整数,但仅按前半部分或后半部分排序(因为我有一个更大的项目将这些哈希值视为邻接列表中的坐标)。理论上,它也可以用来代替哈希表查找,由于二叉树结构,查找元素的时间变化很小。
它不是传统的、基于引用向量的树,存储本身是一个数组,具有非常规的二次幂映射,是一棵“密集”树,最重要的是,以这种方式实现的目的是,当树被遍历和旋转,大部分时间它是访问连续的内存块,这应该比传统的二叉树少很多缓存未命中(并且由于这个原因,通常这种类型的应用程序只使用某种像桶排序一样排序)。
最佳答案
您可以将匿名字段与定义您要使用的方法集(可能会更改)的接口(interface)一起使用。
您将定义您的界面
type validator interface {
IsRightOf(a, b interface{}) bool
... // other methods
}
和你的类型:
type Bast struct {
validator // anonymous interface field
... // some fields
}
然后你可以从 Bast 类型访问验证器的方法
b := bast.New()
b.IsRightOf(c, d) // this is valid, you do not need to do b.validator.IsRightOf(...)
因为验证器是一个接口(interface),您可以按照自己的喜好更改这些方法。
关于function - 绑定(bind)到结构的 Golang 函数类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49970715/