zoukankan      html  css  js  c++  java
  • 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小说网

  • 相关阅读:
    深浅拷贝的区别
    python 连接mysql数据库
    前端 之HTML基础
    MySQL 多键
    MySQL 存储引擎 字段类型 约束条件
    MySQL数据库的基础知识
    全局解释器和协程
    进程剩余部分和线程
    计算机网络体系结构整理-第三单元网络交换
    计算机网络体系结构整理-第二单元IP技术
  • 原文地址:https://www.cnblogs.com/xiaobaiskill/p/10613457.html
Copyright © 2011-2022 走看看