Golang 开发实战day14 - 接收者函数与指针

  在 Golang 中,接收者函数是一种强大的工具,可以让我们更灵活地定义方法,提高代码的简洁性和可维护性。而指针则是 Golang 中另一种重要的概念,用于指向内存中的数据。当我们将接收者函数与指针结合使用时,我们可以获得更加强大的功能和灵活性。

1. 接收者函数与指针的基本概念

  接收者函数: 接收者函数是一种与结构体或接口相关联的一组函数,用于对该类型的数据进行操作。

接收者函数的语法如下:

1.1 接收者函数

func (receiver TypeName) methodName(parameters) {
    // 方法体
}

1.2 指针

  指针是指向内存地址的变量。使用指针可以访问和修改内存中的数据。指针的声明语法如下:

var pointerType *TypeName
pointerType := &variable

1.3 接收者函数与指针的结合

  我们可以在接收者函数的参数中使用指针类型,这样就可以直接修改结构体本身的数据,而不是副本。

2. 接收者函数与指针的优点

  • 提高效率: 使用指针可以避免值的复制,提高代码的运行效率。
  • 修改结构体数据: 可以直接修改结构体本身的数据,而不是副本。
  • 简洁易读: 代码更加简洁易读,易于理解。

3. 接收者函数与指针的示例代码

3.1 示例一、x, y轴移动

type Point struct {
    x int
    y int
}

func (p *Point) Move(dx int, dy int) {
    p.x += dx
    p.y += dy
}

func (p Point) String() string {
    return fmt.Sprintf("(%d, %d)", p.x, p.y)
}

func main() {
    point := Point{x: 10, y: 20}
    pointPtr := &point 			// 获取 point 的指针

    pointPtr.Move(5, 10) 		// 使用指针调用 Move 方法
    fmt.Println(point) 			// 输出 (15, 30)
    fmt.Println(pointPtr.String()) // 输出 (15, 30)
}

Output:
Golang 开发实战day14 - Reciver Functions with Pointers-LMLPHP

3.2 示例二 修改年龄

type Person struct {
	Name string
	Age  int
}

func (p *Person) SetAge(newAge int) {
	p.Age = newAge
}

func main(){
	person := Person{Name: "大雄", Age: 10}
    personPtr := &person

    personPtr.SetAge(40) // 使用指针调用 SetAge 方法
    fmt.Println(person.Age) // 输出 40(别问,问就是大雄经过时光机变中年人了)
}

Output:
Golang 开发实战day14 - Reciver Functions with Pointers-LMLPHP

3.3 示例三 匿名函数与函数指针结合

type MyString string

func (s *MyString) ToUpper() *MyString {
    // 利用匿名函数和strings.Map进行高效转换
		uppercase := strings.Map(func(r rune) rune {
			if r >= 'a' && r <= 'z' {
				return r - 32 // 使用 ASCII 差异有效地将小写转换为大写
			}
			return r // 保持其他字符不变
		}, string(*s))
		// 将转换后的字符串分配给 MyString 的基础值
		*s = MyString(uppercase)
    return s
}
func main(){
	str := MyString("hello , doraemon!")
	strPtr := &str

	strPtr.ToUpper() // 使用指针调用 ToUpper 方法
	fmt.Println(*strPtr)
}
HELLO , DORAEMON!

总结

  总之,接收者函数与指针是 Golang 中强大的工具,可以让我们更灵活地操作结构体数据,提高代码的效率和可读性。理解和掌握接收者函数与指针的使用技巧,可以帮助你写出更加优雅、高效的 Golang 代码。

05-12 02:28