go/api/next
Mateusz Poliwczak 2541a68a70 reflect: add TypeAssert[T]
This implementation is zero-alloc when T is a concrete type,
allocates when val contains a method or when T is a interface
and Value was obtained for example through Elem(), in which case
it has to be allocated to avoid sharing the same memory.

goos: linux
goarch: amd64
pkg: reflect
cpu: AMD Ryzen 5 4600G with Radeon Graphics
                                                                         │ /tmp/bench2 │
                                                                         │   sec/op    │
TypeAssert/TypeAssert[int](int)-12                                         2.725n ± 1%
TypeAssert/TypeAssert[uint8](int)-12                                       2.599n ± 1%
TypeAssert/TypeAssert[fmt.Stringer](reflect_test.testTypeWithMethod)-12    8.470n ± 0%
TypeAssert/TypeAssert[fmt.Stringer](*reflect_test.testTypeWithMethod)-12   8.460n ± 1%
TypeAssert/TypeAssert[interface_{}](int)-12                                4.181n ± 1%
TypeAssert/TypeAssert[interface_{}](reflect_test.testTypeWithMethod)-12    4.178n ± 1%
TypeAssert/TypeAssert[time.Time](time.Time)-12                             2.839n ± 0%
TypeAssert/TypeAssert[func()_string](func()_string)-12                     151.1n ± 1%
geomean                                                                    6.645n

                                                                         │ /tmp/bench2  │
                                                                         │     B/op     │
TypeAssert/TypeAssert[int](int)-12                                         0.000 ± 0%
TypeAssert/TypeAssert[uint8](int)-12                                       0.000 ± 0%
TypeAssert/TypeAssert[fmt.Stringer](reflect_test.testTypeWithMethod)-12    0.000 ± 0%
TypeAssert/TypeAssert[fmt.Stringer](*reflect_test.testTypeWithMethod)-12   0.000 ± 0%
TypeAssert/TypeAssert[interface_{}](int)-12                                0.000 ± 0%
TypeAssert/TypeAssert[interface_{}](reflect_test.testTypeWithMethod)-12    0.000 ± 0%
TypeAssert/TypeAssert[time.Time](time.Time)-12                             0.000 ± 0%
TypeAssert/TypeAssert[func()_string](func()_string)-12                     72.00 ± 0%
geomean                                                                               ¹

Fixes #62121

Change-Id: I0911c70c5966672c930d387438643f94a40441c4
GitHub-Last-Rev: ce89a53097
GitHub-Pull-Request: golang/go#71639
Reviewed-on: https://go-review.googlesource.com/c/go/+/648056
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Keith Randall <khr@google.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
2025-05-20 12:40:33 -07:00
..
46771.txt mime/multipart: add helper to build content-disposition header contents 2025-03-12 16:20:01 -07:00
49580.txt io/fs: add ReadLinkFS interface 2025-02-03 08:38:43 -08:00
59928.txt testing: add Output 2025-05-13 15:43:42 -07:00
62121.txt reflect: add TypeAssert[T] 2025-05-20 12:40:33 -07:00
63405.txt crypto,crypto/x509: implement MessageSigner 2025-05-08 07:46:12 -07:00
63796.txt sync: add WaitGroup.Go 2025-04-04 08:19:32 -07:00
67002.txt os: add Root.Symlink 2025-03-28 11:02:40 -07:00
67516.txt crypto/tls: add ConnectionState.CurveID 2025-03-13 08:19:32 -07:00
70250.txt api: move go1.25 to next/70250 2025-04-03 08:07:11 -07:00
70280.txt log/slog: export Source method in Record for custom handler support 2025-05-06 03:58:07 -07:00
70780.txt unicode: add CategoryAliases, Cn, LC 2025-04-18 14:13:31 -07:00
71122.txt go/parser: deprecate parser.ParseDir 2025-02-19 11:49:13 -08:00
72843.txt debug/elf: add riscv attributes definitions 2025-03-14 15:08:23 -07:00
73205.txt go/token: add FileSet.AddExistingFiles 2025-05-19 11:26:48 -07:00
73319.txt go/ast: add PreorderStack, a variant of Inspect that builds a stack 2025-05-19 10:54:45 -07:00