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:
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:
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 代码。