From 61672c99a0640ef6392336fb6ba5fac668f22511 Mon Sep 17 00:00:00 2001 From: Carl Johnson Date: Wed, 26 Jul 2023 16:22:42 -0400 Subject: [PATCH 1/2] reflect: add TypeFor --- api/next/60088.txt | 1 + src/reflect/type.go | 5 +++++ src/reflect/type_test.go | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+) create mode 100644 api/next/60088.txt create mode 100644 src/reflect/type_test.go diff --git a/api/next/60088.txt b/api/next/60088.txt new file mode 100644 index 00000000000000..9a83842faf89c5 --- /dev/null +++ b/api/next/60088.txt @@ -0,0 +1 @@ +pkg reflect, func TypeFor[$0 interface{}]() Type diff --git a/src/reflect/type.go b/src/reflect/type.go index 9fd242e732787e..df0d083c6f26f3 100644 --- a/src/reflect/type.go +++ b/src/reflect/type.go @@ -2909,3 +2909,8 @@ func addTypeBits(bv *bitVector, offset uintptr, t *abi.Type) { } } } + +// TypeFor returns the reflection Type that represents the static type of T. +func TypeFor[T any]() Type { + return TypeOf((*T)(nil)).Elem() +} diff --git a/src/reflect/type_test.go b/src/reflect/type_test.go new file mode 100644 index 00000000000000..b47a363449a464 --- /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: want %v; got %v", want, tc.got) + } + } +} From becd714c4562da4a3280c3a56ebaf246e48e9f37 Mon Sep 17 00:00:00 2001 From: Carl Johnson Date: Wed, 26 Jul 2023 21:18:31 -0400 Subject: [PATCH 2/2] feedback --- api/next/60088.txt | 2 +- src/reflect/type.go | 2 +- src/reflect/type_test.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/api/next/60088.txt b/api/next/60088.txt index 9a83842faf89c5..6eacb139a779ed 100644 --- a/api/next/60088.txt +++ b/api/next/60088.txt @@ -1 +1 @@ -pkg reflect, func TypeFor[$0 interface{}]() Type +pkg reflect, func TypeFor[$0 interface{}]() Type #60088 diff --git a/src/reflect/type.go b/src/reflect/type.go index df0d083c6f26f3..5b687490737f5c 100644 --- a/src/reflect/type.go +++ b/src/reflect/type.go @@ -2910,7 +2910,7 @@ func addTypeBits(bv *bitVector, offset uintptr, t *abi.Type) { } } -// TypeFor returns the reflection Type that represents the static type of T. +// TypeFor returns the [Type] that represents the type argument T. func TypeFor[T any]() Type { return TypeOf((*T)(nil)).Elem() } diff --git a/src/reflect/type_test.go b/src/reflect/type_test.go index b47a363449a464..75784f96665063 100644 --- a/src/reflect/type_test.go +++ b/src/reflect/type_test.go @@ -29,7 +29,7 @@ func TestTypeFor(t *testing.T) { for _, tc := range testcases { want := reflect.ValueOf(tc.wantFrom).Elem().Type() if want != tc.got { - t.Errorf("unexpected reflect.Type: want %v; got %v", want, tc.got) + t.Errorf("unexpected reflect.Type: got %v; want %v", tc.got, want) } } }