`fmt.Println`如何在Go中工作?

mar*_*ryj 3 floating-accuracy go

有这个代码

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
 }
Run Code Online (Sandbox Code Playgroud)

我有两个问题

  1. 为什么我必须bigSum作为参考传递(通过使用&)来获得正确的答案,否则我们将找回一个对象?

  2. Println在Go工作怎么样?我的意思是它如何知道它应该适用于不同类型的格式?

cre*_*ker 9

  1. Println确定该值是否实现Stringer接口.如果是,那么它将调用String()to get格式化值.big.Float为指针接收器实现它,所以你必须传递一个引用.否则Println将检测到它是一个结构并使用反射打印所有字段
  2. Go是开源的.你可以自己看看https://golang.org/src/fmt/print.go?#L738它使用类型开关和反射.