最近面试成功了腾讯教育子公司。以后得从事Go语言开发相关工作啦,特此在这记录下Go基础学习。
参考链接: /
Go方法和接口
- 方法
-
- 指针接收者
-
- 方法与指针重定向
- 选择值或指针作为接收者
- 接口
-
- 接口与隐式实现
- 接口值
-
- nil 接口值
- 空接口
- 类型断言 (访问接口值底层具体值类型)
-
- 类型选择 switch v := i.(type)
- 嵌入interface
- Stringer接口
- 错误
- Reader
方法
method是附属在一个给定的类型上的,他的语法和函数的声明语法几乎一样,只是在func后面增加了一个receiver(也就是method所依从的主体)。【go语言函数不能重载,用方法可以实现】
Go 没有类。不过你可以为结构体类型定义方法。
- 方法就是一类带特殊的 接收者 参数的函数。
- 方法接收者在它自己的参数列表内,位于 func 关键字和方法名之间。
type Vertex struct {
X, Y float64
}
func (v Vertex) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
// Abs 方法拥有一个名为 v,类型为 Vertex 的接收者。
func main() {
v := Vertex{
3, 4}
fmt.Println(v.Abs())
}
// 现在这个 Abs 的写法就是个正常的函数,功能并没有什么变化。
func Abs(v Vertex) float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
func main() {
v := Vertex{
3, 4}
fmt.Println(Abs(v))
}
方法只是个带接收者参数的函数。
指针接收者
你可以为指针接收者声明方法。
对于某类型 T,接收者的类型可以用 *T 的文法。(此外,T 不能是像 *int 这样的指针。)
指针接收者的方法可以修改接收者指向的值(就像 Scale 在这做的)。由于方法经常需要修改它的接收者,指针接收者比值接收者更常用。
若使用值接收者,那么 Scale 方法会对原始 Vertex 值的副本进行操作。(对于函数的其它参数也是如此。)Scale 方法必须用指针接受者来更改 main 函数中声明的 Vertex 的值。
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.