package main
import "fmt"
func sumandproduct(A, B int) (int, int) {
return A + B, A * B
}
func main() {
x := 3
y := 4
xPLUSy, xTIMEy := sumandproduct(x, y)
fmt.Printf("%d+%d = %d\n", x, y, xPLUSy)
fmt.Printf("%d*%d =%d\n", x, y, xTIMEy)
}
上面的例子我们可以看到返回了两个参数,当然我们也可以命名返回参数的变量,这个例子里面只是有了两个类型,我们有可以改成如下的定义,然后返回的时候不用带上变量名,因为直接在函数里面初始化了。但你的函数如果是导出的,使用命名返回值,这样代码更加简洁
func sumandproduct(A,B int)(add int ,multiplied int) {
add = A +B
multiplied = A *B
return
}
go函数支持变参,接受变参的函数是有着不定数量的参数的。为了做到这点,首先需要定义函数使其接受参数,
fun myfunc(agr ...int){}
age ...int 告诉go这个函数接受不定数量的参数。注意,这些参数类型全部都是int
for _,n := range arg {
fmt.printf("And the number is : %d\n",n)
}
传真与传指针
当我们传一个参数值到被调用函数里面时,实际上传了这个值的一份copy,当在被调用函数中修改参数值的时候,调用函数中相应实参不会发生任何变化,
package main
import "fmt"
func add1(a int) int {
a = a + 1
return a
}
func main() {
x := 3
fmt.Println("x = ", x)
x1 := add1(x)
fmt.Println("x+1 =", x1)
fmt.Println("x =", x)
}
虽然我们调用了add1函数,并且在add1中执行a = a+1 操作,但是上面例子中X变量的值没有发生变化。
因为当我们调用add1的时候,add1接受的参数其实是X的copy,而不是x本身
如果需要改X本身的值,这就牵扯到了所谓的指针,我们知道,变量在内存中是存在于一定地址上的,修改变量实际是修改变量地址出的内存。只有add1函数知道X变量所在的地址,才能修改X变量的值,所以我们需要将X所在地址&x存入函数,并将函数的参数类型有int改为*int ,即改为指针类型,才能在函数中修改X变量的值,此时参数仍然是按copy传递的。
package main
import "fmt"
func add1(a *int) int {
*a = *a + 1
return *a
}
func main() {
x := 3
fmt.Println("x =", x)
x1 := add1(&x)
fmt.Println("x+1=", x1)
fmt.Println("x =", x)
}
传指针使的多个函数能操作同一个对象
传指针比较轻量级,只是传内存地址,我们可以用指针传递体积打的结构体,如果用参数值传递的话,在每次copy上面就会花费相对较多的系统开销,所以当传递大的结构体的时候,用指针是一个明智的选择
go语言中的channel,slice,map这三种类型的实现机制类似指针,所以可以直接传递,而不用取地址后传递指针。
本文介绍了Go语言中函数返回多个值的方式以及如何使用命名返回参数。此外,还探讨了Go函数如何处理变参,展示了如何通过传指针来修改原参数的值,以实现多个函数操作同一对象。最后,提到了Go语言中channel、slice和map的传递特性,它们类似于指针行为,可以直接传递。

187

被折叠的 条评论
为什么被折叠?



