【发布时间】:2011-06-17 16:07:56
【问题描述】:
有谁知道如何用 Go 语言编写一个带有副作用的函数?
我的意思是像 C 中的 getchar 函数。
谢谢!
【问题讨论】:
-
我认为您需要更具体地了解您的目标。 Go 不是函数式语言。没有什么能阻止你编写带有副作用的函数。例如,os、fmt 和 net 包中的许多函数都有副作用。
标签: go side-effects
有谁知道如何用 Go 语言编写一个带有副作用的函数?
我的意思是像 C 中的 getchar 函数。
谢谢!
【问题讨论】:
标签: go side-effects
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
【讨论】:
在 C 中,副作用用于有效地返回多个值。
在 Go 中,返回多个值是内置在函数规范中的:
func f(a int) (int, int) {
if a > 0 {
return a, 1
}
return 0,0
}
通过返回多个值,作为函数调用的结果,你可以在函数之外影响任何你喜欢的东西。
【讨论】: