zoukankan      html  css  js  c++  java
  • GoLang

    Go 语言结构

    在我们开始学习 Go 编程语言的基础构建模块前,让我们先来了解 Go 语言最简单程序的结构。

    Go 语言的基础组成有以下几个部分:

    • 包声明
    • 引入包
    • 函数
    • 变量
    • 语句 & 表达式
    • 注释
    package main
    
    import "fmt"
    
    func main() {
       /* 这是我的第一个简单的程序 */
       fmt.Println("Hello, World!")
    }

    1.第一行代码 package main 定义了包名。你必须在源文件中非注释的第一行指明这个文件属于哪个包,如:package main。package main表示一个可独立执行的程序,每个 Go 应用程序都包含一个名为 main 的包。

    2,下一行 import "fmt" 告诉 Go 编译器这个程序需要使用 fmt 包(的函数,或其他元素),fmt 包实现了格式化 IO(输入/输出)的函数。

    3.下一行 func main() 是程序开始执行的函数。main 函数是每一个可执行程序所必须包含的,一般来说都是在启动后第一个执行的函数(如果有 init() 函数则会先执行该函数)。

    4.下一行 /*...*/ 是注释,在程序执行时将被忽略。单行注释是最常见的注释形式,你可以在任何地方使用以 // 开头的单行注释。多行注释也叫块注释,均已以 /* 开头,并以 */ 结尾,且不可以嵌套使用,多行注释一般用于包的文档描述或注释成块的代码片段。

    5.下一行 fmt.Println(...) 可以将字符串输出到控制台,并在最后自动增加换行字符 。 使用 fmt.Print("hello, world ") 可以得到相同的结果。 Print 和 Println 这两个函数也支持使用变量,如:fmt.Println(arr)。如果没有特别指定,它们会以默认的打印格式将变量 arr 输出到控制台。Println会将双引号里的输出类型也原样打印出来,但是Print输出的是字符串类型的变量,所以需要格式化输出信息时用Printf,其他时间可以用Println

    Go 语言基础语法

    关键字

    下面列举了 Go 代码中会使用到的 25 个关键字或保留字:

    break default func interface select
    case defer go map struct
    chan else goto package switch
    const fallthrough if range type
    continue for import return var

    除了以上介绍的这些关键字,Go 语言还有 36 个预定义标识符:

    append bool byte cap close complex complex64 complex128 uint16
    copy false float32 float64 imag int int8 int16 uint32
    int32 int64 iota len make new nil panic uint64
    print println real recover string true uint uint8 uintptr

    程序一般由关键字、常量、变量、运算符、类型和函数组成。

    程序中可能会使用到这些分隔符:括号 (),中括号 [] 和大括号 {}。

    程序中可能会使用到这些标点符号:.、,、;、: 和 …。

    Go 语言数据类型

    序号类型和描述
    1 布尔型
    布尔型的值只可以是常量 true 或者 false。一个简单的例子:var b bool = true。
    2 数字类型
    整型 int 和浮点型 float32、float64,Go 语言支持整型和浮点型数字,并且原生支持复数,其中位的运算采用补码。
    3 字符串类型:
    字符串就是一串固定长度的字符连接起来的字符序列。Go的字符串是由单个字节连接起来的。Go语言的字符串的字节使用UTF-8编码标识Unicode文本。
    4 派生类型:
    包括:
    • (a) 指针类型(Pointer)
    • (b) 数组类型
    • (c) 结构化类型(struct)
    • (d) Channel 类型
    • (e) 函数类型
    • (f) 切片类型
    • (g) 接口类型(interface)
    • (h) Map 类型

    Go 语言变量

     Go 语言变量名由字母、数字、下划线组成,其中首个字母不能为数字。

    var identifier type
    var 变量名 变量类型

    变量声明

    第一种,指定变量类型,声明后若不赋值,使用默认值。

    var v_name v_type
    v_name = value

    第二种,根据值自行判定变量类型。

    var v_name = value

    第三种,省略var, 注意 :=左侧的变量不应该是已经声明过的,否则会导致编译错误。

    v_name := value     #这是使用变量的首选形式,但是它只能被用在函数体内,而不可以用于全局变量的声明与赋值

    Go 语言常量

    常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型。

    const identifier [type] = value

    你可以省略类型说明符 [type],因为编译器可以根据变量的值来推断其类型。

    显式类型定义: const b string = "abc"
    隐式类型定义: const b = "abc"

    多个相同类型的声明可以简写为:

    const c_name1, c_name2 = value1, value2

    iota

    iota,特殊常量,可以认为是一个可以被编译器修改的常量。

    iota 在 const关键字出现时将被重置为 0(const 内部的第一行之前),const 中每新增一行常量声明将使 iota 计数一次(iota 可理解为 const 语句块中的行索引)。

    iota 可以被用作枚举值:

    const (
        a = iota
        b = iota
        c = iota
    )

    第一个 iota 等于 0,每当 iota 在新的一行被使用时,它的值都会自动加 1;所以 a=0, b=1, c=2 可以简写为如下形式:

    package main
    
    import "fmt"
    
    func main() {
        const (
                a = iota   //0
                b          //1
                c          //2
                d = "ha"   //独立值,iota += 1
                e          //"ha"   iota += 1
                f = 100    //iota +=1
                g          //100  iota +=1
                h = iota   //7,恢复计数
                i          //8
        )
        fmt.Println(a,b,c,d,e,f,g,h,i)
    }

    Go 语言运算符

    算术运算符

    下表列出了所有Go语言的算术运算符。假定 A 值为 10,B 值为 20。

    运算符描述实例
    + 相加 A + B 输出结果 30
    - 相减 A - B 输出结果 -10
    * 相乘 A * B 输出结果 200
    / 相除 B / A 输出结果 2
    % 求余 B % A 输出结果 0
    ++ 自增 A++ 输出结果 11
    -- 自减 A-- 输出结果 9

    关系运算符

    下表列出了所有Go语言的关系运算符。假定 A 值为 10,B 值为 20。

    运算符描述实例
    == 检查两个值是否相等,如果相等返回 True 否则返回 False。 (A == B) 为 False
    != 检查两个值是否不相等,如果不相等返回 True 否则返回 False。 (A != B) 为 True
    > 检查左边值是否大于右边值,如果是返回 True 否则返回 False。 (A > B) 为 False
    < 检查左边值是否小于右边值,如果是返回 True 否则返回 False。 (A < B) 为 True
    >= 检查左边值是否大于等于右边值,如果是返回 True 否则返回 False。 (A >= B) 为 False
    <= 检查左边值是否小于等于右边值,如果是返回 True 否则返回 False。 (A <= B) 为 True

    逻辑运算符

    下表列出了所有Go语言的逻辑运算符。假定 A 值为 True,B 值为 False。

    运算符描述实例
    && 逻辑 AND 运算符。 如果两边的操作数都是 True,则条件 True,否则为 False。 (A && B) 为 False
    || 逻辑 OR 运算符。 如果两边的操作数有一个 True,则条件 True,否则为 False。 (A || B) 为 True
    ! 逻辑 NOT 运算符。 如果条件为 True,则逻辑 NOT 条件 False,否则为 True。 !(A && B) 为 True

    位运算符

    位运算符对整数在内存中的二进制位进行操作。

    下表列出了位运算符 &, |, 和 ^ 的计算:

    pqp & qp | qp ^ q
    0 0 0 0 0
    0 1 0 1 1
    1 1 1 1 0
    1 0 0 1 1

    假定 A = 60; B = 13; 其二进制数转换为:

    A = 0011 1100
    
    B = 0000 1101
    
    -----------------
    
    A&B = 0000 1100
    
    A|B = 0011 1101
    
    A^B = 0011 0001
    
    

    Go 语言支持的位运算符如下表所示。假定 A 为60,B 为13:

    运算符描述实例
    & 按位与运算符"&"是双目运算符。 其功能是参与运算的两数各对应的二进位相与。 (A & B) 结果为 12, 二进制为 0000 1100
    | 按位或运算符"|"是双目运算符。 其功能是参与运算的两数各对应的二进位相或 (A | B) 结果为 61, 二进制为 0011 1101
    ^ 按位异或运算符"^"是双目运算符。 其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。 (A ^ B) 结果为 49, 二进制为 0011 0001
    << 左移运算符"<<"是双目运算符。左移n位就是乘以2的n次方。 其功能把"<<"左边的运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0。 A << 2 结果为 240 ,二进制为 1111 0000
    >> 右移运算符">>"是双目运算符。右移n位就是除以2的n次方。 其功能是把">>"左边的运算数的各二进位全部右移若干位,">>"右边的数指定移动的位数。 A >> 2 结果为 15 ,二进制为 0000 1111
    package main
    
    import "fmt"
    
    func main() {
    
       var a uint = 60    /* 60 = 0011 1100 */  
       var b uint = 13    /* 13 = 0000 1101 */
       var c uint = 0          
    
       c = a & b       /* 12 = 0000 1100 */ 
       fmt.Printf("第一行 - c 的值为 %d
    ", c )
    
       c = a | b       /* 61 = 0011 1101 */
       fmt.Printf("第二行 - c 的值为 %d
    ", c )
    
       c = a ^ b       /* 49 = 0011 0001 */
       fmt.Printf("第三行 - c 的值为 %d
    ", c )
    
       c = a << 2     /* 240 = 1111 0000 */
       fmt.Printf("第四行 - c 的值为 %d
    ", c )
    
       c = a >> 2     /* 15 = 0000 1111 */
       fmt.Printf("第五行 - c 的值为 %d
    ", c )
    }

    赋值运算符

    下表列出了所有Go语言的赋值运算符。

    运算符描述实例
    = 简单的赋值运算符,将一个表达式的值赋给一个左值 C = A + B 将 A + B 表达式结果赋值给 C
    += 相加后再赋值 C += A 等于 C = C + A
    -= 相减后再赋值 C -= A 等于 C = C - A
    *= 相乘后再赋值 C *= A 等于 C = C * A
    /= 相除后再赋值 C /= A 等于 C = C / A
    %= 求余后再赋值 C %= A 等于 C = C % A
    <<= 左移后赋值 C <<= 2 等于 C = C << 2
    >>= 右移后赋值 C >>= 2 等于 C = C >> 2
    &= 按位与后赋值 C &= 2 等于 C = C & 2
    ^= 按位异或后赋值 C ^= 2 等于 C = C ^ 2
    |= 按位或后赋值 C |= 2 等于 C = C | 2
    package main
    
    import "fmt"
    
    func main() {
       var a int = 21
       var c int
    
       c =  a
       fmt.Printf("第 1 行 - =  运算符实例,c 值为 = %d
    ", c )        21
    
       c +=  a
       fmt.Printf("第 2 行 - += 运算符实例,c 值为 = %d
    ", c )        42
    
       c -=  a
       fmt.Printf("第 3 行 - -= 运算符实例,c 值为 = %d
    ", c )        21
    
       c *=  a
       fmt.Printf("第 4 行 - *= 运算符实例,c 值为 = %d
    ", c )        441
    
       c /=  a
       fmt.Printf("第 5 行 - /= 运算符实例,c 值为 = %d
    ", c )        21
    
       c  = 200; 
    
       c <<=  2
       fmt.Printf("第 6行  - <<= 运算符实例,c 值为 = %d
    ", c )       800
    
       c >>=  2
       fmt.Printf("第 7 行 - >>= 运算符实例,c 值为 = %d
    ", c )       200
    
       c &=  2
       fmt.Printf("第 8 行 - &= 运算符实例,c 值为 = %d
    ", c )        0
    
       c ^=  2
       fmt.Printf("第 9 行 - ^= 运算符实例,c 值为 = %d
    ", c )        2
    
       c |=  2
       fmt.Printf("第 10 行 - |= 运算符实例,c 值为 = %d
    ", c )       2

    其他运算符

    下表列出了Go语言的其他运算符。

    运算符描述实例
    & 返回变量存储地址 &a; 将给出变量的实际地址。
    * 指针变量。 *a; 是一个指针变量

    Go 语言 if...else 语句

    if 布尔表达式 {
       /* 在布尔表达式为 true 时执行 */
    } else {
      /* 在布尔表达式为 false 时执行 */
    }

    code

    package main
    
    import "fmt"
    
    func main() {
        var age int = 23
        if age == 25 {
            fmt.Println("true")
        } else if age < 25 {
            fmt.Println("too small")
        } else {
            fmt.Println("too big")
        }
    }

    Go 语言 switch 语句

    switch 语句用于基于不同条件执行不同动作,每一个 case 分支都是唯一的,从上直下逐一测试,直到匹配为止。。
    
    switch 语句执行的过程从上至下,直到找到匹配项,匹配项后面也不需要再加break
    
    语法
    Go 编程语言中 switch 语句的语法如下:
    
    switch var1 {
        case val1:
            ...
        case val2:
            ...
        default:
            ...
    }
    package main
    
    import "fmt"
    
    func main() {
        /* 定义局部变量 */
        var grade string = "B"
        var marks int = 90
    
        switch marks {
        case 90: grade = "A"        #这里是冒号之前的值和switch表达式的结果进行对比,如果相同则执行冒号后面的语句,而其余的case语句则会被忽略。
        case 80: grade = "B"
        case 50,60,70 : grade = "C"
        default: grade = "D"
        }
    
        switch {
        case grade == "A" :
            fmt.Printf("优秀!
    " )
        case grade == "B", grade == "C" :
            fmt.Printf("良好
    " )
        case grade == "D" :
            fmt.Printf("及格
    " )
        case grade == "F":
            fmt.Printf("不及格
    " )
        default:
            fmt.Printf("" );
        }
        fmt.Printf("你的等级是 %s
    ", grade );
    }

    Go 语言 select 语句

    select是Go中的一个控制结构,类似于用于通信的switch语句。每个case必须是一个通信操作,要么是发送要么是接收。

    select随机执行一个可运行的case。如果没有case可运行,它将阻塞,直到有case可运行。一个默认的子句应该总是可运行的。

    Go 编程语言中 select 语句的语法如下:
    
    select {
        case communication clause  :
           statement(s);      
        case communication clause  :
           statement(s); 
        /* 你可以定义任意数量的 case */
        default : /* 可选 */
           statement(s);
    }

    Go 语言循环语句

    for循环

    for init; condition; post { }
    for condition { }
    • init: 一般为赋值表达式,给控制变量赋初值
    • condition: 关系表达式或逻辑表达式,循环控制条件
    • post: 一般为赋值表达式,给控制变量增量或减量
    package main
    
    import "fmt"
    
    func main() {
    
       var b int = 15
       var a int
    
       numbers := [6]int{1, 2, 3, 5} 
    
       /* for 循环 */
       for a := 0; a < 10; a++ {
          fmt.Printf("a 的值为: %d
    ", a)
       }
    
       for a < b {
          a++
          fmt.Printf("a 的值为: %d
    ", a)
       }
    
       for i,x:= range numbers {                    #这里的i代表索引
          fmt.Printf("第 %d 位 x 的值 = %d
    ", i,x)
       }   
    }
    a 的值为: 0
    a 的值为: 1
    a 的值为: 2
    a 的值为: 3
    a 的值为: 4
    a 的值为: 5
    a 的值为: 6
    a 的值为: 7
    a 的值为: 8
    a 的值为: 9
    a 的值为: 1
    a 的值为: 2
    a 的值为: 3
    a 的值为: 4
    a 的值为: 5
    a 的值为: 6
    a 的值为: 7
    a 的值为: 8
    a 的值为: 9
    a 的值为: 10
    a 的值为: 11
    a 的值为: 12
    a 的值为: 13
    a 的值为: 14
    a 的值为: 150 位 x 的值 = 11 位 x 的值 = 22 位 x 的值 = 33 位 x 的值 = 54 位 x 的值 = 05 位 x 的值 = 0

     

  • 相关阅读:
    寒假了
    【MFC】浏览器中快速打开常用工具
    【转】MFC隐藏进程自身(任务管理器不可见,wSysCheck等工具可见)
    【原】DIY属于自己的鼠标侧键
    coco2dx 3.4final 使用scale9sprite
    linux挂载新硬盘
    关于c语言中的结构体使用偏移量求值问题
    Linux的网卡由eth0变成了eth1,如何修复
    oracle归档管理
    exsi上虚拟因硬盘不足无法启动
  • 原文地址:https://www.cnblogs.com/liusouthern/p/9812124.html
Copyright © 2011-2022 走看看