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

1
S, OK:= value.(string)

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

但是,此类型断言不适用于自定义字符串类型。 例如:

1
type MyString string

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

如何确定变量是字符串类型还是等效类型,而对于每个此类等效类型没有单独的断言?

  • 你不能。 如您所知,您可以测试"蜂鸣字符串"(例如value.(string)),也可以测试" being MyString` with value.(MyString)",但是不能同时使用这两种方法;也可以使用类型开关。 ,尤其是有关类型开关的章节:tour.golang.org/methods/16和ff。

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

1
2
3
4
5
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类型的变量转换为string类型的变量?"字符串(值)"可以吗?
  • @TimCooper感谢您的回答。您能解释一下为什么类型开关不能准确地检查确切的类型吗?
  • @ nexus66:类型断言" x。(T)断言x的动态类型与类型T相同"
  • 谢谢你的评论。

为什么使用断言,它用于接口。 尝试像这样进行转换:

1
2
3
4
5
6
type MyString string

var s MyString ="test"
var t string

t = string(s)
  • 它是一个接口;我有一个接受任意值的函数(参数值的类型为interface {}),并且我想返回一个字符串。对于实际的字符串变量以及等效类型的变量(例如MyString),我想尽可能有效地返回原始值。对于其他(int,struct等),我将不得不使用String()方法或fmt.Sprintf()等。
  • 我看到,在这种情况下,只有反射才能解决问题