我正在解决一个编码问题,要求检查给定数组是否包含给定字符串的所有旋转,我最初想出了这个解决方案:
type myArr []string
func ContainAllRots(strng string, arr []string) bool {
if strng == "" {
return true
}
arr = myArr(arr)
for i := 0; i < len(strng); i++ {
if !arr.Contains(strng[i:] + strng[:i]) {
return false
}
}
return true
}
func (a myArr) Contains(strng string) bool {
for _,s := range a {
if s == strng {
return true
}
}
return false
}
请忽略这样一个事实,即这可能不是给定问题的最佳/最有效的解决方案,但是是的,所以我收到了以下错误消息:
arr.Contains undefined (type []string has no field or method Contains)
我想用
arr = myArr(arr)
行我将更改 arr
的类型因此可以调用Contains
方法,但我猜这个逻辑不起作用。谁能告诉我这里发生了什么以及为什么我没有将我的新自定义类型分配回 arr
?
最佳答案
问题”
在大多数情况下,Go 是一种具有静态类型系统(或“具有静态类型”)的语言。
除此之外,这意味着程序中的任何变量都具有声明变量的隐式类型。
换句话说,变量的类型并没有以某种方式存储在其中,因此不能通过为其分配另一个类型的值来更改。
因此,如果你有
type myArr []string
func foo(arr []string) {
arr = myArr(arr)
}
赋值是非法的,否则将意味着更改变量的类型
arr
至myArr
.你能做些什么呢?
在这种情况下使用的方法是简单地使用另一个合适类型的变量。
这看起来像是在浪费资源,但
为了完整起见,我们应该提到 Go 有特殊的方法,它允许程序员实际拥有可以在运行时更改其类型的变量;这些方法由接口(interface)提供。
例如,下面代码中的两个赋值都是完全合法的:
type I interface {
Foo()
}
type A struct{}
func (a A) Foo() {}
type B struct{}
func (b B) Foo() {}
var v I
v = A{}
v = B{}
变量
v
类型为 I
这是一个接口(interface)类型,因此它应该包含接口(interface)值。这两个赋值都改变了变量
v
的所谓动态类型。 ——致A
然后到 B
, 而它的静态类型仍然是 I
.我会注意到,在您的特定情况下,不需要使用接口(interface),但这是需要学习的东西。
关于go - 类型更改未按预期运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60996314/