一、简介

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

最新文章

  1. CSS知识总结(一)
  2. 开源服务专题之------ssh防止暴力破解及fail2ban的使用方法
  3. java中的函数参数
  4. 待研究:insert客商账户触发器增加条件提示为空
  5. activiti数据库表结构全貌解析
  6. Animation用法
  7. Fiddler 过滤 css,图片等请求url 正则表达式
  8. How to changes to Table &amp; EDT Relations[AX2012]
  9. 银行HR:寒门再难出贵子
  10. asp mvc 路由
  11. STP根交换机,指定端口,根端口,阻塞端口
  12. JS 禁止浏览器右键菜单和刷新
  13. [BZOJ2339][HNOI2011]卡农
  14. Ajax交互,浏览器接收不到服务器的Json数据(跨域问题)
  15. 201521123088《Java程序设计》第11周学习总结
  16. 12集合(2)-----Set
  17. [PHP]PHP rpc框架hprose测试
  18. PCA原理解释(二)
  19. Scrum 冲刺博客
  20. sql求两表的并集、交集、非交集、差集、结果集排序

热门文章

  1. div+css 组织结构
  2. Python os.listdir() 方法
  3. opcache的配置
  4. Java基础学习总结(70)——开发Java项目常用的工具汇总
  5. Method and apparatus for speculative execution of uncontended lock instructions
  6. Oracle-时间与字符串转换
  7. HDU 4598
  8. Linux下route add 命令加入路由列表
  9. 在CentOS VPS上源代码安装高版本号git
  10. Python图像处理库PIL中图像格式转换(一)