函数定义
函数定义
在
// 具名函数
func Add(a, b int) int {
return a+b
}
// 匿名函数
var Add = func(a, b int) int {
return a+b
}
参数
不定参数
// 多个参数和多个返回值
func Swap(a, b int) (int, int) {
return b, a
}
// 可变数量的参数
// more 对应 []int 切片类型
func Sum(a int, more ...int) int {
for _, v := range more {
a += v
}
return a
}
当可变参数是一个空接口类型时,调用者是否解包可变参数会导致不同的结果:
func main() {
var a = []interface{}{123, "abc"}
Print(a...) // 123 abc
Print(a) // [123 abc]
}
func Print(a ...interface{}) {
fmt.Println(a...)
}
切片传递
func twice(x []int) {
for i := range x {
x[i] *= 2
}
}
type IntSliceHeader struct {
Data []int
Len int
Cap int
}
func twice(x IntSliceHeader) {
for i := 0; i < x.Len; i++ {
x.Data[i] *= 2
}
}
因为切片中的底层数组部分是通过隐式指针传递
返回值
多值返回
func (file *File) Write(b []byte) (n int, err error)
正如文档所述,它返回写入的字节数,并在 n != len(b)
时返回一个非
多值返回的一个常用场景,就是在会引发错误的方法上,往往最后一个出参的类型为
可命名结果形参
func Find(m map[int]int, key int) (value int, ok bool) {
value, ok = m[key]
return
}
如果返回值命名了,可以通过名字来修改返回值,也可以通过
func Inc() (v int) {
defer func(){ v++ } ()
return 42
}
当返回值得类型不同时,
func (n *Node) Parent1() *Node
func (n *Node) Parent2() (*Node, error)
// 优于
func (n *Node) Parent1() (node *Node)
func (n *Node) Parent2() (node *Node, err error)
当返回值中包含相同类型的出参时,命名返回值可以提高代码的可读性,例如:
// Location returns f's latitude and longitude.
// Negative values mean south and west, respectively.
func (f *Foo) Location() (lat, long float64, err error)
当方法行数较少时,可以使用