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

时间:2016-05-03 14:53:36

标签: go floating-accuracy

拥有此代码

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
 }

我有两个问题

  1. 为什么我必须将bigSum作为参考(使用&)来获取正确的答案,否则我们会找回一个对象?< / p>

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

1 个答案:

答案 0 :(得分:8)

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