【问题标题】:How do I do a Go/Golang type assertion for "type MyString string"?如何为“type MyString string”做一个 Go/Golang 类型断言?
【发布时间】:2016-12-16 15:31:07
【问题描述】:

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

S, OK:= value.(string)

如果 value 是 string 类型,则 OK 为真,S 为原始值。

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

type MyString string

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

如何确定一个变量是字符串类型还是等价类型,而无需为每个等价类型单独断言?

【问题讨论】:

  • 你不能。如您所知,您可以测试“beeing string”,如 value.(string),或者您可以使用 value.(MyString) 测试“being MyString”,但您不能同时测试两者。或者您使用类型开关。再次完成 Tour of Go ,尤其是关于类型开关的章节:tour.golang.org/methods/16 和 ff。

标签: go


【解决方案1】:

您不能对字符串执行类型断言或类型切换,因为确切类型不匹配。您可以获得的最接近的是使用reflect 包并检查值的Kind

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

【讨论】:

  • 代替最后一行(“S = ref.String()”),我可以简单地说“S = value”吗?
  • @MartinDelVecchio:不,因为S的类型与value的类型不同。
  • 好的。我的目标是避免调用 value.String() 或其等价物,因为它已经是一个字符串。如何将 MyString 类型的变量转换为字符串类型的变量? “字符串(值)”能做到吗?
  • @TimCooper 感谢您的回答。您能解释一下为什么在检查确切类型时类型切换不准确吗?
  • @nexus66: Type assertions "x.(T) 断言 x 的动态类型与类型 T相同"
【解决方案2】:

为什么要使用断言,它是用于接口的。尝试转换:

type MyString string

var s MyString = "test"
var t string

t = string(s)

【讨论】:

  • 是一个接口;我有一个接受任意值的函数(参数值是 interface{} 类型),我想返回一个字符串。对于实际的字符串变量和等效类型的变量(例如 MyString),我希望尽可能高效地返回原始值。对于其他(int、struct 等),我将不得不使用 String() 方法或 fmt.Sprintf() 等。
  • 我明白了,这种情况下只有反射才能解决问题
猜你喜欢
  • 1970-01-01
  • 2014-01-12
  • 2014-01-22
  • 2019-01-01
  • 2019-11-03
  • 1970-01-01
  • 1970-01-01
  • 2015-03-10
  • 2014-01-08
相关资源
最近更新 更多