1// Copyright 2021 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package a
6
7func Conv(v interface{}) string {
8	return conv[string](v)
9}
10
11func conv[T any](v interface{}) T {
12	return v.(T)
13}
14
15func Conv2(v interface{}) (string, bool) {
16	return conv2[string](v)
17}
18
19func conv2[T any](v interface{}) (T, bool) {
20	x, ok := v.(T)
21	return x, ok
22}
23
24func Conv3(v interface{}) string {
25	return conv3[string](v)
26}
27
28func conv3[T any](v interface{}) T {
29	switch v := v.(type) {
30	case T:
31		return v
32	default:
33		var z T
34		return z
35	}
36}
37
38type Mystring string
39
40func (Mystring) Foo() {
41}
42
43func Conv4(v interface{Foo()}) Mystring {
44	return conv4[Mystring](v)
45}
46
47func conv4[T interface{Foo()}](v interface{Foo()}) T {
48	switch v := v.(type) {
49	case T:
50		return v
51	default:
52		var z T
53		return z
54	}
55}
56