当前位置: 首页 > 面试题库 >

Gomt中fmt.Println的实现细节

何涵育
2023-03-14
问题内容

考虑这段代码

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参考 (使用&),以得到正确的答案,否则我们会回来的对象

  2. PrintlnGo 如何运作?我的意思是它如何知道应将哪种格式应用于不同类型?


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


 类似资料:
  • 实现细节 以 OpenvSwitch plugin 为例,主要在 neutron\plugins\openvswitch\agent\ovs_dvr_neutron_agent.py 文件中。 OVSDVRNeutronAgent 类是本地处理的 agent,启动后会在三个网桥上添加初始化的规则,主要过程如下。 def setup_dvr_flows(self): self.setup_dv

  • 实现细节 防火墙由 L3 Agent 通过修改 iptables 规则来实现,具体规则在网络节点的路由器命名空间中,作用到该租户所有路由器的 qr-xxx 接口上。 在网络节点上查看其中的 iptables 规则,会发现多了两个 iptables 链,分别处理进出两个方向的流量,被 neutron-vpn-agen-FORWARD 引用。 $ sudo ip netns exec qrouter-

  • 实现细节 跟大部分的高级服务一样,LBaaS 在网络节点上实现。 qlbaas 命名空间 在启动了 LBaaS 之后,网络节点上会多一个 qlbaas-xxx 命名空间,其中一个 tap 类型端口,绑定了我们定义的 VIP。 $ sudo ip netns exec qlbaas-574a31da-a28a-449f-8c9d-3d3687c3c02a ip addr1: lo: <LOOPBAC

  • 初始化过程细节 解析服务 基于 dubbo.jar 内的 META-INF/spring.handlers 配置,Spring 在遇到 dubbo 名称空间时,会回调 DubboNamespaceHandler。 所有 dubbo 的标签,都统一用 DubboBeanDefinitionParser 进行解析,基于一对一属性映射,将 XML 标签解析为 Bean 对象。 在 ServiceConf

  • 接下来还是阅读 IOStream 这一块。看到这名字,我就想到了 C++ 的 iostream,也许 facebook 有意为之?对于 IOStream,整体的认识就是,它负责IO读写,顺便回调。 先认识一个工具函数:_merge_prefix。它的作用是将双端队列(deque)的首项调整为指定大小,如果明白双端队列的popleft和appendleft方法,这个函数还是很容易看懂的,我略过对它的

  • 问题内容: 如下图所示,无论是和给围棋相同的输出: 但是:它们彼此之间有何不同? 片段1,使用包装; 片段2,不带包装; 问题答案: 是内置函数(在运行时中),当程序包位于标准库中时,该函数可能会最终删除,该函数将保留下来。请参阅有关该主题的规范。 对于语言开发人员来说,没有依赖关系是很方便的,但是方法是使用软件包或类似的东西(例如)。 如您在实现中所看到的,这些功能并非旨在远程支持其他输出模式,