Метод reflect.Type.AssignableTo
Метод AssignableTo проверяет, можно ли присвоить значение
типа, представленного текущим объектом reflect.Type,
переменной целевого типа. В первый параметр мы передаем
целевой тип, во второй - ничего не передаем, так как метод
вызывается на исходном типе. Метод возвращает true,
если присваивание допустимо, и false в противном случае.
Синтаксис
t1.AssignableTo(t2)
Пример
Давайте проверим, можно ли присвоить значение типа int
переменной типа int:
package main
import (
"fmt"
"reflect"
)
func main() {
var x int
var y int
t1 := reflect.TypeOf(x)
t2 := reflect.TypeOf(y)
res := t1.AssignableTo(t2)
fmt.Println(res)
}
Результат выполнения кода:
true
Пример
Давайте проверим, можно ли присвоить значение типа int
переменной типа string:
package main
import (
"fmt"
"reflect"
)
func main() {
var x int
var y string
t1 := reflect.TypeOf(x)
t2 := reflect.TypeOf(y)
res := t1.AssignableTo(t2)
fmt.Println(res)
}
Результат выполнения кода:
false
Пример
Давайте проверим, можно ли присвоить значение пользовательского типа переменной базового типа:
package main
import (
"fmt"
"reflect"
)
type MyInt int
func main() {
var x MyInt
var y int
t1 := reflect.TypeOf(x)
t2 := reflect.TypeOf(y)
res := t1.AssignableTo(t2)
fmt.Println(res)
}
Результат выполнения кода:
false
Пример
Давайте проверим, можно ли присвоить значение интерфейсного типа переменной конкретного типа:
package main
import (
"fmt"
"reflect"
)
type MyInterface interface {
Method()
}
type MyStruct struct{}
func (m MyStruct) Method() {}
func main() {
var x MyStruct
var y MyInterface
t1 := reflect.TypeOf(x)
t2 := reflect.TypeOf(y)
res := t1.AssignableTo(t2)
fmt.Println(res)
}
Результат выполнения кода:
true
Смотрите также
-
метод
reflect.Type.ConvertibleTo,
который проверяет возможность преобразования типов -
метод
reflect.Type.Implements,
который проверяет реализацию интерфейса -
метод
reflect.Type.Kind,
который возвращает категорию типа -
функцию
reflect.TypeOf,
которая возвращает тип значения