【问题标题】:Side Effects in Go LanguageGo 语言的副作用
【发布时间】:2011-06-17 16:07:56
【问题描述】:

有谁知道如何用 Go 语言编写一个带有副作用的函数? 我的意思是像 C 中的 getchar 函数。

谢谢!

【问题讨论】:

  • 我认为您需要更具体地了解您的目标。 Go 不是函数式语言。没有什么能阻止你编写带有副作用的函数。例如,os、fmt 和 net 包中的许多函数都有副作用。

标签: go side-effects


【解决方案1】:

ReadByte 函数修改缓冲区的状态。

package main

import "fmt"

type Buffer struct {
    b []byte
}

func NewBuffer(b []byte) *Buffer {
    return &Buffer{b}
}

func (buf *Buffer) ReadByte() (b byte, eof bool) {
    if len(buf.b) <= 0 {
        return 0, true
    }
    b = buf.b[0]
    buf.b = buf.b[1:]
    return b, false
}

func main() {
    buf := NewBuffer([]byte{1, 2, 3, 4, 5})
    for b, eof := buf.ReadByte(); !eof; b, eof = buf.ReadByte() {
        fmt.Print(b)
    }
    fmt.Println()
}

Output: 12345

【讨论】:

    【解决方案2】:

    在 C 中,副作用用于有效地返回多个值。

    在 Go 中,返回多个值是内置在函数规范中的:

    func f(a int) (int, int) {
        if a > 0 {
            return a, 1
        }
        return 0,0
    }
    

    通过返回多个值,作为函数调用的结果,你可以在函数之外影响任何你喜欢的东西。

    【讨论】:

      猜你喜欢
      • 2023-03-24
      • 2021-01-13
      • 2020-08-23
      • 2023-01-27
      • 1970-01-01
      • 1970-01-01
      • 2018-11-24
      • 2012-08-31
      • 1970-01-01
      相关资源
      最近更新 更多