From 614433cb754669df91f8c62e47159d4ddd14c771 Mon Sep 17 00:00:00 2001 From: Ayke van Laethem Date: Thu, 8 Aug 2019 13:05:17 +0200 Subject: [PATCH] reflect: implement Type.AssignableTo --- src/reflect/type.go | 12 ++++++++++++ src/reflect/value.go | 8 ++------ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/reflect/type.go b/src/reflect/type.go index 68160c33..9e5b752e 100644 --- a/src/reflect/type.go +++ b/src/reflect/type.go @@ -216,6 +216,18 @@ func (t Type) Size() uintptr { } } +// AssignableTo returns whether a value of type u can be assigned to a variable +// of type t. +func (t Type) AssignableTo(u Type) bool { + if t == u { + return true + } + if t.Kind() == Interface { + panic("reflect: unimplemented: assigning to interface of different type") + } + return false +} + type StructField struct { Name string Type Type diff --git a/src/reflect/value.go b/src/reflect/value.go index 577a944b..950e358b 100644 --- a/src/reflect/value.go +++ b/src/reflect/value.go @@ -388,12 +388,8 @@ func (v Value) Set(x Value) { if !v.indirect { panic("reflect: value is not addressable") } - if v.Type() != x.Type() { - if v.Kind() == Interface { - panic("reflect: unimplemented: assigning to interface of different type") - } else { - panic("reflect: cannot assign") - } + if !v.Type().AssignableTo(x.Type()) { + panic("reflect: cannot set") } size := v.Type().Size() xptr := x.value