函数
函数是结构化编程中最小的模块单元,日常开发过程中,将复杂的算法过程分解为若干个小任务(代码块),使程序的结构性更清晰,程序可读性提升,易于后期维护和让别人读懂你的代码。编写多个函数的主要目的是将一个需要很多行代码的复杂问题分解为一系列简单的任务(那就是函数)来解决。在实际编程中,我们把重复性的任务抽象成一个函数。
和所有的编程语言一样,Go语言支持各种风格的函数。在Go语言中,当函数执行到代码块最后一行}之前或者return语句的时候会退出,其中 return 语句可以带有零个或多个参数;这些参数将作为返回值供调用者使用。简单的 return 语句也可以用来结束 for 死循环,或者结束一个Go协程(goroutine)。
定义语法
Go语言中函数基本组成:关键字func、函数名、参数列表、返回值、函数体和返回语句。
语法如下:
func 函数名(参数列表) (返回值列表) {
// 函数体
}
这里需要强调的是,Go语言函数的返回值类型和变量定义的数据类型一样,都要遵循Go语言的“后置原则”放在后面,这一点和C语言函数定义有显著不同。
另外,Go语言函数定义中如果参数列表中若干个相邻参数的类型相同,则可以在参数列表中省略前面的变量类型声明。
func Add(a, b int) int { //这里a和b都是int类型
// 函数体
}
最后,Go语言函数定义中左花括号的位置被强制规范,如果左花括号放置不规范,golang编译器会报编译错误。
//错误!!!左括号必须紧跟在括号后面
func hello()
{ //左括号不能另起一行
}
多值返回
Go语言的函数可以返回不止一个结果,即支持“多值返回”。
Go语言函数多值返回一般用于处理错误。比如在IO操作时候,不一定每次都能成功:可能文件不存在或者磁盘损坏无法读取文件。所以一般在函数调用发生错误时返回一个附加的结果作为错误值,习惯上将错误值作为最后一个结果返回。
func SumProductDiff(i, j int) (int, int, int) {
return i+j, i*j, i-j
}
不定参数
如果你对Python比较熟悉,你会知道Python函数参数个数可以是不确定的。和Python类似,Go语言函数也支持可变的参数个数。
在参数列表的最后类型名称前面使用省略号“…”来表示声明一个变长函数,调用该函数的时候可以传递该类型任意数目的参数。
func 函数名(args ...Type) (返回值列表) {
// 函数体
}
函数调用
package main
import "fmt"
func main() {
/* 定义局部变量 */
var a int = 100
var b int = 200
var ret int
/* 调用函数并返回最大值 */
ret = max(a, b)
fmt.Printf( "最大值是 : %d\n", ret )
}
/* 函数返回两个数的最大值 */
func max(num1, num2 int) int {
/* 定义局部变量 */
var result int
if (num1 > num2) {
result = num1
} else {
result = num2
}
return result
}
最大值是 : 200
示例
package main
import(
"fmt"
)
func Add(i int, j int) (int) { //常规函数
return i+j
}
func Add_Multi_Sub(i, j int) (int, int, int) { //多值返回
return i+j, i*j, i-j
}
func sum(nums ...int) { //变参函数
total := 0
for _, num := range nums {
total += num
}
fmt.Println(total)
}
func main(){
a, b := 2,3
arr := []int{1, 2, 3}
var c int = Add(a,b)
fmt.Println("-----------------------")
d,e,f := Add_Multi_Sub(a,b)
fmt.Println("-----------------------")
fmt.Println(c,d,e,f)
fmt.Println("-----------------------")
fmt.Println("\n")
sum(arr...) //注意传参形式
}
结果
杨辉三角
package main
import "fmt"
//行数
const LINES int = 10
// 杨辉三角
func ShowYangHuiTriangle() {
nums := []int{}
for i := 0; i < LINES; i++ {
//补空白
for j := 0; j < (LINES - i); j++ {
fmt.Print(" ")
}
for j := 0; j < (i + 1); j++ {
var length = len(nums)
var value int
if j == 0 || j == i {
value = 1
} else {
value = nums[length-i] + nums[length-i-1]
}
nums = append(nums, value)
fmt.Print(value, " ")
}
fmt.Println("")
}
}
func main() {
ShowYangHuiTriangle()
}
乘法表
package main
import (
"fmt"
"strconv"
)
func add(a, b int) int {
return a + b
}
func multiplicationTable() {
for i := 1; i <= 9; i++ {
for j := 1; j <= i; j++ {
var ret string
if i*j < 10 && j != 1 {
ret = " " + strconv.Itoa(i*j)
} else {
ret = strconv.Itoa(i * j)
}
fmt.Print(j, " * ", i, " = ", ret, " ")
}
fmt.Print("\n")
}
}
func main() {
multiplicationTable()
}