在编程中,值接收者和指针接收者是函数或方法参数的两种不同传递方式。它们之间的区别如下:
package main
import "fmt"
// 定义结构体
type Person struct {
Name string
Age int
}
// 定义方法
func (p Person) PrintInfo() {
p.Age = 25
}
func main() {
person := Person{Name: "Alice", Age: 20}
person.PrintInfo()
fmt.Println(person.Age)
}
在上述示例中,PrintInfo()方法是值接收者。当调用该方法时,person的值被复制到方法内部。即使在方法内部修改了p.Age的值,原始的person.Age并不会改变。
package main
import "fmt"
// 定义结构体
type Person struct {
Name string
Age int
}
// 定义方法
func (p *Person) PrintInfo() {
p.Age = 25
}
func main() {
person := Person{Name: "Alice", Age: 20}
person.PrintInfo()
fmt.Println(person.Age)
}
在上述示例中,PrintInfo()方法是指针接收者。当调用该方法时,&person的地址被传递到方法内部。通过修改指针所指向的内容,原始的person.Age的值也会改变。
在 Go 语言中,方法是与特定类型关联的函数,它是一种将数据和相关操作封装在一起的方式。方法可以定义在结构体类型上,使得对结构体的操作更加方便和自然。
接收者类型.方法名(参数列表) (返回值列表)
func (p Person) PrintInfo(num int) (num){}
其中,接收者类型是方法所属的类型,通常是一个结构体或接口类型。方法名是方法的名称,可以根据需要自行定义。参数列表是方法接受的参数,可以包含零个或多个参数。返回值列表是方法返回的结果,可以包含零个或多个返回值。
2. 以下是一个示例,定义了一个名为PrintInfo的方法在Person结构体上:
package main
import "fmt"
// 定义结构体
type Person struct {
Name string
Age int
}
// 定义方法
func (p Person) PrintInfo() {
fmt.Println("Name:", p.Name)
fmt.Println("Age:", p.Age)
}
在这个示例中,PrintInfo方法接受一个Person类型的接收器,并打印出该结构体的姓名和年龄。
接收者.方法名(参数)
package main
import "fmt"
func main() {
// 创建结构体实例
p := Person{Name: "Alice", Age: 25}
// 调用方法
p.PrintInfo()
}
通过这种方式,我们可以将数据和相关操作封装在一起,提高代码的可读性和可维护性。
除了普通方法,Go 语言还支持指针接收器方法和接口方法。指针接收器方法可以通过指针修改接收者的字段值,而接口方法允许实现了特定接口的任意类型对象调用该方法。
package main
import (
"fmt"
"math"
)
//接口声明(形状)
type Shape interface {
Area() float64
Perimeter() float64
}
//矩形结构体
type Rect struct {
width float64
height float64
}
//圆的结构体
type Circle struct {
radius float64
}
//计算面机的方法(矩形实现)
func (r Rect) Area() float64 {
return r.width * r.height
}
//计算周长(矩形实现)
func (r Rect) Perimeter() float64 {
return 2 * (r.width + r.height)
}
//计算面积的方法(圆实现)
func (c Circle) Area() float64 {
return math.Pi * c.radius * c.radius
}
//计算周长(圆实现)
func (c Circle) Perimeter() float64 {
return 2 * math.Pi * c.radius
}
func main() {
//声明接口类型的变量,具体值为矩形
var s Shape = Rect{10, 3}
fmt.Printf("type of s is %T\n", s)
fmt.Printf("value of s is %v\n", s)
fmt.Printf("value of s is %0.2f\n\n", s.Area())
//声明接口类型的变量,具体值为圆
s = Circle{10}
fmt.Printf("type of s is %T\n", s)
fmt.Printf("value of s is %v\n", s)
fmt.Printf("value of s is %0.2f\n", s.Area())
}
在 Go 语言中,函数是一种用于组织和重用代码的基本单位。函数可以执行特定的任务,并可以接受零个或多个参数,并返回零个或多个值。
以下是 Go 语言中函数的一些关键特性和语法:
func functionName(parameters) results {
// 函数体
}
functionName(arguments)
func functionName() results {
// 返回值
return values
}
func() {
// 匿名函数体
}
函数作为参数:Go 语言允许将函数作为参数传递给其他函数。
递归函数:函数可以递归地调用自己。
Go 语言中的函数是第一类对象,可以作为变量、参数和返回值进行传递和操作。这使得函数在 Go 语言中具有高度的灵活性和可复用性。
此外,go中还有 一等函数和闭包的概念,这边先不做解释