如何对“type MyString string”进行Go/Golang类型断言?

3

如果我想知道一个变量是否为字符串类型,我可以进行类型断言:

S, OK:= value.(string)

如果value的类型是字符串,则OK为真,S是原始值。

但是这种类型断言无法适用于自定义字符串类型,例如:

type MyString string

对于这种类型的变量,上面的类型断言对于OK返回false。

如何确定变量是字符串类型还是等效类型,而无需针对每个等效类型进行单独断言?


1
你不能同时测试一个值是否为字符串和是否为MyString类型。你可以使用value.(string)来测试是否为字符串,或者使用value.(MyString)来测试是否为MyString类型,但是不能同时进行两种测试。你需要使用类型切换。请再次仔细阅读Go之旅的教程,特别是关于类型切换的章节:https://tour.golang.org/methods/16等。 - Volker
2个回答

5

您无法执行类型断言或类型切换到字符串,因为确切类型不匹配。最接近的方法是使用reflect包并检查值的Kind

var S string
ref := reflect.ValueOf(value)
if ref.Kind() == reflect.String {
    S = ref.String()
}

在最后一行(“S = ref.String()”)的位置,我能否简单地说“S = value”? - Martin Del Vecchio
@MartinDelVecchio:不行,因为S的类型与value的类型不同。 - user142162
好的。我的目标是避免调用value.String()或其等效项,因为它已经是一个字符串了。我如何将类型为MyString的变量转换为类型为string的变量?"string(value)"可以吗? - Martin Del Vecchio
@TimCooper 感谢您的回答。您能解释一下为什么类型开关在检查确切类型时不准确吗? - Chiheb Nexus
1
@nexus66: 类型断言 "x.(T) 断言 x 的动态类型与类型 T 完全相同" - user142162
感谢您的评论。 - Chiheb Nexus

0

为什么要使用断言?它是为接口设计的。尝试进行转换,例如:

type MyString string

var s MyString = "test"
var t string

t = string(s)

这是一个接口;我有一个函数,它接受任意值(参数值的类型为interface{}),并且我想返回一个字符串。对于实际的字符串变量和等效类型的变量(例如MyString),我希望尽可能高效地返回原始值。对于其他类型(int、struct等),我将不得不使用String()方法或fmt.Sprintf()等方法。 - Martin Del Vecchio
我明白了,在这种情况下只有反射可以解决问题。 - Stas Zholudev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接