5. Go 方法(结构体的方法成员)

Go语言没有传统的 class ,为了让函数和结构体能够关联,Go引入了“方法”的概念。

当普通函数添加了接收者(receiver)后,就变成了方法。

一、函数和方法示例

// 普通函数
func Check(s string) string {
	return s
}

// 方法,有了Receiver变成方法类型
func (Receiver) Check(s string) string {
	return s
}

二、方法使用

package main

import "fmt"

type Address struct {
	City string
}

type Person struct {
	Name    string
	Age     int
	Address // 匿名成员,类型嵌入
}

// 普通函数
func Check(s string) string {
	return s
}

// 带有指针接收者的方法
func (p *Person) init(s string) {
	p.Name = s
	p.Age = 19
}

func main() {
	// 创建一个指针类型的 Person 实例
	p1 := &Person{}
	p1.init("xinglujianzhi") // p1.init  //所属关系,init方法属于p1的类型
	// 打印 Person 实例
	fmt.Println(*p1) // 解引用 p1 打印其值
}

三、总结

在 Go 中,无论接收者是值类型还是指针类型,都可以通过实例(值)或指针来调用方法。Go 通过语法糖来简化调用方式,但内部的处理还是要根据接收者的类型来确定。

  • 接收者是值类型 (p1)
    • 如果接收者是值类型 p1,那么方法调用时,会将实例的副本传递给方法。这意味着方法内对接收者字段的修改不会影响原始实例。
  • 接收者是指针类型 (*p1)
    • 如果接收者是指针类型 *p1,则方法调用时传递的是实例的地址(指针)。方法内对接收者的修改会直接影响原始实例。

语法糖:

Go 提供了语法糖,即你可以用值来调用指针类型的接收者方法,反之亦然。Go 会自动为你进行地址的转换(即自动取指针或解引用)。

posted @ 2025-02-23 13:35  fanhongtao  阅读(0)  评论(0)    收藏  举报  来源