File: assert0.go

package info (click to toggle)
golang-github-traefik-yaegi 0.16.1-2
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 24,608 kB
  • sloc: sh: 457; makefile: 39
file content (128 lines) | stat: -rw-r--r-- 2,506 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package main

import (
	"fmt"
	"time"
)

type MyWriter interface {
	Write(p []byte) (i int, err error)
}

type DummyWriter interface {
	Write(p []byte) (i int, err error)
}

type TestStruct struct{}

func (t TestStruct) Write(p []byte) (n int, err error) {
	return len(p), nil
}

func usesWriter(w MyWriter) {
	n, _ := w.Write([]byte("hello world"))
	fmt.Println(n)
}

type MyStringer interface {
	String() string
}

type DummyStringer interface {
	String() string
}

func usesStringer(s MyStringer) {
	fmt.Println(s.String())
}

func main() {
	// TODO(mpl): restore when we can deal with empty interface.
//	var t interface{}
	var t DummyWriter
	t = TestStruct{}
	var tw MyWriter
	var ok bool
	tw, ok = t.(MyWriter)
	if !ok {
		fmt.Println("TestStruct does not implement MyWriter")
	} else {
		fmt.Println("TestStruct implements MyWriter")
		usesWriter(tw)
	}
	n, _ := t.(MyWriter).Write([]byte("hello world"))
	fmt.Println(n)

	// not redundant with the above, because it goes through a slightly different code path.
	if _, ok := t.(MyWriter); !ok {
		fmt.Println("TestStruct does not implement MyWriter")
		return
	} else {
		fmt.Println("TestStruct implements MyWriter")
	}

	// TODO(mpl): restore
	/*
	t = 42
	foo, ok := t.(MyWriter)
	if !ok {
		fmt.Println("42 does not implement MyWriter")
	} else {
		fmt.Println("42 implements MyWriter")
	}
	_ = foo

	if _, ok := t.(MyWriter); !ok {
		fmt.Println("42 does not implement MyWriter")
	} else {
		fmt.Println("42 implements MyWriter")
	}
	*/

	// var tt interface{}
	var tt DummyStringer
	tt = time.Nanosecond
	var myD MyStringer
	myD, ok = tt.(MyStringer)
	if !ok {
		fmt.Println("time.Nanosecond does not implement MyStringer")
	} else {
		fmt.Println("time.Nanosecond implements MyStringer")
		usesStringer(myD)
	}
	fmt.Println(tt.(MyStringer).String())

	if _, ok := tt.(MyStringer); !ok {
		fmt.Println("time.Nanosecond does not implement MyStringer")
	} else {
		fmt.Println("time.Nanosecond implements MyStringer")
	}

	// TODO(mpl): restore
	/*
	tt = 42
	bar, ok := tt.(MyStringer)
	if !ok {
		fmt.Println("42 does not implement MyStringer")
	} else {
		fmt.Println("42 implements MyStringer")
	}
	_ = bar

	if _, ok := tt.(MyStringer); !ok {
		fmt.Println("42 does not implement MyStringer")
	} else {
		fmt.Println("42 implements MyStringer")
	}
	*/
}

// Output:
// TestStruct implements MyWriter
// 11
// 11
// TestStruct implements MyWriter
// time.Nanosecond implements MyStringer
// 1ns
// 1ns
// time.Nanosecond implements MyStringer