From 204659bdcd71e7601f077c246a97176a3e88075f Mon Sep 17 00:00:00 2001 From: Ayke van Laethem Date: Thu, 18 Jan 2024 20:10:28 +0100 Subject: [PATCH] reflect: add TypeFor[T] This function was added in Go 1.22. See: https://github.com/golang/go/commit/42d2dfb4305aecb3a6e5494db6b8f6e48a09b420 --- src/reflect/type.go | 6 ++++++ src/reflect/type_test.go | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 src/reflect/type_test.go diff --git a/src/reflect/type.go b/src/reflect/type.go index bc45a41e..56d4767f 100644 --- a/src/reflect/type.go +++ b/src/reflect/type.go @@ -1313,3 +1313,9 @@ func uvarint32(buf []byte) (uint32, int) { } return 0, 0 } + +// TypeFor returns the [Type] that represents the type argument T. +func TypeFor[T any]() Type { + // This function was copied from the Go 1.22 source tree. + return TypeOf((*T)(nil)).Elem() +} diff --git a/src/reflect/type_test.go b/src/reflect/type_test.go new file mode 100644 index 00000000..75784f96 --- /dev/null +++ b/src/reflect/type_test.go @@ -0,0 +1,35 @@ +// Copyright 2023 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package reflect_test + +import ( + "reflect" + "testing" +) + +func TestTypeFor(t *testing.T) { + type ( + mystring string + myiface interface{} + ) + + testcases := []struct { + wantFrom any + got reflect.Type + }{ + {new(int), reflect.TypeFor[int]()}, + {new(int64), reflect.TypeFor[int64]()}, + {new(string), reflect.TypeFor[string]()}, + {new(mystring), reflect.TypeFor[mystring]()}, + {new(any), reflect.TypeFor[any]()}, + {new(myiface), reflect.TypeFor[myiface]()}, + } + for _, tc := range testcases { + want := reflect.ValueOf(tc.wantFrom).Elem().Type() + if want != tc.got { + t.Errorf("unexpected reflect.Type: got %v; want %v", tc.got, want) + } + } +}