-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmethodsandinterfaces.go
64 lines (49 loc) · 1.18 KB
/
methodsandinterfaces.go
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
package main
import (
"fmt"
"math"
)
type Abser interface {
Abs() float64
}
type MyFloat float64
func (f MyFloat) Abs() float64 {
if f < 0 {
return float64(-f)
}
return float64(f)
}
type Vertex struct {
X, Y float64
}
// No se pueden declarar con el mismo nombre métdodos del apuntador a la estructura ni de la propia estructura, pero aún así existen y son diferentes
// los metódos de la estructura y los métodos del apuntador a la estructura
/*func (v *Vertex) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}*/
func (v Vertex) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
func main() {
var a Abser
fmt.Println(a)
f := MyFloat(-math.Sqrt2)
fmt.Println(f.Abs())
fmt.Printf("Type of f: %T\n", f)
v := Vertex{3, 4}
//fmt.Println(v.Yo())
fmt.Println(v.Abs())
fmt.Printf("Type of v: %T\n", v)
a = f // a MyFloat implements Abser
fmt.Println(a.Abs())
fmt.Printf("Type of a: %T\n", a)
a = &v // a *Vertex implements Abser
fmt.Println(a.Abs())
fmt.Printf("Type of a: %T\n", a)
// In the following line, v is a Vertex (not *Vertex)
// and does NOT implement Abser.
a = v
fmt.Println(a.Abs())
fmt.Printf("Type of a: %T\n", a)
//fmt.Println(a.Abs())
}