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方法,每次调用都会追加签名并返回结构体,从而支持链式操作。

回到顶部