本文go语言入门-掌握go语言函数收录于《go语言学习专栏》专栏,此专栏带你从零开始学习go语言。
在每一种编程语言中都有函数的概念,函数是基本的代码快,用于执行一个任务。
我们之前写的函数代码中,都包含一个main函数:
这个main
就是一个函数的定义,包含了以下几部分:
golang函数特点:
支持:
不支持:
函数的语法格式:
func name( [parameter list] ) [return_types] {函数体
}
在这个语法格式中:
函数的声明包含了一个函数名字,参数列表,返回值列表和函数体四个部分;
func 是声明函数的关键字,类似于我们声明变量要用var
name在这里是函数名字
parameter list:参数列表,参数就像一个占位符,当函数被调用时,你可以将值传递给参数,这个值被称为实际参数。
参数列表中指定了参数的类型,顺序以及参数的个数。
return_types:返回类型,函数返回一列值。return_types 是该列值的数据类型,比如(string ,string)表示返回两个字符串。当然并不是所有的函数都需要返回值。
注意: 如果有多个返回值,需要用括号。
函数体: 代码集合(一般是为了实现一个功能)
package mainimport "fmt"func max(num1, num2 int) int {var result intif num1 > num2 {result = num1} else if num1 < num2 {result = num2} else {result = 0}return result}func main() {ret := max(1, 2)fmt.Println(ret)}
函数的参数和返回值都是可选的,我们可以实现一个既不需要参数也没有返回值的函数:
package mainimport "fmt"
# 创建一个不需要参数也不需要返回值的函数
func sayhi() {fmt.Println("hi,沐风晓月")
}#函数的调用
func main() {sayhi()
}
定义了函数之后,我们可以通过函数名()的方式调用函数:
在上面的例子中,我们调用了sayhi()函数
#函数的调用
func main() {sayhi()
}
在main函数中进行函数的调用,根据函数的类型来赋值。
函数名的定义要求:
在避免冲突的情况下,函数命名要本着精简短小、见文知意的原则:
Go 对参数的处理比较保守,不支持有默认值的可选参数,不支持命名实参,调用时必须按照签名顺序传递指定类型和数量的实参,就算以_
命名的参数也不能忽略。
形参: 函数定义中的参数
实参: 函数调用时所传递的参数
函数的参数中如果相邻变量的类型相同,则可以省略类型,例如:
func test(x,y int ,string,_book)*int{}
package mainfunc intsum(x, y int) int {return x + y
}func main() {ret := intsum(5, 6)print(ret)}
在上面的函数 intsum中,x和y都是int类型,所以 写的是x,y
只加y
后面的一个int,x
位置的int省略。 在intsum(x,y) int
此处的第二个int
,是函数返回值类型.
可变参数是指函数的参数数量不固定。Go语言中的可变参数通过在参数名后加...
来标识。
这里需要主要的是,可变参数通常要作为函数的最后一个参数。
# 此处是可变参数
func intsum(x int, y ...int) int {fmt.Println(x, y)sum := x#函数的可变参数是通过切片来实现的for _, v := range y {sum = sum + v}return sum
}func main() {ret := intsum(5, 6)ret1 := intsum(100)ret2 := intsum(100, 10, 20)fmt.Println(ret, ret1, ret2)}
输出结果:
5 [6]
100 []
100 [10 20]11 100 130
Go语言中通过return
关键字向外输出返回值。
Go语言中函数支持多返回值,函数如果有多个返回值时必须用()将所有返回值包裹起来。
案例一:
package mainimport "fmt"func mufeng(x, y int) (int, int) {sum := x + ysub := x - yreturn sum, sub}func main() {
# 多返回值需要用两个变量来接受k, v := mufeng(40, 50)fmt.Println(mufeng(20, 10))fmt.Println(k, v)
}
执行结果:
30 10
90 -10
案例二:
package mainimport "fmt"func multi() (string, int) {return "沐风晓月", 19
}func main() {name, age := multi()fmt.Println("name:", name, "age:", age)
}
函数定义时可以给返回值命名,并在函数体中直接使用这些变量,最后通过return关键字返回。
在之前的函数中,我们都是只指定类型,比如 int
,实际上我们除了指定类型之外,还可以直接返回值名称。
package mainimport "fmt"func mufeng(x, y int) (sum, sub int) {sum = x + ysub = x - yreturn// 对两个返回值进行了命名,一个是,一个是sub,这时候return后的返回值就可以不写。}
## 函数值接收
func main() {fmt.Println(mufeng(20, 10))// 30 10}
虽然Go语言支持函数返回值命名,但这并不是太常用,可以根据自己的需求情况,酌情选择是否对函数返回值命名。
当我们的一个函数返回值类型为slice时,nil可以看做是一个有效的slice,没必要显示返回一个长度为0的切片。
package mainimport "fmt"func mufeng(x string) []byte {if x == "" {return nil // 此处没有必要返回一个[]byte{}}return []byte(x)}
func main() {arr := mufeng("it")a := mufeng("")fmt.Println(arr)fmt.Println(a)
}
全局变量是定义在函数外部的变量,它在程序整个运行周期内都有效。 在函数中可以访问到全局变量。
package mainimport "fmt"
// 定义全局变量var num int32 = 100func mufeng() {
// 在函数中打印全局变量fmt.Println(num)}func main() {mufeng()
}
局部变量分两种:
如果局部变量和全局变量重名,优先访问局部变量。
package mainimport "fmt"var num int64 = 100func mufeng() {num := 10fmt.Println(num)
}func main() {mufeng()// 最终结果是10
}
可以看到,一开始全局变量是100,局部变量是10,但两个重名,所以最终结果是10,优先访问局部变量。
package mainimport "fmt"func mufeng(x, y int) {fmt.Println(x, y)//函数的参数也是只在本函数中生效if x > 0 {z := 100//变量z只在if语句块生效fmt.Println(z)}//fmt.Println("看看能否打印", z)//此处无法使用变量z}
func main() {mufeng(3, 5)
}
在这个代码中可以看到,在if语句快外面就无法打印变量z了。
匿名函数就是没有名字的函数,也就是没有定义名字符号的函数,这是它与正常函数的主要区别。
而且匿名函数可以直接调用,保存到变量,作为参数和返回值。
我们来看一个案例:
package mainimport "fmt"func main() {
//匿名函数复制给了变量sum2sum2 := func(a, b int) int {return a + b}fmt.Println(sum2(2, 3))
}
这这里变量sum2所对应的值就是一个匿名函数。需要注意的是,这里的sum2只是一个函数类型的变量,并不是函数的名字。
有了匿名函数,就可以在函数中再定义函数(函数嵌套),定义的这个匿名函数也可以被称为内部函数。更重要的是,在函数内定义的内部函数,可以使用外部函数的变量等,这种方式也称为闭包。
举个例子:
package mainimport "fmt"func main() {c1 := colsure()fmt.Println(c1())fmt.Println(c1())fmt.Println(c1())}
func colsure() func() int {i := 0return func() int {i++return i}}
在这里,我们自定义的函数 colsure
可以返回一个匿名函数,并且这个匿名函数持有外部函数colsure的变量i
.因而在main函数中,每调用一次cl(),i的值都会加1。
闭包时函数和引用环境的组合。
go语言学习的资料很多,但符合小白入门的其实比较少,不知道你在学习的过程中有没有这种感觉, 一起加油,冲破壁垒。
💕 好啦,这就是今天要分享给大家的全部内容了,我们下期再见!
💕 本文由沐风晓月原创,首发于CSDN博客, 博客主页:mufeng.blog.csdn.net
💕 每一次学习都很枯燥,单调,孤独,甚至看不到未来,每一次遇到问题都让人疑惑,焦虑,怀疑,甚至想要放弃。 但坚定的走下来,会收获很多。收获的不单单是技术的成长还有一颗强大的心。
💕 喜欢的话记得点赞收藏哦
上一篇:HTML 图像
下一篇:网络作业3【计算机网络】