网站首页 > 文章精选 正文
引言
在 Go 语言中,函数可以通过参数传递数据。理解参数是如何传递的对于编写正确的程序至关重要。
1. 值传递
- 基本类型参数:
- 当你将基本类型(如 int, float64, string 等)作为参数传递给函数时,实际上是在函数内部创建了一个该值的副本。
- 修改函数内的参数不会影响原始值。
- 示例:
func increment(x int) int {
x++
return x
}
func main() {
var x int = 10
x = increment(x)
fmt.Println("Value after increment:", x)
}
- 复合类型参数:
- 当你将复合类型(如数组、切片、映射、结构体等)作为参数传递给函数时,也会创建一个值的副本。
- 但是,对于切片、映射和通道,传递的是指向这些数据结构的引用,因此可以在函数内部修改这些数据结构。
- 示例:
func appendElement(slice []int, element int) []int {
return append(slice, element)
}
func main() {
var s []int = []int{1, 2, 3}
s = appendElement(s, 4)
fmt.Println("Slice after appending:", s)
}
2. 引用传递
- 指针参数:
- 为了修改复合类型的原始值,你可以传递指向这些类型的指针。
- 示例:
func incrementPointer(x *int) {
*x++
}
func main() {
var x int = 10
incrementPointer(&x)
fmt.Println("Value after increment (using pointer):", x)
}
- 结构体指针:
- 当你需要修改结构体的字段时,也可以传递结构体的指针。
- 示例:
type Person struct {
Name string
Age int
}
func updateAge(p *Person) {
p.Age++
}
func main() {
p := &Person{"Alice", 30}
updateAge(p)
fmt.Println("Age after update:", p.Age)
}
3. 可变参数
- 可变参数:
- 使用 ... 符号可以定义接受可变数量参数的函数。
- 在函数内部,这些参数会被收集到一个切片中。
- 示例:
func sum(numbers ...int) int {
total := 0
for _, number := range numbers {
total += number
}
return total
}
func main() {
result := sum(1, 2, 3, 4, 5)
fmt.Println("Sum:", result)
}
4. 示例代码
package main
import (
"fmt"
)
// 值传递示例
func increment(x int) int {
x++
return x
}
// 切片参数示例
func appendElement(slice []int, element int) []int {
return append(slice, element)
}
// 指针参数示例
func incrementPointer(x *int) {
*x++
}
// 结构体指针示例
type Person struct {
Name string
Age int
}
func updateAge(p *Person) {
p.Age++
}
// 可变参数示例
func sum(numbers ...int) int {
total := 0
for _, number := range numbers {
total += number
}
return total
}
func main() {
// 值传递
var x int = 10
x = increment(x)
fmt.Println("Value after increment:", x)
// 切片参数
var s []int = []int{1, 2, 3}
s = appendElement(s, 4)
fmt.Println("Slice after appending:", s)
// 指针参数
incrementPointer(&x)
fmt.Println("Value after increment (using pointer):", x)
// 结构体指针
p := &Person{"Alice", 30}
updateAge(p)
fmt.Println("Age after update:", p.Age)
// 可变参数
result := sum(1, 2, 3, 4, 5)
fmt.Println("Sum:", result)
}
猜你喜欢
- 2025-07-14 Go并发编程之WaitGroup(go语言 并发)
- 2025-07-14 golang企业微信告警(企业微信告警推送)
- 2025-07-14 2.8 Go语言中的for循环,break和continue
- 2025-07-14 Go语言Context包:最常用包之一的使用指南
- 2025-07-14 Go语言零到一:动态数组——切片(go语言的切片)
- 2025-07-14 2025-06-26:转换数组。用go语言,给你一个整数数组 nums,它被视
- 2025-07-14 go sync.Pool简介(go system)
- 2025-07-14 2025-07-13:统计特殊子序列的数目。用go语言,给定一个只包含正
- 2025-07-14 Go语言数据库编程:GORM 的基本使用
- 2025-07-14 2025-06-28:长度可被 K 整除的子数组的最大元素和。用go语言,给
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)
- mysql数据库面试题 (57)
- fmt.println (52)