Golang中如何追加函数到结构体
Golang中如何追加函数到结构体
我有一个函数,其结构为 .signature,用于向转账添加签名。如果只有一个签名,我只使用一次;如果有三个签名,如下例所示,我会使用三次:
signatures := transfer.signature(a[0], b[0]).signature(a[1], b[1]).signature(a[2], b[2])
我想创建类似这样的东西:
var n int
for {
signatures := transfer.signature(a[n], b[n]). // 每次循环后追加一个签名
n++
if n == number_of_signatures{
break
}
}
目的是为了避免为不同数量的签名编写不同的 signatures 代码。有人能帮助我吗?
更多关于Golang中如何追加函数到结构体的实战教程也可以访问 https://www.itying.com/category-94-b0.html
3 回复
答案:
只需删除这两个点。
var n int
for {
signatures = transfer.signature(a[n], b[n]). // 每次循环后追加一个签名
n++
if n == number_of_signatures{
break
}
}
更多关于Golang中如何追加函数到结构体的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
var signatures XXXX
for i:=0;i<number_of_signatures;i++ {
signatures += transfer.signature(a[i], b[i])
}
或者
signatures := transfer.sign(a, b)
func (t *transfer) sign(a,b) XXXX{
var signature XXXX
for i := range a {
signature += t.signature(a[i], b[i])
}
return signature
}
?
在Go中可以通过方法链(method chaining)的方式实现你需要的功能,但需要让signature方法返回结构体本身。这里是一个完整的示例:
package main
import "fmt"
// 定义转账结构体
type Transfer struct {
signatures []string
}
// signature方法添加签名并返回Transfer指针以实现链式调用
func (t *Transfer) signature(a, b string) *Transfer {
sig := fmt.Sprintf("sig(%s,%s)", a, b)
t.signatures = append(t.signatures, sig)
return t
}
// 获取所有签名
func (t *Transfer) getSignatures() []string {
return t.signatures
}
func main() {
// 示例数据
a := []string{"a0", "a1", "a2"}
b := []string{"b0", "b1", "b2"}
number_of_signatures := 3
// 创建Transfer实例
transfer := &Transfer{}
// 循环添加签名
for n := 0; n < number_of_signatures; n++ {
transfer = transfer.signature(a[n], b[n])
}
// 获取所有签名
signatures := transfer.getSignatures()
fmt.Println(signatures) // 输出: [sig(a0,b0) sig(a1,b1) sig(a2,b2)]
// 也可以直接链式调用
transfer2 := &Transfer{}
transfer2.signature("x", "y").signature("p", "q")
fmt.Println(transfer2.getSignatures()) // 输出: [sig(x,y) sig(p,q)]
}
如果你希望保持原始结构体不变,可以使用值接收器:
func (t Transfer) signature(a, b string) Transfer {
sig := fmt.Sprintf("sig(%s,%s)", a, b)
t.signatures = append(t.signatures, sig)
return t
}
func main() {
transfer := Transfer{}
a := []string{"a0", "a1", "a2"}
b := []string{"b0", "b1", "b2"}
for n := 0; n < 3; n++ {
transfer = transfer.signature(a[n], b[n])
}
fmt.Println(transfer.signatures)
}
这种方法允许你在循环中连续调用signature方法,每次调用都会追加签名并返回结构体,从而支持链式操作。

