【发布时间】:2019-10-31 02:07:38
【问题描述】:
我有一个非常简单的代码:
package chain_of_responsibility
import (
"fmt"
"reflect"
)
type CustomerBalanceRequest struct{
CustomerName string
Balance int
}
type BalanceRequest interface {
Handle(request CustomerBalanceRequest)
}
type HeadEditor struct{
Next BalanceRequest
}
func (h *HeadEditor) Handle(b CustomerBalanceRequest){
if b.Balance < 1000 {
fmt.Printf("%T approved balance for %v request. Balance: %v\n", h, b.CustomerName, b.Balance)
fmt.Printf("%v approved balance for %v request. Balance: %v\n", reflect.TypeOf(h), b.CustomerName, b.Balance)
fmt.Printf("%v approved balance for %v request. Balance: %v\n", reflect.TypeOf(h).String(), b.CustomerName, b.Balance)
fmt.Printf("%v approved balance for %v request. Balance: %v\n", reflect.TypeOf(h).Name(), b.CustomerName, b.Balance)
} else{
h.Next.Handle(b)
}
}
在 fmt.Printf 行上,我想打印 HeadEditor 类型的名称。我使用各种方法来获得它,这就是我的结果:
*chain_of_responsibility.HeadEditor approved balance for John request. Balance: 500
*chain_of_responsibility.HeadEditor approved balance for John request. Balance: 500
*chain_of_responsibility.HeadEditor approved balance for John request. Balance: 500
approved balance for John request. Balance: 500
问题出在前 3 次 Printf 调用中,我可以获得类型的名称,但它们包括指针和包名称。有没有什么方法可以让我只得到没有包名和指针的“HeadEditor”,当然除了字符串处理解决方案,比如从结果中删除 * 和包名。
【问题讨论】:
-
你考虑过实现Stringer接口吗?
-
你能解释更多吗?我提到寻找字符串处理以外的解决方案。我在问 Go 是否有内置的非字符串处理方式。
-
实现stringer接口并不比使用fmt更多的字符串处理。您要做的是让 HeadEditor 实现
String() string方法,该方法可以简单地返回所需的文本,然后在与%s动词一起使用时由 fmt 自动调用此方法(不确定%v动词)。跨度> -
似乎也可以与 %v 一起使用 play.golang.org/p/rERpIuKJVEy
标签: go