«Проблема»
Go - это, по большей части, язык с системой типов stati c (или «с типизацией stati c»).
Среди прочих В сущности, это означает, что любая переменная в программе имеет тип неявный , с которым была объявлена переменная .
То есть, другими словами, тип переменной не сохраняется каким-либо образом in it, и, следовательно, не может быть изменено путем присвоения ему значения другого типа.
Следовательно, если у вас есть
type myArr []string
func foo(arr []string) {
arr = myArr(arr)
}
Назначение недопустимо, так как в противном случае это будет означать изменение типа переменной arr
на myArr
.
Что вы можете с этим поделать?
Подход, используемый в этом случае, заключается в простом использовании другой переменной подходящий тип.
Это может выглядеть как растрата ресурсов, но
- Такая трата незначительна, и в любом случае не оптимизируйте, что не является медленным.
- переназначение, которое вы пытались сделать, может выглядеть аккуратно, но в то же время Читатель: поскольку одна и та же переменная будет иметь различные наборы методов до и после присваивания.
Для полноты следует отметить, что Go имеет специальные средства, которые позволяют программисту фактически иметь переменные, которые может изменить свой тип во время выполнения; эти средства обеспечиваются интерфейсами.
Например, оба назначения в приведенном ниже коде совершенно законны:
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
, который является типом интерфейса, и поэтому он должен содержать значения интерфейса.
Оба назначения изменяют так называемый dynamici c тип переменной v
- до A
, а затем до B
соответственно, в то время как его тип stati c остается I
.
Я бы отметил, что в вашем конкретном случае использование интерфейсов не требуется, но это что-то узнать о.