2018-05-04 17:31:45 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"runtime"
|
2018-07-28 19:12:07 +00:00
|
|
|
"strings"
|
2018-05-04 17:31:45 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
func callstacktrace() (stacktrace string) {
|
|
|
|
for skip := 0; ; skip++ {
|
|
|
|
pc, file, line, ok := runtime.Caller(skip)
|
|
|
|
if !ok {
|
|
|
|
break
|
|
|
|
}
|
|
|
|
fn := runtime.FuncForPC(pc)
|
|
|
|
stacktrace += fmt.Sprintf("in %s at %s:%d\n", fn.Name(), file, line)
|
|
|
|
}
|
|
|
|
return stacktrace
|
|
|
|
}
|
|
|
|
|
|
|
|
func call1(a, b int) int {
|
|
|
|
fmt.Printf("first: %d second: %d\n", a, b)
|
|
|
|
return a + b
|
|
|
|
}
|
|
|
|
|
|
|
|
func callpanic() {
|
|
|
|
fmt.Printf("about to panic\n")
|
|
|
|
panic("callpanic panicked")
|
|
|
|
}
|
|
|
|
|
2018-07-28 19:12:07 +00:00
|
|
|
func stringsJoin(v []string, sep string) string {
|
|
|
|
// This is needed because strings.Join is in an optimized package and
|
|
|
|
// because of a bug in the compiler arguments of optimized functions don't
|
|
|
|
// have a location.
|
|
|
|
return strings.Join(v, sep)
|
|
|
|
}
|
|
|
|
|
2018-07-31 12:50:10 +00:00
|
|
|
type astruct struct {
|
|
|
|
X int
|
|
|
|
}
|
|
|
|
|
|
|
|
func (a astruct) VRcvr(x int) string {
|
|
|
|
return fmt.Sprintf("%d + %d = %d", x, a.X, x+a.X)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (pa *astruct) PRcvr(x int) string {
|
|
|
|
return fmt.Sprintf("%d - %d = %d", x, pa.X, x-pa.X)
|
|
|
|
}
|
|
|
|
|
|
|
|
type PRcvrable interface {
|
|
|
|
PRcvr(int) string
|
|
|
|
}
|
|
|
|
|
|
|
|
type VRcvrable interface {
|
|
|
|
VRcvr(int) string
|
|
|
|
}
|
|
|
|
|
2018-05-04 17:31:45 +00:00
|
|
|
var zero = 0
|
|
|
|
|
2018-07-31 16:32:30 +00:00
|
|
|
func makeclos(pa *astruct) func(int) string {
|
|
|
|
i := 0
|
|
|
|
return func(x int) string {
|
|
|
|
i++
|
|
|
|
return fmt.Sprintf("%d + %d + %d = %d", i, pa.X, x, i+pa.X+x)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-05-04 17:31:45 +00:00
|
|
|
func main() {
|
|
|
|
one, two := 1, 2
|
2018-07-28 19:12:07 +00:00
|
|
|
intslice := []int{1, 2, 3}
|
|
|
|
stringslice := []string{"one", "two", "three"}
|
|
|
|
comma := ","
|
2018-07-31 12:50:10 +00:00
|
|
|
a := astruct{X: 3}
|
|
|
|
pa := &astruct{X: 6}
|
|
|
|
|
|
|
|
var vable_a VRcvrable = a
|
|
|
|
var vable_pa VRcvrable = pa
|
|
|
|
var pable_pa PRcvrable = pa
|
|
|
|
|
2018-07-31 16:32:30 +00:00
|
|
|
fn2clos := makeclos(pa)
|
|
|
|
fn2glob := call1
|
|
|
|
fn2valmeth := pa.VRcvr
|
|
|
|
fn2ptrmeth := pa.PRcvr
|
|
|
|
var fn2nil func()
|
|
|
|
|
2018-05-04 17:31:45 +00:00
|
|
|
runtime.Breakpoint()
|
|
|
|
call1(one, two)
|
2018-07-31 16:32:30 +00:00
|
|
|
fn2clos(2)
|
|
|
|
fmt.Println(one, two, zero, callpanic, callstacktrace, stringsJoin, intslice, stringslice, comma, a.VRcvr, a.PRcvr, pa, vable_a, vable_pa, pable_pa, fn2clos, fn2glob, fn2valmeth, fn2ptrmeth, fn2nil)
|
2018-05-04 17:31:45 +00:00
|
|
|
}
|