定义与调用
我们以一个求两数之和的函数例子,比较一下Java和Go在函数定义方面的不同之处。
Java代码:
int add(int a, int b) {
return a + b
}
Go代码:
func add(a int, b int) int {
return a + b
}
我们可以看到,Java把返回值的类型放在函数名前,而Go则将它放在了后面,除此之外,参数列表中形参名称和形参类型的前后顺序也不同。
而在函数调用时,Go与Java的语法差不多。
var sum = add(1, 2)
允许多返回值
如果想要一个函数有多个返回值的话,只需要把返回值的部分修改一下就可以。
func getMaxAndMin(a int, b int) (int, int) {
if a < b {
return b, a
} else {
return a, b
}
}
调用时,需要同时获取到所有的返回值。
var max, min int
max, min = getMaxAndMin(5, 9)
有时候,我们只需要得到其中的一个值,比如如果想要得到两个数的最大值,如果还按照上述的写法,那么最小值变量便不会被使用到,这在Go中是不被允许的。
var max int
max, _ = getMaxAndMin(5, 9)
像这样,我们把最小值赋给了一个名为“_”的变量,于是程序就不会报错了。
我们也可以给返回值一个名称,这样的话,在程序最后,系统会自动返回这些值。
func getMaxAndMin(a int, b int) (max int, min int) {
if a < b {
max, min = b, a
} else {
max, min = a, b
}
return
}
当数组成为参数时
在Go语言中,向方法中传递的数组并不是一个指向原数组第一个元素的指针,而是一个新的数组。也就是说,这是值传递而非地址传递。
package main
import "fmt"
func main() {
var a = [6]int{1, 2, 3}
var b = change(a)
fmt.Println(a)
fmt.Println(b)
}
func change(a [6]int) ([6]int) {
a[0] = 0
return a
}
运行上传程序,我们发现两个数组中的值不同。
[1 2 3 0 0 0]
[0 2 3 0 0 0]
值得注意的是,在形参中,我们标明了数组长度,如果此时我们将一个长度不同的数组当做参数传入该函数,那么系统会认为这个数组的数据类型与参数类型不同,导致程序报错。
# command-line-arguments
.\main.go:7:16: cannot use a (type [7]int) as type [6]int in argument to change
如果想要直接修改原数组的话,就不能通过值传递了,而是通过传进原数组的地址。
package main
import "fmt"
func main() {
var a = [6]int{1, 2, 3}
change(&a)
fmt.Println(a)
}
func change(a *[6]int) {
(*a)[0] = 0
}
运行该程序,我们发现原数组确实改变了。
[0 2 3 0 0 0]