Java转Go初步学习(方法和接口篇)

时间:2025-02-24 07:46:43

最近面试成功了腾讯教育子公司。以后得从事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.