考虑这段代码
import (
"fmt"
"math/big"
)
func main() {
var b1,b2,b3,bigSum big.Float
b1.SetFloat64(25.3)
b2.SetFloat64(76.2)
b1.SetFloat64(53.1)
bigSum.Add(&b1, &b2).Add(&b3, &bigSum)
fmt.Println(bigSum) // {53 0 0 1 false [9317046909104082944] 8}
fmt.Println(&bigSum) // 129.3
}
我有两个问题
为什么我必须将
bigSum
作为 reference 传递(通过使用&
)以获得正确答案,否则我们将取回对象?Println
在 Go 中如何工作?我的意思是它怎么知道它应该为不同的类型应用哪种格式?
最佳答案
Println
判断值是否实现了Stringer
接口(interface)。如果是,那么它将调用String()
来获取格式化值。big.Float
为指针接收器实现它,因此您必须传递一个引用。否则Println
将检测到它是一个结构并使用反射打印它的所有字段- Go 是开源的。大家可以自己看看https://golang.org/src/fmt/print.go?#L738它使用类型开关和反射。
关于go - golang中fmt.Println的实现细节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37007494/