zoukankan      html  css  js  c++  java
  • GO ---- 函数 包 判断 循环

    补充:go变量定义推荐使用驼峰,文件名命名推荐使用下划线

    函数

    定义函数基本格式:

    // func关键字 + 函数名 + (参数1,参数2,参数3) + {函数体内容}
    
    package main
    import "fmt"
    
    // 这个位置不能写逻辑代码,只能变量和常量的定义
    
    func main(){
        // 调用函数
        myFunc()
    }
    
    // 自定义函数 myFunc
    func myFunc(){
        fmt.Priltln("函数体执行内容")
    }
    

    1 函数基本定义(放在main前后都可以)

    func test()  {
    	fmt.Println("我是函数test")
    }
    

    2 带参数的函数

    // 参数可以指定类型
    func test(a int,b int)  {
    	fmt.Println(a+b)
    }
    
    // 带参数的函数,两个参数类型相同,可以省略
    func test(a ,b int,c string)  {   
    	fmt.Println(a+b)  //a,b是int, c是string
    }
    

    3 带返回值(需要指定返回值类型是什么)

    // 在参数后加类型即可
    func test(a ,b int) int { 
    	return a+b
    }
    
    // 多返回值(python中可以 返回的是元祖),我们这里返回两个int类型
    func test(a ,b int) (int,int) {
    	return a+b,b*a  
    }
    

    4 可变长参数

    // 可变长,接收任意长度的参数  (参数1 + ... + 类型)
    func test(a ...int){
    	fmt.Println(a)
    }
    // go中只有位置参数,没有关键字参数一说,没有默认参数
    

    5 匿名函数

    匿名函数:(没有名字的函数),一定要定义在函数内部

    func test()  {
    	//匿名函数直接加括号
    	func (){
    		fmt.Println("我是匿名函数")
    	}() // 注意这里加了括号执行了
    }
    
    func test()  {
    	//赋值给一个变量
    	var a func()
        
        a =func (){
    		fmt.Println("我是匿名函数")
    	}
    	a() // 执行
        
        //a是个什么类型
        fmt.Printf("%T",a) // func()
    }
    

    6 函数这个类型,它的参数,返回值,都是类型的一部分

    var a func()
    var b func(a,b int)
    var c func(a,b int)int
    var d func(a,b int)(int,string)
    
    // 以上的类型都不相同
    

    7 闭包

    定义: 定义在函数内部 , 对外部作用域有引用

    # python代码
    def index():
        def func():
           	print("hello")
        return func
    a = index()
    a()
    
    // go代码闭包
    func test() func() {
    	// 变量接收函数
    	a := func() {
    		fmt.Println("我是内层函数")
    	}
    	// 返回a 但是返回值需要定义类型 我们可以打印下a的类型
    	fmt.Printf("%T",a) // 我们发现a的类型是func()
    	// 那么我们就返回类型为func()
    	return a
    }
    
    // 如果内层函数有参数
    func test2() func(x,y int) string {
    	//只是一个内层函数
    	a:= func(x,y int) string {
    		fmt.Printf("我是内层函数")
    		return "我是内层函数的返回值"
    	}
    	return a
    }
    // 这里的返回值 他怎么定义的就需要怎么返回 包括放回值 func(x,y int) string
    //闭包函数,闭包函数,就是多了一种函数传参的方式
    

    8 给函数类型重命名

    // 因为每一次放回都特别多特别麻烦所以可以给函数的类型重命名
    type Myfunc  func (z int) int
    
    //给 函数类型 重命名
    type Myfunc  func(z int)int
    
    func test(x,y int) Myfunc {
    	//只是一个内层函数
    	a:= func(z int)int {
    		fmt.Println(x+y+z)
    		return x+y+z
    	}
    	return a
    }
    
    

    9 返回值默认值

    //返回值默认值
    func test()(a int,b string)  {
    	// a和b不需要定义,直接使用
        // return的时候,不需要指定了
    	a=0
    	b="ok"
    	return
    }
    
    func test()  {
        //这样写,有没有返回值
    	return
    	fmt.Printf("xxx")
    }
    

    10 补充

    匿名空接口(目前不用看)

     //补充Println函数可以传任意的数据类型
     fmt.Println(1,"lqz",3.45)
     //interface{} 应该是所有类型的鼻祖,int,string,float32都属于interface{}类型
     //接口,匿名空接口
    

    package main
    
    import "s12_day02/mypacakge"  //导包的时候,是从gopath的src路径下开始导
    import "fmt"
    
    //同一个文件夹下只能有一个包,也就是package 后面 的名字都要一致 默认就跟文件夹名字一样即可
    //同一个包下有两个名字相同的函数是不行的
    //使用包,需要导入
    
    func main() {
    	mypackage.MyPackageTest()
    	//以大写字母开头表示导出(外部包可以使用),小写字母开头,外部包不能使用,只能再包内部适应
    	mypackage.test()
    	fmt.Println("xxx")
    }
    
    

    总结:

    1 新建一个文件夹(包),包下新建任意多个go文件,但是包名都必须一致(建议就用文件夹名)

    2 在包内定义的函数,大写字母开头,表示外部包可以使用,小写字母开头,表示只能再内部使用,直接使用即可

    3 在其他包中使用,要先导入(goland有自动提示)

    -import "s12_day02/mypacakge"
    -包名.函数()
    

    4 公有和私有 就是大小写区分的

    5 所有的包必须在gopath的src路径下,否则找不到

    if-else语句

    package main
    import "fmt"
    func main() {
    	//1 语法
    	if 条件 {
    		//符合上面条件的执行
    	}
    	else if 条件{
    		//符合上面条件的执行
    	}else {
    		// 不符合上面的条件执行这个
    	}
    
    }
    
    
    package main
    import "fmt"
    func main() {
    
    	var a =10
    	if a<9{
    		fmt.Println("小于9")
    	}else if a==10{
    		fmt.Println("10")
    	}else {
    		fmt.Println("都不符合")
    	}
    }
    
    package main
    import "fmt"
    func main() {
    	//作用域范围不一样
    	if a:=10;a<9{
    		fmt.Println("小于9")
    	}else if a==10{
    		fmt.Println("10")
    	}else {
    		fmt.Println("都不符合")
    	}
    }
    

    循环

    package main
    //循环:go中,没有while循环,只有一个for循环,for可以替代掉while
    func main() {
    	//1 语法,三部分都可以省略
    	/*
    	for关键字 初始化;条件;自增自减{
    		循环体的内容
    	}
    	 */
    }
    
    // 示例 从0 打印到9
    	for i:=0;i<10;i++{
    		fmt.Println(i)
    	}
    
    
    break continue:任何语言都一样
    
  • 相关阅读:
    neutron 多租户隔离的实现以及子网间路由的实现
    neutron是一个超级脚本的理解
    LVS + nginx实现高性能精准负载均衡
    LVS + HAProxy实现跨网负载均衡
    Linux 线程实现模型
    Linux 进程调度的主要策略
    Linux PCI设备驱动的实现思路与思想
    网络控制器intel 82599, powerpc 830的BD描述符结构
    Linux网络设备驱动的实现
    大规模分布式服务的核心思想
  • 原文地址:https://www.cnblogs.com/lddragon1/p/12571872.html
Copyright © 2011-2022 走看看