fmt.Println在golang中的实现细节
Implementation details of fmt.Println in golang
考虑这段代码
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
}
我有 2 个问题
为什么我必须将 bigSum
作为 reference 传递(通过使用 &
)才能得到正确答案,否则我们'会取回一个对象吗?
Println
在 Go 中如何工作?我的意思是它怎么知道它应该适用于不同类型的格式?
Println
判断该值是否实现了Stringer
接口。如果是,那么它将调用 String()
来获取格式化值。 big.Float
为指针接收器实现它,所以你必须传递一个引用。否则 Println
将检测到它是一个结构并使用反射 打印它的所有字段
- Go 是开源的。你可以自己看看https://golang.org/src/fmt/print.go?#L738它使用类型开关和反射。
考虑这段代码
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
}
我有 2 个问题
为什么我必须将
bigSum
作为 reference 传递(通过使用&
)才能得到正确答案,否则我们'会取回一个对象吗?Println
在 Go 中如何工作?我的意思是它怎么知道它应该适用于不同类型的格式?
Println
判断该值是否实现了Stringer
接口。如果是,那么它将调用String()
来获取格式化值。big.Float
为指针接收器实现它,所以你必须传递一个引用。否则Println
将检测到它是一个结构并使用反射 打印它的所有字段
- Go 是开源的。你可以自己看看https://golang.org/src/fmt/print.go?#L738它使用类型开关和反射。