### Method
A method is a function with a special receiver argument.
type Vertex struct {
	X, Y float64
}
func (v Vertex) Abs() float64 {
	return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
func main(){
	v := Vertex{3, 4}
	fmt.Println(v.Abs())
}
– Methods are functions
You can declare a method on non-struct types, too.
type MyFloat float64
func (f MyFloat) Abs() float64 {
	if f < 0 {
		return float64(-f)
	}
	return float64(f)
}
func main(){
	f := MyFloat(-math.Sqrt2)
	fmt.Println(f.Abs())
}
– Pointer receivers
You can declare methods with pointer receivers.
type Vertex struct {
	X, Y float64
}
func (v Vertex) Abs() float64 {
	return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
func (v *Vertex) Scale(f float64){
	v.X = v.X * f
	v.Y = v.Y * f
}
func main(){
	v := Vertex{3, 4}
	v.Scale(10)
	fmt.Println(v.Abs())
}
### Interface
An interface type is defined as a set of method signatures
type Abser interface {
	Abs() float64
}
func main(){
	var a Abser
	f := MyFloat(-math.Sqrt2)
	v := Vertex{3, 4}
	a = f
	a = &v
	a = v
	fmt.Println(a.Abs())
}
type MyFloat float64
func(f MyFloat) Abs() float64 {
	if f < 0 {
		return float64(-f)
	}
	return float64(f)
}
type Vertex struct {
	X, Y float64
}
func(v *Vertex) Abs() float64 {
	return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
# command-line-arguments
./hello.go:19:4: cannot use v (type Vertex) as type Abser in assignment:
	Vertex does not implement Abser (Abs method has pointer receiver)
– Interfaces are implemented implicitly
A type implements an interface by implementing its methods. There is no explicit declaration of intent, no “implements” keyword.
type I interface {
	M()
}
type T struct {
	S string
}
func (t T) M(){
	fmt.Println(t.S)
}
func main(){
	var i I = T{"hello"}
	i.M()
}
– Interface values
Under the hood, interface values can be thought of as a tuple of value and a concrete type.
type I interface {
	M()
}
type T struct {
	S string
}
func (t *T) M(){
	fmt.Println(t.S)
}
type F float64
func(f F) M(){
	fmt.Println(f)
}
func main(){
	var i I
	i = &T{"hello"}
	describe(i)
	i.M()
	i = F(math.Pi)
	describe(i)
	i.M()
}
func describe(i I){
	fmt.Printf("(%v, %T)\n", i, i)
}
interfaceやったなあ
 
					 
