Go语言学习之创建方法|Go主题月

537 阅读3分钟

作者:看那个码农

公众号:看那个码农

上期内容介绍了Go语言学习之使用结构体|Go主题月

  • 结构体是什么
  • 结构体的定义格式
  • 嵌套结构体
  • 比较结构体
  • 匿名结构体

本篇内容将继续带领大家走进Go语言的世界。

1.方法的来源

在上一节中,我们可以使用点表示法来访问结构体中的数据,然而,涉及到更复杂的数据操作时,处理数据时就会不那么容易。Go语言提供了另一种数据操作的方式——通过方法来操作。

Go语言中的方法是一种作用于特定类型变量的函数。这种特定类型变量叫做接收器

接收器的类型可以是任何类型,不仅仅是结构体,任何类型都可以拥有方法。

2.使用方法

方法类似函数,但有一点不同:

方法是在关键词func后面添加了另一个参数部分,我们称之为接收器,用于接受单个参数。

如下面案例所示,即为创建方法的过程:

package main

import "fmt"

type number struct {
   length     int
   width      int
}

func (n *number) area() int{
   return n.length*n.width
}

func main() {
   sum :=number{3,5}
   fmt.Printf("面积为:%v",sum.area())
   }

输出为:

image.png

简单点来说:方法是接收器内部的函数。可以通过接收器,调用其内部的函数

常见的接收器类型为结构体

3.创建方法集

方法集是可对特定数据类型进行调用的一组方法。在Go语言中,任何数据类型都可有相关联的方法集。

例如在球形问题时,需要计算表面积和体积。在这种情况下,非常适用使用结构体和方法集。

具体案例如下:

package main

import (
   "fmt"
   "math"
)

type number struct {
   radius     float64
}

func (n *number) surfacearea() float64{
   return float64(4) * math.Pi * (n.radius*n.radius)
}

func (n *number) volume() float64{
   radius3:= n.radius * n.radius * n.radius
   return (float64(4)/float64(3)) * math.Pi * radius3
}

func main() {
   r :=number{3}
   fmt.Printf("该球体表面积为:%v\n",r.surfacearea())
   fmt.Printf("该球体的体积为:%v",r.volume())
   }

输出为:

image.png

4.使用方法和指针

方法是一个接收被称为接收者的特殊参数的函数,接收者可以是指针,也可以是

1.指针参数 func (n *number) surfacearea() float64{}

2.值参数 func (n number) surfacearea() float64{}

我们来看看二者的区别

案例如下:

package main

import (
   "fmt"
)

type Human struct{
   Name string
   Age int
}

func (this *Human) setName(name string){
   this.Name = name
   fmt.Println(this)
}

func (this Human) setAge(age int){
   this.Age = age
   fmt.Println(this)
}


func main(){
   var people Human
   people.setName("Peter")
   people.setAge(25)
}

输出为:

image.png

我们用一个对比案例,看看值类型指针类型的区别

func (this *Human) setName(name string) 的接收器类型换为值参数

func (this Human) setAge(age int) 的接收器类型换为指针参数

案例如下:

package main

import (
   "fmt"
)

type Human struct{
   Name string
   Age int
}

func (this Human) setName(name string){
   this.Name = name
   fmt.Println(this)
}

func (this *Human) setAge(age int){
   this.Age = age
   fmt.Println(this)
}

输出为:

image.png

我们可以发现 当接收器的的类型为值参数时,此时不会改变调用对象的值,也就是结构体原有的值不会改变

当接收器的的类型为指针参数时,此时会改变调用对象的值,也就是结构体原有的值会改变

5.方法和函数的区别

方法是特殊的函数,定义在某一特定的类型上,通过类型的实例来进行调用,这个实例被叫接收者

接收器的类型可以是任何类型,不仅仅是结构体,任何类型都可以拥有方法。

  • 函数将变量作为参数:Function1(recv)
  • 方法在变量上被调用:recv.Method1()

如果你觉得这篇内容对你有帮助的话:

1、点赞支持下吧,让更多的人也能看到这篇内容

2、关注公众号:看那个码农,我们一起学习一起进步。