go函数初级
一、简介
在go语言中,函数的功能是非常强大的,以至于被认为拥有函数式编程语言的多种特性。
二、介绍
1、一个程序中包含了很多的函数:函数式基本的代码块
2、函数编写的顺序是无关紧要的;鉴于可读性的需求,最好把main()函数写在文件的前面
3、编写函数的目的,在于封装,将一个功能编写到一个函数中,已完成功能的封装,已便重复利用
三、函数的定义
- 格式
func functionName([parameter list]) [return_type]{
函数体
}
- 不正确的定义方式
func G() // "{" 必须与函数名在同一行
{
}
- 函数定义解析
1、func :关键字 ,函数声明,表明这是一个函数
2、functionName : 函数名
3、paramete list :函数参数,非必须
4、return_type :返回类型,函数返回值(非必须)
5、函数体:函数定义的代码的集合
- 如下
func sum(num1,num2 int)int{
return num1 + num2
}
四、函数调用
函数名([参数])
package main
import "fmt"
func main(){
n1,n2 := 2,3
fmt.Println(sum(n1,n2))
}
func sum(num1,num2 int)int{
return num1 + num2
}
五、函数参数
- 单个参数
func maxArr(nums [5]int)int{
var num int
for _,v := range nums{
if num < v{
num = v
}
}
return num
}
- 两个参数
// func max(num1,num2 int)int{} // 这个是推荐写法,与下面的方式一样
func max(num1 int,num2 int)int{
if num1 < num2 {
return num2
} else{
return num1
}
}
- 三个参数
// 返回两个参数
func calc(num1,num2 int,operator string) (int,bool){
switch operator {
case "+":
return num1+num2,true
case "-":
return num1-num2,true
case "*":
return num1*num2,true
case "/":
return num1/num2,true
default:
return 0,false
}
}
- 可变长参数
// 可变长参数 .. s实际类型是数组,只是不确定数组的个数
func concat(s ...string)string{
str := ""
for _,v := range s{
str += v
}
return str
}
- 实例
package main
import "fmt"
func main(){
arr := [5]int{1,2,3,4,5}
fmt.Println(maxArr(arr))
fmt.Println(max(2,3))
fmt.Println(calc(7,8,"+"))
fmt.Println(concat("jmz ","is ","man"))
}
// 单个参数
func maxArr(nums [5]int)int{
var num int
for _,v := range nums{
if num < v{
num = v
}
}
return num
}
// 两个参数
// func max(num1,num2 int)int{} // 这个是推荐写法,与下面的方式一样
func max(num1 int,num2 int)int{
if num1 < num2 {
return num2
} else{
return num1
}
}
// 多个参数
// 返回两个参数
func calc(num1,num2 int,operator string) (int,bool){
switch operator {
case "+":
return num1+num2,true
case "-":
return num1-num2,true
case "*":
return num1*num2,true
case "/":
return num1/num2,true
default:
return 0,false
}
}
// 可变长参数 .. s实际类型是数组,只是不确定数组的个数
func concat(s ...string)string{
str := ""
for _,v := range s{
str += v
}
return str
}
结果:
5
3
15 true
jmz is man
- 可变长参数的坑
package main
import "fmt"
func main(){
ids := []int64{13,32,43}
get(ids...) // 这样不可以的
// get(13,32,43) // 这样可以
}
func get(ids ...interface{}){
for k,v:= range ids{
fmt.Printf("%v-%v",k,v)
}
}
上面的运行会编译报错。
为什么不行,我也不知道。
如果
ids := []interface{}{13,32,43} // 这样是可以的
我猜想可能是因为 类型不同吧,,,,奇怪
六、函数返回值
- 返回一个参数
func min(nums ...int)int{
num := nums[0]
for _,v:=range nums{
if num > v{
num = v
}
}
return num
}
- 返回两个参数
func swap(x int,y int)(int,int){
return y,x
}
- 命名函数
函数在调用阶段就已经赋予的返回初始零值
函数会直接返回已经命名的变量
func calc(num1,num2 int,operator string) (num int,ok bool){
switch operator {
case "+":
num = num1+num2
ok = true
case "-":
num = num1-num2
ok = true
case "*":
num = num1*num2
ok = true
case "/":
num = num1/num2
ok = true
}
return
}
- 实例
package main
import "fmt"
func main(){
fmt.Println(min(4,19,34,12,5,10))
num1,num2 := 3,5
num1,num2 = swap(num1,num2)
fmt.Println(num1,num2)
num,ok := calc(3,4,"+")
fmt.Println(num,ok)
}
// 返回一个参数
func min(nums ...int)int{
num := nums[0]
for _,v:=range nums{
if num > v{
num = v
}
}
return num
}
// 返回两个参数
// 调换函数
func swap(x int,y int)(int,int){
return y,x
}
// 命名返回值
// 函数在调用阶段就已经赋予的返回初始零值
func calc(num1,num2 int,operator string) (num int,ok bool){
switch operator {
case "+":
num = num1+num2
ok = true
case "-":
num = num1-num2
ok = true
case "*":
num = num1*num2
ok = true
case "/":
num = num1/num2
ok = true
}
return
}
结果:
4
5 3
7 true
如果喜欢看小说,请到183小说网