go 语言第二节课

变量知识点

  • 定义以及初始化变量
     // 1.定义一个变量

     var num int
     num = 666
     // 注意点: 在Go语言中, 输出整型只能使用%d, 不能使用%i
     fmt.Printf("%d\n", num)


     // 2.先定义再初始化
    var num int
    num = 888
    fmt.Printf("%d\n", num)
    var num int
    num = 10
    fmt.Printf("%d\n",num)

    // 3.定义的同时初始化
    var num int = 999
    fmt.Printf("%d", num)
    var num int = 10
    fmt.Printf("%d\n",num)

    // 4.定义的同时初始化, 并省略数据类型
    var num  = 999
    fmt.Printf("%d\n", num)
    // 在Go语言中, 可以利用%T输出变量的数据类型
    fmt.Printf("%T\n", num)
    var num = 10
    fmt.Printf("%d\n",num)

    // 5.定义的同时初始化, 并省略数据类型和var
    :=做了两件事情 , 1.会先定义一个变量 2.给定义的变量赋值
    在Go语言开发中非常非常非常常用
    num := 666
    fmt.Printf("%d\n", num)
    num := 10
    fmt.Printf("%d\n",num)

    // 6.:=注意点
    var num := 666 // 语法错误
    num int := 666 // 语法错误
    fmt.Printf("%d\n", num)

    var num int = 666
    // var num int
    // num = 888
    num := 888 // 重复定义
    fmt.Printf("%d\n", num)
  • 变量的连续定义
     // 1.通过逗号定义多个变量

     var a, b, c int
     a = 123
     b = 456
     c = 789
     fmt.Printf("%d,%d,%d\n", a, b, c)


     // 2.通过变量组定义多个变量

     var(
        a int
        b int
        c int
     )
    a = 123
    b = 456
    c = 789
    fmt.Printf("%d,%d,%d\n", a, b, c)


     // 3.同时定义多个变量, 并且同时初始化
     var a, b, c int = 10, 20, 30
     var a, b, c = 10, 20, 30
    a, b, c := 10, 20, 30
    fmt.Printf("%d,%d,%d\n", a, b, c)


    // 4.同时定义多个变量, 并且同时初始化
    var(
        a int = 10
        b int = 20
        c int = 30
    )

    var(
        a  = 10
        b  = 20
        c  = 30
    )
    fmt.Printf("%d,%d,%d\n", a, b, c)
  • 局部变量与全局变量的关系

    • 1.什么是局部变量?
      1.1在C语言中写在{}中或者函数中或者函数的形参, 就是局部变量
      1.2Go语言中的局部变量和C语言一样

    • 2.什么是全局变量?
      2.1在C语言中写在函数外面的就是全局变量
      2.2Go语言中的全局变量和C语言一样

    • 3.局部变量和全局变量的作用域
      3.1在C语言中局部变量的作用域是从定义的那一行开始, 直到遇到}结束或者遇到return为止
      3.2Go语言中局部变量的作用域和C语言一样
      3.3在C语言中全部变量的作用域是从定义的那一行开始, 直到文件末尾为止
      3.4Go语言中的全局变量, 只要定义了, 在定义之前和定义之后都可以使用

    • 4.局部变量和全局变量的生命周期
      4.1在C语言中局部变量, 只有执行了才会分配存储空间, 只要离开作用域就会自动释放, C语言的局部变量存储在栈区
      4.2Go语言局部变量的生命周期和C语言一样
      4.3在C语言中全局变量, 只要程序一启动就会分配存储空间, 只有程序关闭才会释放存储空间, C语言的全局变量存储在静态区(数据区)
      4.4Go语言全局变量的生命周期和C语言一样

    • 5.局部变量和全局变量的注意点
      5.1在C语言中相同的作用域内, 不能出现同名的局部变量
      5.2Go语言和C语言一样, 相同的作用域内, 不能出现同名的局部变量
      5.3在C语言中相同的作用域内, 可以出现同名的全局变量
      5.4在Go语言中相同的作用域内, 不能出现同名的全局变量

    • 6.特殊点
      6.1在C语言中局部变量没有初始化存储的是垃圾数据, 在Go语言中局部变量没有初始化, 会默认初始化为0
      6.2在C语言中全局变量没有初始化存储的是0, Go语言和C语言一样
      6.3在Go语言中, 如果定义了一个局部变量, 但是没有使用这个局部变量, 编译会报错
      6.4在Go语言中, 如果定义了一个全局变量, 但是没有使用这个全局变量, 编译不会报错

  • 变量的一些注意点

    • 1.相同的作用域内, 无论是全局变量还是局部变量, 都不能出现同名的变量
      2.变量离开作用域就不能使用
      3.局部变量如果没有使用, 编译会报错, 全局变量如果没有使用, 编译不会报错
      4.:=只能用于局部变量, 不能用于全局变量
      5.:=如果用于同时定义多个变量, 会有退化赋值现象
//退化赋值
num := 123
// 如果通过:=定义多个变量, 但是多个变量中有的变量已经在前面定义过了, 那么只会对没有定义过的变量执行:=
// 而定义过的变量只执行=操作
num, value := 456, 789
fmt.Printf("%d, %d", num, value)

数据类型转换

  • 在 GO 语言中,数据类型转换只有显示类型转换
    // 1.没有隐式转换, 会报错
    var num int = 3.14

    // 2.不能对一个常量进行强制转换
    var num int = int(3.14)

    // 3.正确的做法
    var num float64 = 3.14
    var value int = int(num)
    fmt.Printf("%d\n", value)

    // 4.注意点:
    // 4.1在Go语言中数据类型必须一模一样, 才能直接赋值
   var num int32 = 666
   var value int64 = int64(num)
   //var value int32 = num
   fmt.Printf("%d\n", value)

   // 4.2特殊情况
   byte --> uint8
   var ch byte = 'a'
   var num uint8 = ch
   fmt.Printf("%c\n", num)

   // rune --> int32
   var ch rune = '李'
   var num int32 = ch
   fmt.Printf("%c\n", num)

   // 4.3bool类型不能强制转换为整型
   var flag bool = false
   var num int = int(flag)
   fmt.Printf("%d\n", num)

   // 5.整型也可以通过T(v)转换为字符串类型, 但是在企业开发中不要这么干
   var num int = 97
   var str string = string(num)
   fmt.Printf("%s\n", str)
  • 数值类型转换为字符串类型,2种方式: 1) strconv.FormatXxx() ; 2) strconv.Itoa
    1.strconv.FormatXxx()
      var num int = 9
     //第一个参数: 需要转换的整数, 必须是int64类型的
     //第二个参数: 转换为多少进制的字符串
     var str string = strconv.FormatInt(int64(num), 10) //  "9"
     var str string = strconv.FormatInt(int64(num), 2)  // "1001"
     fmt.Printf("%s\n", str)
     var num float32 = 3.1234567890123456789
     // 第一个参数: 需要转换的小数, 必须是float64类型的
     // 第二个参数: 按照什么格式转换 'f'小数格式 'e' 指数的格式
     // 第三个参数: 保留多少位小数, 传入-1按照原始类型的精度保留
     // 第四个参数: 原始类型的标志  float32 --> 32  float64 --> 64
     var str string = strconv.FormatFloat(float64(num), 'f', -1, 32) // "3.1234567"
     var str string = strconv.FormatFloat(float64(num), 'f', -1, 64) // "3.123456789012345"
    var str string = strconv.FormatFloat(float64(num), 'f', 2, 32)  // "3.12"
    fmt.Printf("%s\n", str)
    var flag bool = false
    var str string = strconv.FormatBool(flag) // "false"
    fmt.Printf("%s\n", str)

2.strconv.Itoa

    var num int = 1001
    var str string = strconv.Itoa(int(num))
    fmt.Printf("%s\n", str)
  • 字符串类型转换为数值类型: 1) strconv.ParseXxx() ; 2) strconv.Atoi()
    1.strconv.ParseXxx()
     var str string = "1001"
     // 第一个参数: 需要转换的字符串
     // 第二个参数: 被转换的字符串保存的整数是多少进制的
     // 第三个参数: 期望转换为多少位的整数(不一定准确), 换句话说就是要转换为多少位整数
     // 注意点: 如果被转换的字符串超出了指定的长度会报错
     // 返回值:
     // 返回值的第一个: 转换之后的数值, 是int64类型
     // 返回值的第二个: 如果转换成功返回nil, 如果转换失败就不是nil
     // int8   -128~127
     //num, err := strconv.ParseInt(str, 10, 8)
     num, err := strconv.ParseInt(str, 2, 8)
     if err != nil{
        fmt.Printf("转换失败\n")
     }else{
        fmt.Printf("%d\n", num)
        fmt.Printf("%T\n", num)
     }
    var str string = "3.1234567890123456789"
    // 第一个参数: 需要转换的字符串
    // 第二个参数: 要将字符串中的小数转换为单精度还是双精度, 单精度传入32, 双精度传入64
    // 返回值:
    // 第一个返回值: 转换之后的小数, float64类型
    // 第二个返回值: 转换成功返回nil, 转换失败不为nil
    //num, err := strconv.ParseFloat(str, 32)
    num, err := strconv.ParseFloat(str, 64)
    if err != nil{
        fmt.Printf("转换失败\n")
    }else{
        //fmt.Printf("%f\n", num)
        fmt.Println(num)
        fmt.Printf("%T\n", num)
    }
     var str string = "false"
     flag, err := strconv.ParseBool(str)
    if err != nil{
        fmt.Printf("转换失败\n")
    }else{
        // 注意点: 在Go语言中%t输出布尔类型
        fmt.Printf("%t\n", flag)
        fmt.Printf("%T\n", flag)
    }

2.strconv.Atoi()

    var str string = "1001"
    num, err := strconv.Atoi(str)
    if err != nil{
        fmt.Printf("转换失败\n")
    }else {
        fmt.Printf("%d\n", num)
    }

常量知识点

  • 1.在C语言中可以通过const来定义常量
  • 2.在Go语言中一样
  • 3.格式:
    const 变量名称 数据类型 = 值;
  • 注意点:
      1. 数据类型可以省略, 但是const不能省略
    • 2.定义常量不能使用 := , := 是专门用于定义局部变量的

    • 3.定义局部变量没有使用, 编译会报错, 定义全局变量和常量没有使用, 不会报错

    • 4.在Go语言中可以连续定义多个变量, 所以也可以连续定义多个常量

格式:
    const 变量名称1, 变量名称2 数据类型 = 值1, 值2;
    const(
      变量名称1 数据类型 = 值1
      变量名称2 数据类型 = 值2
    )
  • 在常量组中, 如果常量没有赋值, 那么默认值就是上一行的取值
    const num1,num2,num3 = 1,2,3
    const(
        num5 = 4
        num4 = 5
        num6 = 6
    )
    fmt.Println(num5,num4,num6)
     // 1.定义单个常量
    const num int  =  666
    const num  =  666
    const num  =  666
    //num = 789
    fmt.Printf("%d\n", num)

    // 2.定义多个常量
    const a, b, c int  = 10, 20, 30
    const a, b, c  = 10, 20, 30
    a = 666
    b = 777
    c = 888
    
    //3.常量组的注意点
    //在常量组中, 如果常量没有赋值, 那么默认值就是上一行的取值
    const(
        a  = 666
        b  = 789
        c
    )
    fmt.Printf("%d, %d, %d", a, b, c)
  • 枚举常量: 定义方式是使用 const
    • 1.C语言中的枚举本质就是一个整数
      enum 枚举名 { 枚举元素1 = 值, 枚举元素2 = 值, …… };

    • 2.Go语句中没有明确枚举的固定写法, 但是在企业开发中一般都会常量组的形式来表示枚举
      const( 枚举元素 = 值 枚举元素 = 值 )

    // 1.iota迭代器, 默认会从0开始递增

    const(
        male = iota
        female = iota
        yao = iota
    )
    // 2.只要常量组中出现了iota, 该常量组中后续的常量都会一次递增1
    const(
        male = iota
        female
        yao
    )
    // 3.如果常量组中的iota被打断了, 那么就不会继续递增了, 会按照常量组的默认方式处理(上一行的值)
    const(
        male = iota
        female = 666
        yao
    )

    // 4.如果常量组中的iota被打断了, 但是后续又被回复了, 那么前面有多少行就会递增多少
    const(
        male = iota
        female = 666
        yao = iota
    )

输入输出函数

  • 与 C 语言类似,不做赘述.
    原文作者:我叫你猜猜
    原文地址: https://www.jianshu.com/p/f8d58694a5f2
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞