golang函数返回值,多返回值

本文介绍了Go语言中函数返回多个值的方式以及如何使用命名返回参数。此外,还探讨了Go函数如何处理变参,展示了如何通过传指针来修改原参数的值,以实现多个函数操作同一对象。最后,提到了Go语言中channel、slice和map的传递特性,它们类似于指针行为,可以直接传递。
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这三种类型的实现机制类似指针,所以可以直接传递,而不用取地址后传递指针。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值