如果我想知道变量是否为字符串类型,可以执行类型断言:
1 | S, OK:= value.(string) |
如果value是字符串类型,则OK为true,S为原始值。
但是,此类型断言不适用于自定义字符串类型。 例如:
1 | type MyString string |
对于这种类型的变量,上面的类型断言为OK返回false。
如何确定变量是字符串类型还是等效类型,而对于每个此类等效类型没有单独的断言?
-
你不能。 如您所知,您可以测试"蜂鸣字符串"(例如
value.(string) ),也可以测试" being MyString` withvalue.(MyString) ",但是不能同时使用这两种方法;也可以使用类型开关。 ,尤其是有关类型开关的章节:tour.golang.org/methods/16和ff。
您不能执行类型声明或将类型切换到字符串,因为确切的类型不匹配。 您可以获得的最接近的方法是使用
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()等。
- 我看到,在这种情况下,只有反射才能解决问题