go语言 二

GO语言

  1,函数高级,类型命名,别名

  2,if-else的使用

  3,包的使用

  4,for循环

  5,switch的使用

  6,数组的基础

  7,数组的使用

补充知识点:
    1,go version 查看go的版本号
    2,go    是否安装
    3,go env 查看go的环境
    4,goroot  go的安装路径,如果没有配置,内置包就使用不了  GOROOT=D:DownloadGOyuyang
    5,GOPATH  go的代码存放的路径       GOPATH=D:Gosrc
                go中所有的代码都必须放在gopath路径下的src路径下
                下载的第三方包是放在gopath路径下,只能存在一个版本,也无虚拟环境
    6,导包的时候,查找路径:先去goroot中查找,然后再去gopath中寻找,在找不到,就报错,
                    所以自己写的包就放在gopath中
    7,go语言编译命令:go build 文件名   先编译再执行,编译后会形成一个与当前系统对应的编译文件,然后执行该文件,s1.exe
                    go run 文件名     编译并执行,不会产生一个编译文件, 例如 go run s1.go

    8,回顾:
        1,变量:
            定义的三种方式:
                var 变量名 变量类型 = 值    全写
                var 变量名 = 值           类型推导
                变量名 := 值              简写
        2,变量类型 :int类型默认值为0
                    string类型默认值为空字符串""
                    bool类型默认值为false  (小写)
                bool类型:false,true
                数字类型:int 整数
                        uint 正整数
                        float32,float64  小数   (32或者64表示范围)
                        复数
                        byte:uint8的别名,表示一个字节
                        rune:int32的别名,表示四个字节,一个字符,可以表示任意的一个中文,(韩文,日文)等字符
                字符类型:双引号(单行),反引号(多行)
        3,常量:const 关键字,定义以后不能再进行改变
        4,函数:
                func 关键字 函数名(参数1 参数类型,参数2 参数类型)(返回值类型1,返回值类型2){}
                type 标明类型
                可变长 :func test(a...int)                (int 可以是类型,可以是函数,也可以接口...)

函数高级:
    1,内层函数:定义在函数内部的函数
    2,闭包函数:定义在函数内部,对外部作用有引用(即直接或者间接引用了外部作用域的变量)
    3,go中函数内部定义的函数是不能有名的,需要定义匿名函数:没有名字
    4,go中的函数定义了必须使用,
闭包函数:

func test(a int) (func()){
    var c = 100
    b:=func(){
        fmt.Println(a)
        fmt.Println("我是内层函数")
        fmt.Println(c)
    }   // 函数定义了要么赋值给一个变量,要么加括号执行
    return b
}
func main() {
    a :=test(3)
    a()

}
类似于装饰器

func test1(a func()) func(){    //
    b :=func(){
        fmt.Println("我先执行")
        a()
        fmt.Println("我执行完了")
    }
    return b
}
func test2() {
    fmt.Println("xxx")
}
func main() {
    a :=test2
    a = test(a)
    a()
}
//重命名,给类型命别名
//type MyInt int
//var a int = 20   //重命名了应用了 才起作用
//var a MyInt =10   //应用重命名

type MyFunc func(a int,b int)func()

//func test()func(a int,b int)func() {
func test()MyFunc {
    c:= func(a int,b int)func(){
        return func() {
            fmt.Println("我是")
        }
    }
    return c
}



func main() {
    //a :=test2
    //a = test1(a)
    //a()
    a:=test()
    fmt.Println(a)
}

if-else 条件判断

func main() {
    a:=90
    // if 条件{满足条件后执行的结果}
    if a==90{   //大括号和条件之间不能换行
        fmt.Println("等于90后满足的条件")
    }else if a>90{
        fmt.Println("大于90执行的结果")
    }else {
        fmt.Println("小于90的结果")
    }
    fmt.Println("wo")
}
注意:


func main() {
    //在条件中可以定义变量,但是它的作用范围是在if判断内部使用
    if a :=90;a>90{
        fmt.Println("大于")
    }else if a==90{   //在这里也属于if条件判断的内部
        fmt.Println(a)
    }
}

/*
包
在gopath的src路径下新建一个文件夹,通常情况下,包名就是文件夹名。在同一文件夹下包名必须一致
在同一个文件夹下,所有的包名必须一致,一般默认为文件夹名字
在该文件夹下,你定义的函数或者创建的.go文件都属于同一个包,在该包内函数名不可以重复
即s1.go,s2.go,s.go都属于同一个包,在这些文件中定义的函数,变量不能有重复定义
也就是在一个包下定义了两个不同的函数,只是把这两个函数放在了不同的文件中
在包内定义的函数如果是小写字母开头,只能在包内使用
在外部包相使用,必须首字母大写

*/
func test1() {
    test(a:1,b:2)
    fmt.Println("xxx")
}

例如:

  import “mypackage”

  mypackage

for循环

//for循环,是go语言中的唯一循环

func main() {
  //语法结构
    for i:=0;i<10;i++{   //定义变量(变量的初始化);条件;自增;for后面的三部分都可以省略,但是不能sl封号
        fmt.Println(i)  //结果为0到9
    }

    //第一部分省略
    i :=0      作用域范围i可以定义在外部,也可以定义在内部,或者if内部,if内部只能在if内部内使用
    for ;i<10;i++{
        fmt.Println(i)
    }

    //省略第三部分
    i :=0
    for ;i<10;{
        i++
        fmt.Println(i)  //结果为1到10
    }

    //省略第二部分
    for ;;{
        fmt.Println("死循环") //没有条件,都为真,死循环
    }
    for {  //相当于while True
        fmt.Println("死循环的简写方式")
    }
    //只写条件 for 条件{}  等同于while循环
    i:=0
    for i<10{
        i++
        fmt.Println(i)
    }
  
  //break和contiue
  
    for i :=0; i<11;{
i++
if i==5{
fmt.Println("没有5")
continue
}else if i==9 {
fmt.Println("9结束循环")
break
}
fmt.Println(i)
}
}
}

switch用法

//switch 语句
func main() {
    //基本用法
    a := 10
    switch a {
    case 1:
        {
            fmt.Println("1")
        }
    case 2:
        {
            fmt.Println("2")
        }
    case 3:{
        fmt.Println("3")
    }
    case 10:{
        fmt.Println("我是10")
    }
    }
}


第二中多值用法
func main() {
    //多值匹配用法
    a := 10
    switch a {
    case 1,2,4:
        {
            fmt.Println("1.455566")
        }
    case 5,6,7:
        {
            fmt.Println("2,333")
        }
    case 8,9:{
        fmt.Println("3")
    }
    case 10:{
        fmt.Println("我是buzd")
    }
    }
}

三种:
func main() {
//条件用法
a := 10
switch {
case a>10:
{
fmt.Println("1.455566")
}
case a ==10:
{
fmt.Println("2,333")
}
default:
fmt.Println("小于10")
}
}
还有一种Fallthrough
  //穿透,表示无条件执行下一个case的内容
 

数组

//go语言无集合
//数组:同一类元素的集合,即要是字符串就都为字符串,要是int就都为int,数据类型必须一致
//数组的存储结构是连续存储的内存块,长度必须一致,列表的存储是存储的地址
//数组插入值是重新开辟个内存空间复制一份原来的进行增值,把原来的丢弃,
//列表插入值是把新的值的地址与原来的进行关联,
//go中的数组在定义阶段长度和类型就已经固定了,无法更改

func main() {
        
    //var a [5] int   //定义了一个长度为5的int类型数组
    //fmt.Println(a)  //[0 0 0 0 0]
    //a[1]=100      //把第二个位置放上100
    //fmt.Println(a)   //[0 100 0 0 0]
    //定义并赋初值
    //var a [6] int =[6]int{1,2,3,4,5,6} //不能超出长度
    //fmt.Println(a)

    //var a = [6]int{1,2,3}  //也可以这样定义
    //fmt.Println(a)  //[1 2 3 0 0 0]

    //a:=[6]int{1,2,3}   //也可以这样定义
    //fmt.Println(a)

//    第99个位置设置为99,没有负索引
    a:=[100]int{1,2,98:99,87:88}
    fmt.Println(a)
}    

//数组类型是值传递
//数组的大小也是类型的一部分,即便是同一个类型也不支持比较,支持直接赋值
//数组的长度用len
 

python是值传递还是引用传递

  1,要分数据类型:不可变类型就是值传递,值传递就是把值copy一份传递过去,

           可变类型就是引用传递,(地址)拷贝的是列表的地址,你进行更改时,地址就发生改变了

  所用的函数传参都是copy传递,如果是a=10,就是把这个值copy一份传递过去了,如果是列表,就是copy列表传多去

-Supervisord:进程管理工具,用python写的,

原文地址:https://www.cnblogs.com/Fzhiyuan/p/12019407.html