坚持就是胜利,今天参加了学院的冬至饺子文化节活动~
今天主要学习函数,练习代码如下:
package main
import (
"errors"
"fmt"
"strconv"
)
func main() {
fmt.Println("Happy Day7!")
//1、定义,简单求和函数
a, b := 1, 2
c := GetSum(a, b)
fmt.Println(c)
//2、值传递:函数调用过程中将实参拷贝一份到函数中,这样在函数中 如果对参数进行修改,将不会影响到实参。
//2、引用传递:函数调用过程中将实参的地址传递到函数中,那么在函数 中对参数所进行的修改,将影响到实参。
x := 1
y := 1
z := []int{1,2,3}
paramFunc(x,&y,z)
fmt.Println("main:")
fmt.Println(x)
fmt.Println(y)
fmt.Println(z)
//3、变长参数(变长参数必须放在函数参数的最后一个,否则会报错。)
sum(1)
sum(1,2,3)
//4、多返回值(通过返回结果与一个错误值,这样可以使函数的调用者很方便的知道函数是否执行成功,这样的模式也被称为command,ok模式)
result, err := div(1,2)
if err != nil{
fmt.Printf("error: %v", err)
return
}
fmt.Println("result: ", result)
//5、命名返回值(可以给返回值命名,当需要返回的时候,我们只需要一条简单的不带参数的return语句。我们将上面那个除法的函数修改一下)
result2, err2 := div2(1,2)
if err2 != nil{
fmt.Printf("error: %v", err2)
return
}
fmt.Println("result: ", result2)
//6、匿名函数(一个没有名字的函数,除了没有名字外其他地方与正常函数相同。匿名函数可以直接调用,保存到变量,作为参数或者返回值。)
f := func() string {
return "hello world"
}
fmt.Println(f())
//7、闭包(闭包可以解释为一个函数与这个函数外部变量的一个封装。粗略的可以理解为一个类,类里面有变量和方法,其中闭包所包含的外部变量对应着类中的静态变量。)
f1 := add()
fmt.Println(f1(1))
fmt.Println(f1(2))
f2 := add()
fmt.Println(f2(1))
fmt.Println(f2(2))
f1 = add()
fmt.Println(f1(1))
fmt.Println(f1(2))
}
//1、函数定义
func GetSum(num1 int, num2 int)int{
result := num1 + num2
return result
}
//2、值传递和引用传递
func paramFunc(a int, b *int, c []int){
a = 100
*b = 100
c[1] = 100
fmt. Println("paramFunc:")
fmt.Println(a)
fmt.Println(*b)
fmt.Println(c)
}
//3、变长参数
func sum(nums ...int){
fmt.Print(nums, " ")
total := 0
for _, num := range nums{
total += num
}
fmt.Println(total)
}
//4、多返回值
func div(a, b float64)(float64, error){
if b == 0{
return 0, errors.New("The divisior cannot be zero.")
}
return a / b, nil
}
//5、命名返回值
func div2(a, b float64)(result float64, err error){
if b==0{
return 0, errors.New("被除数不能为0")
}
result = a/b
return //注意 return 语句没有指定任何返回值。因为在函数声明时已经指定 result 和 err 是返回值,在遇到 return 语句时它们会自动从函数中返回。
}
//7、闭包
func add() func(int)int{
n := 10
str := "string"
return func(x int)int{
n += x
str += strconv.Itoa(x)
fmt.Print(str, " ")
return n
}
}