Methods and interfaces
作者:互联网
golang的数组是用花括号括起来的。
Method
A method is just a function with a receiver.
method:
func (v type1) Abs() type2{ }
v.Abs()
function:
func Abs(v type1) type2 { }
Abs(v)
receiver的type得和method在同一个package中定义,不能直接用built-in type,如需要的话,可自定义type MyFloat float64
Pointer receiver and value receiver
pointer receiver 可以更改receiver指向的值,而value receiver只能在原值的复制上进行操作,无法更改原值。
参数为pointer的函数在调用时必须传入pointer,receiver为pointer的方法调用时可接收value or pointer作为receiver,go会自动将value.method()翻译为(&value).method()
参数为value的函数在调用时必须传入value,receiver为value的方法调用时可接收value or pointer作为receiver,go会自动将pointer.method()翻译为(*pointer).method
the reasons to choose a pointer receiver
1.可修改receiver指向的值
2. 避免在调用方法时对值的复制,相比receiver是个大型结构体时,效率更高。
interface
接口是一组方法签名
定义接口
type interface_name interface{
method_name return_type
}
实现接口所有方法的type称为实现了该接口
type隐式地实现接口,任何实现接口的类型的变量都可以赋给接口变量
interface value = (value, type)
一个接口变量调用方法相当于执行底层类型的同名方法
Note that an interface value that holds a nil concrete value is itself non-nil.
A nil interface value holds neither value nor concrete type.
调用nil interface的方法会出现runtime error,因为没有指示调用哪个具体类型的方法。
空接口empty interface在interface定义体内没有任何method,可用于处理任何类型的值,如fmt.Print
type assertion
t := i.(T)
如果接口变量i保存了具体类型T的值,则把T类型值赋给t;如果没有保存,则触发panic
t, ok := i.(T)
ok得到的值为boolean,为断言是否成功。
type switch
括号内是关键字type
switch t := i.(type){
case int:
...
case string:
...
default:
...
}
Stringer interface
type Stringer interface {
String() string
}
实现String方法可自定义不同类型变量的fmt的Println
error
内置接口
nil error 表示语句执行成功 non-nil表示失败
io.Reader interface
func (T) Read(b []byte)(n int, err error)
标签:Methods,pointer,interfaces,value,receiver,interface,type,method 来源: https://www.cnblogs.com/hicuppers-/p/16318207.html