| // 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 | 
 | } |