Go语言基本语法
- 包
- 函数
- var变量
- const常量
- 类型
- 流程控制
- 更多类型
方法
- Go没有类。不过可以为结构体类型定义方法。方法就是一类带特殊的接受者参数的函数。方法接收者在它自己的参数列表内,位于func关键字和方法名之间。
package main
import (
"fmt"
"math"
)
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())
}
- 你可以对包中的 任意 类型定义任意方法,而不仅仅是针对结构体。
但是,不能对来自其他包的类型或基础类型定义方法。
package main
import (
"fmt"
"math"
)
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())
}
- 接收者为指针的方法
方法可以与命名类型或命名类型的指针关联。当我们要改变对象的值,我们要用到指针。
用指针的优点在于:
- 方法能够修改其接受者指向的值
- 避免每次调用方法时复制该值。若值得类型为大型结构体时,这样做会更加高效。
package main
import (
"fmt"
"math"
)
type Vertex struct {
X, Y float64
}
func (v *Vertex) Scale(f float64) {
v.X = v.X * f
v.Y = v.Y * f
}
func (v *Vertex) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
func main() {
v := &Vertex{3, 4}
v.Scale(5)
fmt.Println(v, v.Abs())
}
继承
在Go语言中继承是通过接口来实现的。优点是解耦,我们无需显示的实现声明。
空接口可用来接受任何对象的值,在不知道类型的情况下使用。
Go语言里有内置的接口Error,所有的Error都是实现了这个接口的方法,相当于Java里的Exception。
package main
import (
"fmt"
"math"
)
type Abser interface {
Abs() float64
}
func main() {
var a Abser
f := MyFloat(-math.Sqrt2)
v := Vertex{3, 4}
a = f // a MyFloat 实现了 Abser
a = &v // a *Vertex 实现了 Abser
// 下面一行,v 是一个 Vertex(而不是 *Vertex)
// 所以没有实现 Abser。
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)
}