在Go语言中,函数使用 func
关键字定义。函数的定义包含函数名、参数列表、返回值类型和函数体。以下是一个简单的函数定义和调用示例:
package main
import "fmt"
// 定义一个简单的加法函数
func add(a int, b int) int {
return a + b
}
func main() {
result := add(3, 4)
fmt.Println("3 + 4 =", result) // 输出: 3 + 4 = 7
}
在这个示例中,add
函数接收两个整型参数,并返回它们的和。在 main
函数中,我们调用 add
函数并打印结果。
Go语言支持多种方式定义函数参数和返回值,包括命名返回值和多返回值。以下是几个示例:
func subtract(a int, b int) (result int) {
result = a - b
return
}
func divide(a int, b int) (int, error) {
if b == 0 {
return 0, fmt.Errorf("division by zero")
}
return a / b, nil
}
func main() {
quotient, err := divide(10, 2)
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println("10 / 2 =", quotient) // 输出: 10 / 2 = 5
}
}
可变参数函数允许传入不定数量的参数。可变参数使用 ...
语法定义。以下是一个示例:
func sum(nums ...int) int {
total := 0
for _, num := range nums {
total += num
}
return total
}
func main() {
result := sum(1, 2, 3, 4, 5)
fmt.Println("Sum:", result) // 输出: Sum: 15
}
匿名函数没有名字,可以直接定义和调用。闭包是能够捕获外部变量的匿名函数。以下是示例:
func main() {
// 定义并调用匿名函数
result := func(a int, b int) int {
return a + b
}(3, 4)
fmt.Println("Anonymous function result:", result) // 输出: Anonymous function result: 7
// 闭包示例
adder := func(x int) func(int) int {
return func(y int) int {
return x + y
}
}
addFive := adder(5)
fmt.Println("5 + 3 =", addFive(3)) // 输出: 5 + 3 = 8
}
方法是附加到特定类型上的函数。定义方法时需要指定接收者。以下是一个示例:
package main
import "fmt"
// 定义一个结构体
type Rectangle struct {
width, height int
}
// 定义一个方法,计算矩形的面积
func (r Rectangle) area() int {
return r.width * r.height
}
func main() {
rect := Rectangle{width: 10, height: 5}
fmt.Println("Area:", rect.area()) // 输出: Area: 50
}
方法集是指与类型相关联的所有方法。Go语言中的方法接收者可以是值类型或指针类型。以下是示例:
func (r Rectangle) perimeter() int {
return 2 * (r.width + r.height)
}
func (r *Rectangle) scale(factor int) {
r.width *= factor
r.height *= factor
}
func main() {
rect := Rectangle{width: 10, height: 5}
rect.scale(2)
fmt.Println("Scaled rectangle area:", rect.area()) // 输出: Scaled rectangle area: 200
}
Go语言不支持方法的重载,但可以通过不同的方法名实现类似功能。方法覆盖指的是类型的方法可以覆盖其嵌入类型的方法。以下是示例:
package main
import "fmt"
type Base struct{}
func (Base) describe() {
fmt.Println("Base")
}
type Derived struct {
Base
}
func (Derived) describe() {
fmt.Println("Derived")
}
func main() {
var d Derived
d.describe() // 输出: Derived
}
我们将构建一个简单的图形计算项目,演示如何使用函数和方法。项目包含两个主要功能:计算矩形和圆的面积与周长。
项目结构:
geometry/
├── main.go
├── rectangle.go
└── circle.go
package main
import (
"fmt"
"geometry/rectangle"
"geometry/circle"
)
func main() {
r := rectangle.Rectangle{Width: 10, Height: 5}
fmt.Println("Rectangle area:", r.Area())
fmt.Println("Rectangle perimeter:", r.Perimeter())
c := circle.Circle{Radius: 7}
fmt.Println("Circle area:", c.Area())
fmt.Println("Circle circumference:", c.Circumference())
}
package rectangle
// Rectangle 结构体
type Rectangle struct {
Width, Height int
}
// 计算矩形面积的方法
func (r Rectangle) Area() int {
return r.Width * r.Height
}
// 计算矩形周长的方法
func (r Rectangle) Perimeter() int {
return 2 * (r.Width + r.Height)
}
package circle
import "math"
// Circle 结构体
type Circle struct {
Radius float64
}
// 计算圆面积的方法
func (c Circle) Area() float64 {
return math.Pi * c.Radius * c.Radius
}
// 计算圆周长的方法
func (c Circle) Circumference() float64 {
return 2 * math.Pi * c.Radius
}
在实际应用中,我们可以通过以下几种方式优化函数和方法的性能:
)和恢复(recover)。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。