| // Copyright 2021 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 a |
| |
| func Conv(v interface{}) string { |
| return conv[string](v) |
| } |
| |
| func conv[T any](v interface{}) T { |
| return v.(T) |
| } |
| |
| func Conv2(v interface{}) (string, bool) { |
| return conv2[string](v) |
| } |
| |
| func conv2[T any](v interface{}) (T, bool) { |
| x, ok := v.(T) |
| return x, ok |
| } |
| |
| func Conv3(v interface{}) string { |
| return conv3[string](v) |
| } |
| |
| func conv3[T any](v interface{}) T { |
| switch v := v.(type) { |
| case T: |
| return v |
| default: |
| var z T |
| return z |
| } |
| } |
| |
| type Mystring string |
| |
| func (Mystring) Foo() { |
| } |
| |
| func Conv4(v interface{Foo()}) Mystring { |
| return conv4[Mystring](v) |
| } |
| |
| func conv4[T interface{Foo()}](v interface{Foo()}) T { |
| switch v := v.(type) { |
| case T: |
| return v |
| default: |
| var z T |
| return z |
| } |
| } |