golang中fmt.Println的实现细节

考虑这段代码


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 个问题

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

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


凤凰求蛊
浏览 180回答 1
1回答

30秒到达战场

Println确定值是否实现Stringer接口。如果是这样,它将调用String()来获取格式化的值。big.Float为指针接收器实现它,所以你必须传递一个引用。否则Println将检测到它是一个结构并使用反射打印它的所有字段Go 是开源的。您可以自己查看https://golang.org/src/fmt/print.go?#L738它使用类型开关和反射。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go