| // 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. |
| |
| // Like ifacemethod2.go, this tests that a method *is* live |
| // if the type is "indirectly" converted to an interface |
| // using reflection with a method descriptor as intermediate. |
| // However, it uses MethodByName() with a constant name of |
| // a method to look up. This does not disable the DCE like |
| // Method(0) does. |
| |
| package main |
| |
| import "reflect" |
| |
| type S int |
| |
| func (s S) M() { println("S.M") } |
| |
| type I interface{ M() } |
| |
| type T float64 |
| |
| func (t T) F(s S) {} |
| |
| func main() { |
| var t T |
| meth, _ := reflect.TypeOf(t).MethodByName("F") |
| ft := meth.Type |
| at := ft.In(1) |
| v := reflect.New(at).Elem() |
| v.Interface().(I).M() |
| } |