]> Cypherpunks.ru repositories - gostls13.git/commitdiff
reflect: add TypeFor
authorCarl Johnson <me@carlmjohnson.net>
Thu, 27 Jul 2023 01:21:48 +0000 (01:21 +0000)
committerGopher Robot <gobot@golang.org>
Mon, 31 Jul 2023 15:50:15 +0000 (15:50 +0000)
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 <gobot@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
Auto-Submit: Ian Lance Taylor <iant@google.com>
Reviewed-by: David Chase <drchase@google.com>
Reviewed-by: Ian Lance Taylor <iant@google.com>
Run-TryBot: Ian Lance Taylor <iant@google.com>

api/next/60088.txt [new file with mode: 0644]
src/reflect/type.go
src/reflect/type_test.go [new file with mode: 0644]

diff --git a/api/next/60088.txt b/api/next/60088.txt
new file mode 100644 (file)
index 0000000..6eacb13
--- /dev/null
@@ -0,0 +1 @@
+pkg reflect, func TypeFor[$0 interface{}]() Type #60088
index cefb9a43ab41a6d2c343257b43eb5af14dd7eb17..c23b9973df86dd8cabab5eab2d744c515e3995cc 100644 (file)
@@ -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 (file)
index 0000000..75784f9
--- /dev/null
@@ -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)
+               }
+       }
+}