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小说网

posted @ 2019-03-28 10:46  xiaobaiskill  阅读(159)  评论(0编辑  收藏  举报