gpt4 book ai didi

go - 接口(interface)引用显示奇怪的输出

转载 作者:IT王子 更新时间:2023-10-29 02:27:57 26 4
gpt4 key购买 nike

我试图理解 Go 的接口(interface)概念并创建以下代码:

package main

import "fmt"

type Failer interface {
Error() string
}

type Succer interface {
Success() string
}

type Result interface {
Failer
Succer
}

type Fail struct{}

func (*Fail) Error() string {
return "Error"
}

type Succ struct{}

func (*Succ) Success() string {
return "Success"
}

type Combi struct{}

func (*Combi) Error() string {
return "Error"
}

func (*Combi) Success() string {
return "Success"
}

func main() {

var r Result
var s Succer

c := &Combi{}
r = c
s = c
fmt.Println(r.Error())
fmt.Println(s)
}

作为输出我得到了

Error 
Error

为什么?我期望输出错误和成功,因为 s 它是 Succer 类型的接口(interface),没有错误返回为字符串。当我像这样更改主要功能时:

func main() {

var r Result
var s Succer

c := &Combi{}
r = c
s = c

}

编译器提示

# command-line-arguments
.\sample1.go:42: r declared and not used
.\sample1.go:43: s declared and not used

为什么?我为变量 rs 分配了一个引用。

最佳答案

fmt.Println(s) 打印“Error”,因为 errorfmt 包中是特例

        switch v := p.arg.(type) {
case error:
handled = true
defer p.catchPanic(p.arg, verb)
p.printArg(v.Error(), verb, depth)
return

case Stringer:
handled = true
defer p.catchPanic(p.arg, verb)
p.printArg(v.String(), verb, depth)
return
}
}

fmt 包首先检查对象是否是 FormatterGoStringererrorStringer ,按此顺序获取要打印的值。

至于你的最后一个问题,你必须使用一个变量,而不仅仅是分配它。打印它们可以消除错误。

关于go - 接口(interface)引用显示奇怪的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29103107/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com