什么时候应该返回值而不是修改接收器指针?

时间:2018-01-28 18:09:58

标签: go

我有一个struct ProofOfWork 的方法,它应该修改结构成员 Nonce Hash 。所以我想知道它是否应该在方法运行中修改给定实例的这两个成员,或者应该将这两个变量作为返回。

所以这是方法运行并带有返回变量:

// Run performs a proof-of-work
func (pow *ProofOfWork) Run() (int, []byte) {
    var hashInt big.Int
    var hash [32]byte
    nonce := 0

    fmt.Printf("Mining the block containing \"%s\"\n", pow.block.Data)
    for nonce < maxNonce {
        data := pow.prepareData(nonce)

        hash = sha256.Sum256(data)
        fmt.Printf("\r%x", hash)
        hashInt.SetBytes(hash[:])

        if hashInt.Cmp(pow.target) == -1 {
            break
        } else {
            nonce++
        }
    }
    fmt.Print("\n\n")

    return nonce, hash[:]
}

然后是没有任何返回变量的版本:

func (pow *ProofOfWork) Run() {
    var hashInt big.Int
    var hash [32]byte // the type of hash value is defined by result of the sha256 function
    nonce := 0

    for nonce < MaxNonce {
        data := pow.prepareData(nonce)
        hash := sha256.Sum256(data)
        hashInt.SetBytes(hash[:])
        if hashInt.Cmp(pow.target) == -1 {
            // the nonce found
            break
        } else {
            nonce++
        }
    }
    pow.block.Hash = hash[:]
    pow.block.Nonce = nonce
}

1 个答案:

答案 0 :(得分:0)

您展示的两个选项有时可能会有用。我可以提出另一种可能性。在Go中,我们应该更频繁地使用函数,然后使用其他语言。普通函数可能正是您所需要的:

// Run performs a proof-of-work
func Run(pow *ProofOfWork) (int, []byte) {
    var hashInt big.Int
    var hash [32]byte
    nonce := 0

    fmt.Printf("Mining the block containing \"%s\"\n", pow.block.Data)
    for nonce < maxNonce {
        data := pow.prepareData(nonce)

        hash = sha256.Sum256(data)
        fmt.Printf("\r%x", hash)
        hashInt.SetBytes(hash[:])

        if hashInt.Cmp(pow.target) == -1 {
            break
        } else {
            nonce++
        }
    }
    fmt.Print("\n\n")

    return nonce, hash[:]
}

我可能会将ProofOfWork作为一个界面,并以这种方式抽象运行。