为什么这段代码运行后进程会死掉?

KunGo · 2013-10-07 12:39:14 · 4001 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2013-10-07 12:39:14 的主题,其中的信息可能已经有所发展或是发生改变。

package main

import "fmt"

const (
    WHITE = iota
    BLACK
    BLUE
    RED
    YELLOW
)

type Color byte

func (c Color) String() string {
    fmt.Println(c)
    return "Ok"
}

func main() {
    var c Color
    c = WHITE
    c.String()
}

上面的代码运行会死掉.

如果把method的String改成其它名字,例如Stringt则可以正常执行,或者去掉返回值,或者返回值类型改为其他类型就可以正常执行.

求指教~


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

4001 次点击  
加入收藏 微博
4 回复  |  直到 2013-10-08 05:24:30
yufeng
yufeng · #1 · 12年之前

String()这个函数里面不能有Println等类似的输出,具体可以去了解String()这个函数实现的是什么接口

polaris
polaris · #2 · 12年之前
yufengyufeng #1 回复

String()这个函数里面不能有Println等类似的输出,具体可以去了解String()这个函数实现的是什么接口

正解。

另外,标准库中有说明:

fmt — 格式化IO

为避免以下这类递归的情况:

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

需要在递归前转换该值:

func (x X) String() string { return Sprintf("<%s>", string(x)) }
KunGo
KunGo · #3 · 12年之前
yufengyufeng #1 回复

String()这个函数里面不能有Println等类似的输出,具体可以去了解String()这个函数实现的是什么接口

嗯,String()实现了Stringer这个接口,所以会产生无限递归导致程序错误

KunGo
KunGo · #4 · 12年之前
polarispolaris #2 回复

#1楼 @yufeng 正解。 另外,标准库中有说明: [fmt — 格式化IO](https://github.com/polaris1119/The-Golang-Standard-Library-by-Example/blob/master/chapter01/01.3.md): 为避免以下这类递归的情况: type X string func (x X) String() string { return Sprintf("<%s>", x) } 需要在递归前转换该值: func (x X) String() string { return Sprintf("<%s>", string(x)) }

在递归发生前,强制转换类型确实可以防止递归,谢谢

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传