From: Carl Johnson Date: Thu, 27 Jul 2023 01:21:48 +0000 (+0000) Subject: reflect: add TypeFor X-Git-Tag: go1.22rc1~1491 X-Git-Url: http://www.git.cypherpunks.ru/?a=commitdiff_plain;h=42d2dfb4305aecb3a6e5494db6b8f6e48a09b420;p=gostls13.git reflect: add TypeFor Fixes #60088 Change-Id: I7b43d329def22c2524501ba1d6bfc73becc823d1 GitHub-Last-Rev: becd714c4562da4a3280c3a56ebaf246e48e9f37 GitHub-Pull-Request: golang/go#61598 Reviewed-on: https://go-review.googlesource.com/c/go/+/513478 TryBot-Result: Gopher Robot Run-TryBot: Ian Lance Taylor Auto-Submit: Ian Lance Taylor Reviewed-by: David Chase Reviewed-by: Ian Lance Taylor Run-TryBot: Ian Lance Taylor --- diff --git a/api/next/60088.txt b/api/next/60088.txt new file mode 100644 index 0000000000..6eacb139a7 --- /dev/null +++ b/api/next/60088.txt @@ -0,0 +1 @@ +pkg reflect, func TypeFor[$0 interface{}]() Type #60088 diff --git a/src/reflect/type.go b/src/reflect/type.go index cefb9a43ab..c23b9973df 100644 --- a/src/reflect/type.go +++ b/src/reflect/type.go @@ -2911,3 +2911,8 @@ func addTypeBits(bv *bitVector, offset uintptr, t *abi.Type) { } } } + +// 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 new file mode 100644 index 0000000000..75784f9666 --- /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) + } + } +}