包的引入实践
项目目录列表
- go mod 的方式
import (
"项目名称/包名" // 文件夹名称作为包名
)
函数
函数是第一等公民,可作为参数传递。将复杂的函数签名定义为函数类型。
type Operation func(int, int) int
func add(x, y int) int {
return x + y
}
func subtract(x int, y int) int {
return x - y
}
func calculate(x int, y int, op Operation) int {
return op(x, y)
}
func main() {
a, b := 10, 5
// 使用加法操作
result1 := calculate(a, b, add)
fmt.Println("Addition Result:", result1)
// 使用减法操作
result2 := calculate(a, b, subtract)
fmt.Println("Subtraction Result:", result2)
}
值传递&引用传递
Go语言中,函数参数传递有两种方式:值传递和引用传递。
- 值传递:函数调用时,将实际参数的值复制一份传递给函数,这样在函数中对参数所做的修改不会影响到实际参数。
package main
import "fmt"
type Person struct {
Name string
Age int
}
func modifyPerson(p Person) {
p.Name = "Alice"
p.Age = 25
}
func main() {
p := Person{Name: "Bob", Age: 30}
modifyPerson(p)
fmt.Println(p) // 输出: {Bob 30}
}
- 分析 modifyPerson 函数,参数 p接收到的是Person结构体的副本,因此在函数内部修改p的属性并不会影响到外部的p。
- 引用传递:函数调用时,将实际参数的地址传递给函数,这样在函数中对参数所做的修改会影响到实际参数。
package main
import "fmt"
type Person struct {
Name string
Age int
}
func modifyPerson(p *Person) {
p.Name = "Alice"
p.Age = 25
}
func main() {
p := Person{Name: "Bob", Age: 30}
modifyPerson(&p) // 传递的是指针
fmt.Println(p) // 输出: {Alice 25}
}
注意事项
-
值传递&引用传递
-
函数类型
-
闭包函数中外部变量的传递-引用传递
-
defer 延迟调用
-
函数与方法的区别
- 方法
- 方法是与特定类型关联的函数,是类型的一个成员
- 第一个参数是接收者,即调用该方法的对象
- 方法
-
方法的调用
- 结构体实例调用方法
type Person struct { Name string Age int } func (person *Person) Greet() { fmt.Println("Hello, my name is", person.Name) } func main() { p := Person{Name: "Alice", Age: 25} p.Greet() // 调用方法 }- 类型调用方法
type Person struct { Name string Age int } func (person Person) Greet() { fmt.Println("Hello, my name is", person.Name) } func main() { p := Person{Name: "Bob", Age: 30} Person.Greet(p) // 调用方法 }注意:
- 结构体实例调用方法时,需要在实例上调用方法,即
p.Greet() - 类型调用方法时,需要在类型上调用方法,即
Person.Greet(p) - 区别:结构体实例调用方法时,需要在实例上调用,而类型调用方法时,需要在类型上调用。
- 区别:结构体实例调用方法时,需要在实例上调用,而类型调用方法时,需要在类型上调用。 type type