Go语言学习:每日一练3
目录
- Go语言学习:每日一练3
- 方法
- 接口
- 继承
- 类型断言
方法
方法是一类有接收者参数的函数。
接收者的类型定义和方法的声明必须在一个包里
type MyInt int
func (m MyInt) Add(add int) int {
return int(m) + add
}
//OR
func (m *MyInt) Add(add int) int {
return int(m) + add
}
func main() {
v := MyInt(12)
fmt.Println(v.Add(1))
}
- 接收者值传递
- go的优化–调用的时候不需要区分接受者是指针还是源类型
//等价的
func (reciever Vertex) Test() {}
func Test(receiver Vertex) {}
接口
接口类型的定义为一组方法签名。
接口类型的变量可以持有任何实现了这些方法的值。
type Abser interface{
Abs() float64
}
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}
var abser Abser
abser = &v
//方法定义的接受者为指针,所以接口的变量只能持有一个指针
//但接收值为源类型的时候,接口的变量没有持有限制。
}
继承
go没有提供继承的机制,但是又类似于继承的处理方式。
type Inner struct {
name string
}
type Outer struct {
Inner
Inner2 Inner
string
}
func (inner Inner) SayName() {
fmt.Println(inner.name)
}
当结构体中存在匿名字段的时候,结构体可以直接访问其属性和方法,看起来像继承了一样。
func main() {
out := Outer{
Inner{"hello"},
Inner{"world"},
"111"}
fmt.Println(out.name)
out.SayName()
fmt.Println(out.string)
}
类型断言
类型断言提供了一种访问接口底层具体值的方法
t := i.(T) //失败会触发panic
t, ok = i.(T) //更推荐的语法
类型选择
switch v := i.(type) {
case int:
fmt.Printf("二倍的 %v 是 %v\n", v, v*2)
case string:
fmt.Printf("%q 长度为 %v 字节\n", v, len(v))
default:
fmt.Printf("我不知道类型 %T!\n", v)
}