go 结构体方法

在 Go 语言中,结构体方法是指附加到结构体类型上的函数。这些方法可以通过结构体的实例来调用。方法的接收者(receiver)指定了该方法属于哪个结构体类型。接收者可以是一个值类型或指针类型。

定义结构体方法

下面是如何为一个结构体定义方法的示例:

package main

import (

"fmt"

)

type Rectangle struct {

Width, Height float64

}

// 值接收者方法

func (r Rectangle) Area() float64 {

return r.Width * r.Height

}

// 指针接收者方法

func (r *Rectangle) Scale(factor float64) {

r.Width *= factor

r.Height *= factor

}

func main() {

rect := Rectangle{Width: 3, Height: 4}

// 调用值接收者方法

fmt.Println("Area:", rect.Area()) // 输出: Area: 12

// 调用指针接收者方法

rect.Scale(2)

fmt.Println("Scaled Rectangle:", rect) // 输出: Scaled Rectangle: {6 8}

}

方法接收者类型

1.值接收者:

  • 方法接收者是结构体的一个副本。
  • 适用于不需要修改接收者的场景。
  • 调用时,Go 会复制接收者的值。

2 指针接收者:

  • 方法接收者是结构体的指针。
  • 适用于需要修改接收者的场景。
  • 调用时,Go 不会复制接收者,而是直接使用其内存地址。

方法接收者是结构体的指针。

  • 值接收者适用于需要修改接收者的场景。
  • 指针接收者适合需要修改结构体状态的方法,或者结构体较大,复制成本高的情况。

自动解引用

调用方法时,Go 语言会自动处理指针和值之间的转换:

  • 如果你有一个结构体的值,但方法接收者是指针,Go 会自动取地址。
  • 如果你有一个结构体的指针,但方法接收者是值,Go 会自动解引用。

自动解引用和取地址的例子

package main

import (

"fmt"

)

type Circle struct {

Radius float64

}

// 值接收者方法

func (c Circle) Area() float64 {

return 3.14 * c.Radius * c.Radius

}

// 指针接收者方法

func (c *Circle) Scale(factor float64) {

c.Radius *= factor

}

func main() {

// 创建一个 Circle 的实例

c := Circle{Radius: 5}

// 使用值调用指针接收者的方法

// Go 自动取地址,因此可以直接用值调用

c.Scale(2)

fmt.Println("Scaled Radius:", c.Radius) // 输出: Scaled Radius: 10

// 使用指针调用值接收者的方法

// Go 自动解引用,因此可以直接用指针调用

area := (&c).Area()

fmt.Println("Area:", area) // 输出: Area: 314

}

解释:

1.值调用指针接收者的方法:

  • 当你使用 c.Scale(2) 时,Scale 方法的接收者是一个指针(*Circle),但我们用的是一个值(c)
  • Go 自动将 c 转换为 &c,即取 c 的地址,因此 Scale 方法可以正常执行。

2.指针调用值接收者的方法:

  • 当你使用 (&c).Area() 时,Area 方法的接收者是一个值(Circle),但我们用的是一个指针(&c)
  • Go 自动将 &c 解引用为 *(&c),即获取 c 的值,因此 Area 方法可以正常执行。
相关推荐
_r0bin_3 小时前
前端面试准备-7
开发语言·前端·javascript·fetch·跨域·class
zhang98800003 小时前
JavaScript 核心原理深度解析-不停留于表面的VUE等的使用!
开发语言·javascript·vue.js
恸流失3 小时前
DJango项目
后端·python·django
Fanxt_Ja5 小时前
【JVM】三色标记法原理
java·开发语言·jvm·算法
蓝婷儿5 小时前
6个月Python学习计划 Day 15 - 函数式编程、高阶函数、生成器/迭代器
开发语言·python·学习
love530love5 小时前
【笔记】在 MSYS2(MINGW64)中正确安装 Rust
运维·开发语言·人工智能·windows·笔记·python·rust
Mr Aokey6 小时前
Spring MVC参数绑定终极手册:单&多参/对象/集合/JSON/文件上传精讲
java·后端·spring
slandarer6 小时前
MATLAB | 绘图复刻(十九)| 轻松拿捏 Nature Communications 绘图
开发语言·matlab
狐凄6 小时前
Python实例题:Python计算二元二次方程组
开发语言·python
roman_日积跬步-终至千里6 小时前
【Go语言基础【3】】变量、常量、值类型与引用类型
开发语言·算法·golang