struct String() 实现导致堆栈溢出并带有 Sprintf“+”标志

2024-01-24

Golang菜鸟问题:为什么我可以not使用"%+v"String() 实现方法中结构的标志?

我有一个结构,我想在其中实现String()漂亮打印的方法。我喜欢给出的答案here https://stackoverflow.com/a/33252434,但我不喜欢打字,所以我尝试修改它以使用"%+v"结构的格式标志。来自fmt https://golang.org/pkg/fmt doc:

%v 打印结构时默认格式的值,加号标志 (%+v) 添加字段名称

如果我简单地用它来调用它,效果很好fmt.Printf("%+v", color),但如果我尝试把+标志在String()实现时,我遇到了堆栈溢出(我第一次有机会在 stackoverflow.com 上提出“堆栈溢出”问题;))

我确定我不理解这里的指针引用,或者存在一些递归。我怀疑这个菜鸟发现了我的第一个 Golang bug,所以有人可以解释一下吗?

请参阅此处的 go play 演示https://play.golang.org/p/13_qI8Iwwa https://play.golang.org/p/13_qI8Iwwa


See 软件包 fmt 文档 https://golang.org/pkg/fmt/:

除非使用动词打印%T and %p, 特殊格式 注意事项适用于实现某些接口的操作数。 按申请顺序:

  1. 如果操作数实现方法String() string,将调用该方法将对象转换为字符串,然后将其 根据动词(如果有)的要求格式化。

为了避免在以下情况下递归

type X string 
func (x X) String() string { return Sprintf("<%s>", x) }

在重复之前转换值:

func (x X) String() string { return Sprintf("<%s>", string(x)) }

自引用数据也可以触发无限递归 结构,例如包含自身作为元素的切片,如果 该类型有一个 String 方法。然而,这种病症很少见,而且 该包装不能防止它们。


Inside:

func (c Color) String() string {
    // THIS CAUSES STACK OVERFLOW
    return fmt.Sprint(c)
}

致电给

fmt.Sprint(c)

or fmt.Println(c)哪个调用func (c Color) String() string再次递归导致溢出:尝试一下围棋游乐场 https://play.golang.org/p/UKlhSlzG8T


这也很好用:https://play.golang.org/p/NYLtrxUeiA https://play.golang.org/p/NYLtrxUeiA

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

struct String() 实现导致堆栈溢出并带有 Sprintf“+”标志 的相关文章

随机推荐

  • Kubernetes 集群上的粘性会话

    目前 我正在尝试在 Google Cloud 上创建一个 Kubernetes 集群 其中包含两个负载均衡器 一个用于后端 在 Spring boot 中 另一个用于前端 在 Angular 中 其中每个服务 负载均衡器 与 2 个副本 p
  • 使用 cURL 获取 HTTP 标头并保存到变量

    我用它来获取 XML 提要和 HTTP 标头 Initiate the curl session ch curl init Set the URL curl setopt ch CURLOPT URL url Allow the heade
  • 如何将 Chrome 开发者控制台停靠在左侧?

    我知道您可以单击垂直省略号按钮 然后选择停靠在底部 右侧或分离 但有人知道如何停靠在左侧吗 目前我必须分离然后手动调整大小和调整 这很烦人 Edit 我将保留这个问题 直到有人说服谷歌添加左对接 或者有人找出黑客 发现或构建扩展以使其正常工
  • 带有 Activity 和子 Fragment 的导航抽屉

    我有一个Activity A a 列表片段 P and 2 碎片 Q and R 当应用程序启动时 A已创建 加载P 根据用户点击的内容 将其替换为Q or R 现在通过引用this https developer android com
  • 如何突出显示 Ionic 列表中的选定项目

    我在屏幕上填充了一个项目列表 只想在列表视图中突出显示所选项目 请帮助
  • 关于不阻塞 GUI 线程的 MessageBox.Show 替换的建议?

    不久前 我遇到了一种情况 我们需要向用户显示消息框以获取通知 但我们无法使用 MessageBox Show 因为它会阻塞 GUI 线程 因此当对话框处于活动状态时 屏幕上的任何内容都不会更新 关于替代方案有什么建议吗 我当时编写了一个替代
  • Linux 和 Windows 上 html 中的 javascript 导入区分大小写

    我有以下内容 测试 html test js var Test test 问题是为什么它在 Windows 上工作而在 Linux 上不起作用 换句话说 为什么 linux 对于导入区分大小写 但 window 不区分 如何在 Linux
  • SQL Server数据通过网络发送时以什么格式序列化?

    我问这个问题的原因是因为我们计划将大量 几 GB 数据从 SQL Server 数据库读取到 Net 应用程序进行处理 我想知道为每条记录计算多少空间开销 以估计对网络流量的影响 例如 一条记录由 5 个整数组成 即 4 5 20 字节数据
  • Codeigniter result_array()何时返回单维或多维数组?

    返回 query gt result array 时有时我会得到多个像这样的单个数组 Array user id gt 32 username gt johnd cat id gt 7 Array user id gt 33 usernam
  • Action Script 中的 JSON:如何获取 JSON 对象的属性和值?

    假设我有这个 JSON 并且假设属性可能会改变 srcLocation pc filename name fileext jpg url 首先我想获取它们的所有属性 srcLocation 文件名等 并使用我得到的属性我想获得相应的值 我怎
  • 如何舍入到某个浮点精度?

    我认为这是一个简单的问题 我想 a 1 154648126486416 成为 a 1 154 and not a 1 15000000000 在不使用的情况下我该如何做到这一点format bank 你可以这样做 a floor a 100
  • WPF 装饰器有什么意义?

    我最近为我的公司开发了一个绘图组件 其中包含一个画布 您可以在上面通过单击并拖动来绘制某些形状 对于每个形状 我在其 AdornerLayer 上放置了两个装饰器 一个用于增加命中检测 基本上是一个会超出形状边界几个像素的透明矩形 另一个用
  • 什么是

    我对 Vue js 完全陌生 我想我对路由器如何处理以下内容有一些了解
  • 使用 dateutil 解析器从字符串中解析日期

    我正在尝试解析字符串格式的日期 u 2015 年 6 月 11 日 12 26 小时 美国标准时间 但是当我使用 dateutil 解析器来解析时出现错误 from dateutil parser import parse parse u
  • SQL:NOLOCK 导致查询速度变慢

    向查询添加 nolock 是否有任何原因会导致执行时间增加 UPDATE TargetTable SET col1 c1 RowCnt col2 c2 RowCnt from TargetTable tt join select col3
  • 为什么在快速排序中选择随机主元

    So choosing a pivot at random has O n2 running at worst case but when the pivot is chosen as the average of min value an
  • 如何在 JPopupMenu 中获得焦点

    我是一名经验丰富的 Java 程序员 但还是一名 Swing 新手 所以请耐心等待 我希望有一个具有键盘焦点的 JPopupWindow 我想响应箭头键 Escape 关闭菜单 和 Enter 调用该项目 我是否必须在菜单中添加一个 Key
  • 如何使用 MS Ole DB 提供程序在两个 FoxPro 数据库之间创建联接?

    问题 我正在使用现有的商业 MS Visual Foxpro 应用程序 并且需要使用 C 应用程序直接从数据库中提取数据 不幸的是 并非所有表都存储在同一个数据库中 一些记录存储在按年份细分的数据库中 如何使用单个联接创建针对这两个数据库的
  • 这是检测反应组件中第一次渲染的正确方法

    我有一个场景 我需要检测组件的第一次渲染 我在这里构建了一个小例子 有人可以向我解释什么是正确的方法吗 为什么大多数人建议使用ref而不是一个简单的状态 https codesandbox io s condescending burnel
  • struct String() 实现导致堆栈溢出并带有 Sprintf“+”标志

    Golang菜鸟问题 为什么我可以not使用 v String 实现方法中结构的标志 我有一个结构 我想在其中实现String 漂亮打印的方法 我喜欢给出的答案here https stackoverflow com a 33252434