1// run
2
3// Copyright 2017 The Go Authors. All rights reserved.
4// Use of this source code is governed by a BSD-style
5// license that can be found in the LICENSE file.
6
7package main
8
9import "fmt"
10
11func set(m map[interface{}]interface{}, key interface{}) (err error) {
12	defer func() {
13		if r := recover(); r != nil {
14			err = fmt.Errorf("set failed: %v", r)
15		}
16	}()
17	m[key] = nil
18	return nil
19}
20
21func del(m map[interface{}]interface{}, key interface{}) (err error) {
22	defer func() {
23		if r := recover(); r != nil {
24			err = fmt.Errorf("del failed: %v", r)
25		}
26	}()
27	delete(m, key)
28	return nil
29}
30
31func addInt(m map[interface{}]int, key interface{}) (err error) {
32	defer func() {
33		if r := recover(); r != nil {
34			err = fmt.Errorf("addInt failed: %v", r)
35		}
36	}()
37	m[key] += 2018
38	return nil
39}
40
41func addStr(m map[interface{}]string, key interface{}) (err error) {
42	defer func() {
43		if r := recover(); r != nil {
44			err = fmt.Errorf("addStr failed: %v", r)
45		}
46	}()
47	m[key] += "hello, go"
48	return nil
49}
50
51func appendInt(m map[interface{}][]int, key interface{}) (err error) {
52	defer func() {
53		if r := recover(); r != nil {
54			err = fmt.Errorf("appendInt failed: %v", r)
55		}
56	}()
57	m[key] = append(m[key], 2018)
58	return nil
59}
60
61func appendStr(m map[interface{}][]string, key interface{}) (err error) {
62	defer func() {
63		if r := recover(); r != nil {
64			err = fmt.Errorf("addStr failed: %v", r)
65		}
66	}()
67	m[key] = append(m[key], "hello, go")
68	return nil
69}
70
71func main() {
72	m := make(map[interface{}]interface{})
73	set(m, []int{1, 2, 3})
74	set(m, "abc") // used to throw
75	del(m, []int{1, 2, 3})
76	del(m, "abc") // used to throw
77
78	mi := make(map[interface{}]int)
79	addInt(mi, []int{1, 2, 3})
80	addInt(mi, "abc") // used to throw
81
82	ms := make(map[interface{}]string)
83	addStr(ms, []int{1, 2, 3})
84	addStr(ms, "abc") // used to throw
85
86	mia := make(map[interface{}][]int)
87	appendInt(mia, []int{1, 2, 3})
88
89	msa := make(map[interface{}][]string)
90	appendStr(msa, "abc") // used to throw
91}
92