开发者学堂课程【Go 语言核心编程 - 基础语法、数组、切片、Map :函数课堂练习】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/625/detail/9604
函数课堂练习
一、函数注意事项和细节讨论
1、课堂练习题:
(1) 习题1:
func sum(n1, n2 float32 ) float32 {
fmt.Printf("n1 type = %T\n", n1)
//n1 type = float32
return n1+n2
}
func main() {
fmt.Println("sum=", sum(1,2))// sum = 3
}
问:题1的代码有无错误,它输出什么?
解:代码无错误,输出 sum = 3。
习题解析:
main 函数中调用 sum(1,2) 在 sum 中调用形参 n1,n2 float32,返回一个 float32,这种用法与定义多个变量的用法是相同的。如果 n1 和 n2 的数据类型相同的话,n1后面的数据类型可以省略,只需在最后写上数据类型即可。在这道习题中 n1和 n2都为 float32 的数据类型,本题输出的是n1的数据类型是什么,再返回 n1+n2 的值。输出的是 n1,返回的 n1+n2=3。
(2) 习题2:
type mySum func (int, int) int
func sum(n1 int, n2 int) int {
return n1+n2
}
func sum2(n1, n2, n3 int) int {
return n1+n2
}
//使用type自定义数据类型来简化定义
func myFunc(funcVar mySum,num1 int,num2 int) int{
return funcVar(num1, num2)
}
func main(){
a := sum
b := sum2
fmt.Println(myFunc(a,1,2)
//
ok
fmt.Println(myFunc(b,1,2))
//
error
}
问:题2:代码有无错误,为什么?
解:fmt.Println(myFunc(b,1,2) 错误,原因是类型不匹配。因为不能把 func sum2(n1, n2, n3 int) int这种函数类型赋给 func (int, int) int。只能接受2个形参而给了3个,类型不匹配。
习题解析:
把 sum 函数给 a 变量,sum2 给 b 变量,调用 myFunc(a,1,2)函数。mySum是一个自定义类型,有两个 int 的形参然后返回一个 int 。本题中把 sum 赋给了mySum 函数类型,myFunc b 中函数类型给了 myFunc ,但是 b 是 sum2,mySum接收的是两个 int 形参再返回一个 int ,但 b 中是3个 int 的形参再返回一个int,fmt.Println(myFunc(b,1,2))是错误的。
(3) 习题3:
请编写一个函数 swap(n1*int,n2*int)可以交换 n1 和 n2 的值。
在练习室中新建一个文件夹“exercise”,新建一个文件叫 main.go。通用的部分是包和引入包,将它复制到 main.go 文件夹中,它们的代码如下:
package main
import (
“fmt”
)
//请编写一个函数swap(n1*int,n2*int)可以交换n1和n2的值
func swap(n1*int,n2*int){
//定义一个临时变量
t:=
*n1
*n1=
*n2
*n2=
t
}
func main() {
a :=10
b :=20
swap(&a,&b)//传入的地址
fmt.Printf(“a=%v,b=%v”,a,
b)
}
习题解析:
新建一个文件叫 main.go 把导包引用过来,写一个主函数,根据题目要求 func swap(n1*int,n2*int) 定义一个临时变量 t ,把 n1 的值给 t ,然后再把 n2 的值给 n1,*n2的值给 t 。a:=10,b:=20调用 swap(&a,&b)传入的是地址,再输出 fmt.Printf(“a=%v,b=%v”,a ,b)
最后输出结果为 a=20,b=10。开始是 a=10,b=20,交换成功。注意一定要用指针的数据类型来传递,基本数据类型是通过指针传递的,指针传递在交换的时候对外面的数据没有影响,指针接受地址来进行相应的数据交换。