• Go语言基础(一)


    一、Go语言简介

    Go即Golang,是Google公司2009年11月正式对外公开的一门语言
    Go是静态强类型语言,是区别于解析型语言的编译型语言。
    解析型语言--源代码是先翻译为中间代码,然后解析器对代码进行解释执行。
    编译型语言--源代码译生成机器语言,然后由机器直接执行机器码即可执行。

    二、Go语言特性

    跨平台的编译型语言
    语法接近C语言
    管道,切片,高并发
    有垃圾回收机制
    支持面向对象和面向过程的编程模式

    Go语言用途:区块链(最开始的开源的数字货币是用Go写的)、docker/k8s

    三、Go语言目录架构

    GOPATH的工作区包含bin、src、pkg
    src---源码(包含第三方的和自己项目的)
    bin---编译生成的可执行程序
    pkg---编译时生成的对象文件

    四、Go语言开发环境搭建

    IDEs下载地址:https://www.jetbrains.com/go/
    安装包下载地址:https://golang.google.cn/dl/
    windows和linux环境都可以进行安装,都需要添加环境变量,windows安装包有自动添加功能

    了解ide:

    -eclipse/myeclipse
    -idea:做java开发
    -pycharm:python开发
    -goland:go语言开发
    -vscode:go开发
    -androidstudio开发:idea改的
    -eclipse+adt

    测试Hello World:

    package main
    import "fmt"
    
    func main() {
        fmt.Println("Hello World")
    }

    打开cmd,到对应项目的目录下,执行命令
    go build s1.go ---> 可以编译生成出s1.exe,然后执行就可以打印出:helloworld
    也可以在IDEs里执行,和命令里执行差不多,只是没有生成s1.exe
    并不是所有的go程序都可以编译成可执行文件,要生成可执行文件需要满足2个条件:
      --该go程序需要属于main包
      --在main包中必须还得包含main函数
    
    Go程序的入口就是 main.main
    go run可以将go build 2步并成一步且不生成exe文件
    C:代码代码srcday01>go run s1.go
    hellowrold

    五、Go命令介绍

    基本命令介绍:
    build:编译包和依赖
    clean:移除对象文件
    doc:显示包或者符号的文档
    env:打印go的环境信息
    bug:启动错误报告
    fix:运行gofmt进行格式化
    generate:从processing source生成go文件
    get:下载并安装包和依赖
    install:编译并安装包依赖
    list:列出包
    run:编译并运行go程序
    test:运行测试
    tool:运行go提供的工具
    version:显示go的版本
    vet:运行go tool vet

    get命令:下载并安装第三方包

    使用方式:go get 包名
    
    然后我们可以用下面的方式进行使用
    package main
    improt "github.com/astaxie/beego" # 这里需要使用src下的完整路径
    fun main(){
        beego.Run()
    }

    六、简述hello world程序

    //单行注释
    /*
    多行注释
    多行注释
     */
    //表示是main包,表示程序入口
    //程序执行,会去执行main包下的main函数
    package main
    //导入fmt包
    import "fmt"
    
    //main函数
    func main()  {
        //使用fmt包下的Println打印
        //字符串用双引号
        fmt.Println("hellowrold")
    }
    package main 定义了包名。你必须在源文件中非注释的第一行指明这个文件属于哪个包,如:package main。package main表示一个可独立执行的程序,每个 Go 应用程序都包含一个名为 main 的包。
    
    import "fmt" 告诉 Go 编译器这个程序需要使用 fmt 包
    
    func main() 是程序开始执行的函数。main 函数是每一个可执行程序所必须包含的,一般来说都是在启动后第一个执行的函数(如果有 init() 函数则会先执行该函数)。
    
    /*...*/ 是注释,在程序执行时将被忽略。单行注释是最常见的注释形式,你可以在任何地方使用以 // 开头的单行注释。
    多行注释也叫块注释,均已以 /* 开头,并以 */ 结尾,且不可以嵌套使用,多行注释一般用于包的文档描述或注释成块的代码片段。 fmt.Println(...) 可以将字符串输出到控制台,并在最后自动增加换行字符 。 Print 和 Println 这两个函数也支持使用变量,如:fmt.Println(arr)。如果没有特别指定,它们会以默认的打印格式将变量 arr 输出到控制台。

     七、变量定义

    # 定义单个变量
    package main
    
    func main() {
        //变量定义
        //第一种方式
        //var关键字 变量名 变量类型 = 变量值
        //变量定义了一定要使用,不使用报错
        var a int=10
        fmt.Println(a)
            //第二种方式(类型推导,省略类型)
            var b =10
            fmt.Println(b)
            //第三种(简略赋值) 用的最多
            c:=10
            fmt.Println(c)
    }
    // 定义多个变量
    package main
    import "fmt"
    
    func main() {
        var a,b int
        a =10
        b =20
        fmt.Println(a,b)
    }
    或
    func main(){
        //简略赋值声明多个(变量只能定义一次)
        a,b:=10,"lqz"
        fmt.Println(a,b) //10 lqz
    }
    或
    func main(){
        //go是强类型语言(类型一旦确定,不能改变)
        var a int
        a = 11
        a = "test"
        fmt.Println(a)  //报错,int改为了string
    }

    八、变量类型

    package main
    import "fmt"
    
    func main() {
        //布尔
        //var a bool =true
        //fmt.Println(a)
        //数字类型
        //var a int8=100
        //范围2的7次方-1
        //计算机最小单位:bit
        //字节:8个比特位
        //fmt.Println(a)
        //类型推导:
        //a:=10     //int  在32位机器上是int32 在64位机器是int64
        //var a uint64=10   //只表示正整数
        //可以表示小数
        //var a float32=19.08
        //fmt.Println(a)
        //byte:uint8的别名
        //var a byte =-10
        //rune: int32的别名
        //字符串(双引号)
        var a string ="lqz"
        fmt.Println(a)
    }

    九、常量

    常量用来表示固定的值,不变的量

    // 定义方法
    package main
    
    func main() {
        //定义常量
        //const关键字 变量名  = 变量值
        const age  = 10
        const  name = "lqz"
        //name="egon"
        const  name, age = "lqz",18
        //var  a,b  = "lqz",10
    }

    十、函数

    语法:
    //func关键字 函数名(变量 变量类型,变量 变量类型){
    // }
    
    // 1)位置传参
    package main
    import "fmt"
    
    func main() {
        // 没有指定道姓传参,只能按位置传参
        test(1,2)
    }
    
    func test(a,b int) {
        fmt.Println(a+b)
    }
    
    // 2)返回值
    //func关键字 函数名(变量 变量类型,变量 变量类型)返回值类型{}
    func main() {
        // 返回值接收
        c :=test(1,2)
        fmt.Println(c)
    }
    
    func test(a,b int) int {
        return a+b
    }
    
    // 3)多返回值
    func main() {
        // 返回值接收,必须是2个接收
        v,k:=test(1,2,"计算")
            // 如果有一个值不需要可以用_ 代替
        fmt.Println(v,k)
    }
    
    func test(a,b int,c string) (int,string) {
        return a+b,"计算成功"
    }
    
    // 4) 可变长传参
    func main() {
        test(1,2,3)   //[1 2 3]  类似python中的列表,可切片
    
    }
    // ...可变长类型必须一样
    func test(a ...int) {
        fmt.Println(a)
            fmt.Print(a[0])
    }

    十一、闭包

    // 闭包:1.定义在函数内部;2.对外部作用于有引用
    // 补充: 匿名函数 func (参数)(返回值){}
    
    // 推导解释
    func test()(func()(int,string)){
        a:=10
        // 匿名函数:省略函数名字,变灰的意思是可以省略
           //当成变量返回
        //var b func()(int)=func ()(int){
        //    fmt.Println(a)
        //    return 1
        //}
        b:= func()(int,string) {
            fmt.Println(a)
            return 1,";xxxx"
        }
        return b
    }
    // 
    // func(d int)(int) 返回值
    func test()(func(d int)(int),int){
        c:=func (d int)(int){
            fmt.Println("xxxx")
            return 1
        }
        return c,1
    }
    
    // 整体
    func main() {
        k:=test(3)
        k(5)
    }
    
    // func(d int)(int) 返回值
    func test(c int)(func(d int)()){
        a:=func (d int){
            fmt.Println(d+c)
        }
        return a
    }
    
    // 默认返回值
    func test()( a,b int)  {
        return a,b
    }
    // int默认空值是0,string类型默认空值是""一行空

    函数格式:func 名字(参数1 类型,参数2 类型)(返回类型,返回类型){}

    十二、包管理

    导入别的包:(与自己的包目录级别一样)
    有严格的路径模式,如果是下载的模块放到了GoPath路径下 package main import
    "mypackage" func main() { mypackage.Test() }

    十三、if...else..

    package main
    import "fmt"
    
    func main() {
        a:=11;
        //大括号必须和条件在一行
        if a<10{
            fmt.Println("<10");
        }else if a>10{
            fmt.Println(">10");
        }else {
            fmt.Println("10")
        }
    }

    package main
    import "fmt"

    func main() {
    a:=11;
    //大括号必须和条件在一行
    if a<10{
    fmt.Println("<10");
    }else if a>10{
    fmt.Println(">10");
    }else {
    fmt.Println("10")
    }
    }
    注意:条件和{必须在一行

    十四、for循环(GO中只有这种)

    // 语法
    ////for 循环
    //for 第一部分;第二部分;第三部分{
    //}
    func main(){
            //基本写法
        for i:=0;i<100;i++{
            fmt.Println(i)
        }
    
    }
    //其他用法1 省略第一部分
    i:=0
    for ;i<100;i++{
        fmt.Println(i)
    }
    //其他用法二 省略第三部分
    i:=0
    for ;i<100;{
        i=i+1
        fmt.Println(i)
    }
    //其他用法三 省略第二部分
    for ;;{
        fmt.Println("xxx")
    }
    //更多使用
    //for a<10  表示写在第二个位置
    a:=0
    for a<10{
        fmt.Println(a)
    }
    //死循环
    for {
        fmt.Println("xxx")
        break //不加这个就不会跳出
    }
    //break 和continue
    for i:=0;i<10 ;  i++{
        if i==5{
            //continue
            break
        }
        fmt.Println(i)
    }

    十五、switch...case条件语句

    package main
    import "fmt"
    //单条件
    func main() {
        a := 5
        switch a {
        case 1:
            fmt.Println("1")
        case 2:
            fmt.Println("2")
        case 4:
            fmt.Println("4")
            default:
                    fmt.Println("不匹配")
        }
    }
    //多条件
        a := 4
        switch a {
        case 1,2:
            fmt.Println("1")
        case 3,6:
            fmt.Println("2")
        default:
            fmt.Println("不匹配")
        case 4:
            fmt.Println("4")
        }
    
    //fallthrough 穿透:直接打印下一条
        a := 4
        switch a {
        case 1, 2:
            fmt.Println("1")
        case 3, 6:
            fmt.Println("2")
        case 4:
            fmt.Println("4")
            fallthrough //穿透
        case 5:
            fmt.Println("5")
            fallthrough
        default:
            fmt.Println("不匹配")
            fmt.Println("xxxxx")
        
        }
     //fallthrough 结果:
    4
    5
    不匹配
    xxxxx

    十六、数组

    package main
    import "fmt"
    
    func main() {
        //基本定义/定义并初始化
        //a[3]int:a数组的长度为3,数组内的类型都为int
        //var a [3]int=[3]int{1,2,3}
        //var a =[3]int{1,2,3}
        a:=[3]int{1,2,3}
        fmt.Println(a)
    }
    --------------------------------------------------------------------------------
    //指定位置初始化
    a:=[10]string{9:"lqz",8:"xxx"}
    fmt.Println(a)
    //结果[        xxx lqz]
    
    //数组使用
    var a [3]int=[3]int{1,2,3}
    //--修改第0个位置的值
    a[0]=100
    var b int=a[2]  //赋值成变量
    fmt.Println(a)
    //结果:[100 2 3]
    
    //数组的长度,开始可以忽略
    // ... 的使用(少用)
    a :=[...]int{9:1}  // 第九个位置赋值为1
    fmt.Println(a)  //[0 0 0 0 0 0 0 0 0 1] 
    fmt.Println(len(a))   //10
    
    //数组的大小是类型的一部分:参数和返回值都是类型的一部分
    a:=[3]int{1,2,3}
    b:=[3]int{1,2,3}  //长度必须是一样,类型必须一样
    b=a
    fmt.Println(b)
    
    //函数
    a:=[3]int{1,2,3}
    fmt.Println(a)
    test(a)
    fmt.Println(a)
    //test(a)放在main外调用
    func test(a [3]int)  {
        a[1]=1000
        fmt.Println(a)
    }
    //结果:
    [1 2 3]
    [1 1000 3]
    [1 2 3]
    -------------------------------------------------------------------------------
    //数组迭代
    a:=[3]int{1,2,3}
    for i:=0;i<len(a);i++{
        fmt.Println(a[i])
    }
    //第二种方式(常见)
    //range :python中range函数
    // 关键字
    //range 可迭代   如果用一个值接收:就是索引  如果用两个值接收:就是索引和值
    for i,v:=range a{
        //fmt.Println(i)
        fmt.Println(a[i])
        fmt.Println(v)
    }
    --------------------------------------------------------------------------------
    //多维数组
    //定义一个二位数组
    var a [5][3]int=[5][3]int{{1,2,3},{4,4,4}}
    fmt.Println(a)
    //结果:[[1 2 3] [4 4 4] [0 0 0] [0 0 0] [0 0 0]]
    修改:var a [5][3]int=[5][3]int{2:{4,4,4}}
    //循环
    for i := 0; i < len(a); i++ {
        for j := 0; j < len(a[i]); j++ {
            fmt.Println(a[i][j])
        }
    }
    for _,v:=range a{
        for _,v1:=range v{
            fmt.Println(v1)
        }
    }

    十七、切片

    解决数组追加值

    package main
    import "fmt"
    
    func main() {
        //切片定义
        //切片底层基于数组
        a:=[9]int{1,2,43}
        fmt.Println(a) //[1 2 43 0 0 0 0 0 0]
        b:=a[1:3]
        fmt.Println(b)  //[2 43]
        //b[0]=100
        a[1]=999
        fmt.Println(b)   //[999 43]
        fmt.Println(a)   //[1 999 43 0 0 0 0 0 0]
    }
    package main
    import "fmt"
    
    func main(){
        a:=[5]int{1,2,43,0,0}
        b:=a[1:3]
        fmt.Println(b)  //[2 43]
        fmt.Println(len(b)) //2
        //切片追加值
            b=append(b,10)
        b=append(b,11)
        b=append(b,12)
        fmt.Println(b)  //[2 43 10 11 12]
    
    }
    
    # 查看切片容量
    //查看切片的容量/长度
    a:=[5]int{1,2,43,0,0}
    b:=a[1:3]
    fmt.Println(len(b))   //2
    ////查看容量
    fmt.Println(cap(b))   //4
    b=append(b,10)
    b=append(b,11)
    b=append(b,12)
    fmt.Println(len(b))  //5
    //查看容量(容量如果不够了,每次都会翻倍)
    fmt.Println(cap(b)) //8
    //切片第二种定义方式 中括号内不写东西,就是切片类型
    //切片的空是nil
    //通过make函数来完成初始化  第一个5是长度,第二个5是容量
    func main(){
        var a []int=make([]int,5,5)
        if a==nil{
        fmt.Println("xxxx")
        }
        fmt.Println(len(a))  //5
        fmt.Println(cap(a)) //5
    }
    
    //切片是什么类型  是引用类型
        var a []int=make([]int,5,5)
        fmt.Println(a)  //[0 0 0 0 0]
        test(a)  //[999 0 0 0 0]
        fmt.Println(a)  //[999 0 0 0 0]
    
    # test()
    func test(a []int)  {
        a[0]=999
        fmt.Println(a)
    }
    
    //内存优化,copy函数
    a:=[10000]int{1,2,3,4,5,}
    b:=a[0:3]
    fmt.Println(b)  //[1 2 3]
    var c []int=make([]int,2,2)
    copy(c,b)
    fmt.Println(c)  //[1 2]

    https://www.cnblogs.com/xiaoyuanqujing/p/11681169.html

  • 相关阅读:
    数组的顺序存储表示
    CF538G Berserk Robot
    【LGR-077】洛谷 10 月月赛 I Div.1 && P6854 Tram
    [THUPC2019]找树
    CF536D Tavas in Kansas
    luogu「EZEC-4.5」子序列
    2020.8.7
    拉格朗日反演
    2020.8.6
    初赛复习
  • 原文地址:https://www.cnblogs.com/yangmeichong/p/11824441.html
Copyright © 2020-2023  润新知