| // run | |
| // Copyright 2017 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 main | |
| import ( | |
| "runtime" | |
| ) | |
| func main() { | |
| println(caller().frame.Function) | |
| // Used to erroneously print "main.call.name" instead of | |
| // "main.main". | |
| println(caller().name()) | |
| } | |
| func caller() call { | |
| var pcs [3]uintptr | |
| n := runtime.Callers(1, pcs[:]) | |
| frames := runtime.CallersFrames(pcs[:n]) | |
| frame, _ := frames.Next() | |
| frame, _ = frames.Next() | |
| return call{frame: frame} | |
| } | |
| type call struct { | |
| frame runtime.Frame | |
| } | |
| func (c call) name() string { | |
| return c.frame.Function | |
| } |