zoukankan      html  css  js  c++  java
  • 【Go】学习笔记兼吐槽(1)

     

    Go:学习笔记兼吐槽(2)

    Go:学习笔记兼吐槽(3)

     


     

    自动添加分号

    在很多其他的编程语言中,每一行代码的结尾都必须有分号(假设一行中只有一句代码),Golang 的开发者认为,既然每行都要加,不如编译器自动来加。当然,你加了分号也不会报错。

    Golang 中,在以下两种情况下会自动加入分号:

    1. 当输入被断开为标记时,如果行末标记为

      • 一个标识符

      • 一个整数、浮点数、虚数、字符或字符串文字

      • 关键字 break、continue、fallthrough、return 中的一个

      • 运算符和分隔符 ++、--、)、]、} 中的一个

    2. 如果让复合语句占用单独一行,则在 )} 后面的分号可以被省略。

    Golang 的这个特性,产生了很多写法上的强制性规定。

    (1)函数的左括号 { 必须和函数定义写在同一行

    这种写法在其他语言中是绝对没有问题的,但是在 Golang 中会报找不到方法体,因为根据上面的规则,编译器会在 func main() 后面自动加上分号。

    (2)一条语句只能写在一行中

    如果你一定要把两条语句写在一行中,那么也是可以的,但是必须要在第一条语句后面手动加上分号。但是强烈不建议这么做。

    (3)用 + 拼接字符串时,如果要换行,+ 必须留在行末
    var str string = "hello world " + 
        "hello world"

    这是可以的,但如果写成以下形式就不可以了,会报 invalid operation: + untyped string,因为编译器会在第一行末尾添加分号。


    其他例子还有很多,这里就不一一例举了,当你用了一个在其他语言中非常合理的写法而 Golang 编译报错时,首先想想看,如果每一句后面都加个分号,代码还是你预期中的样子吗。

    回车和换行

    是回车符(return),作用是使光标移动到本行的开始位置;
    是换行符(newline),作用是使光标垂直向下移动一格;
    所以我们一般用 来新起一行。

    至于为什么回车和换行要分开,这是一个历史遗留问题。而现今在很多语言中, 都能起到新起一行的作用。但是在 Golang 中, 依然只保留了其原始的回车作用。 都能起到换行的作用。

    示例 1:
    fmt.Println("hello
    world!")

    运行结果:

    hello
    world!
    示例 2:
    fmt.Println("hello
    world!")

    运行结果:

    world!

    这虽然有点坑,但其实还好,一般人换行符都会用 ,很少有人会用 吧。

    定义的变量或导入的包如果没有使用到,代码编译不能通过

    这是强迫症患者的福音,例如我

    变量的定义

    (1)一般定义

    一般语言中,定义变量时是类型在前,变量名在后:

    int i = 10

    在 Golang 中,是反过来的:

    var i int = 10

    包括函数传参时亦是如此:

    func test(str string){
        fmt.Println(str)
    }
    (2)类型推导

    定义时若不声明类型直接赋值,会根据值自行判定变量类型

    var i = 10    // i 就是 int 类型
    (3)省略 var
    name := "Tom"

    注意::=,冒号不可省略,省略后就变成赋值了。并且变量名不能是已经声明过的,因为这是声明并赋值。
    上面的语句等价于:

    var name string
    name = "Tom"
    (4)一次性声明多个变量
    // 方法一
    var n1, n2, n3 int

    //方法二
    var name, age = "Tom"20

    //方法三:类型推导
    name, age := "Tom"20
    (5)声明全局变量
    //方法一
    var name string = "Tom"
    var age int = 20

    //方法二
    var (
        name = "Tom"
        age = 20
    )

    基本数据类型

    (1) 整数

    整数的类型有很多,int、int8、int16、int32、int64,还有 uint 系列。这里要说明一下的是 int 这个类型,它在 32 位系统中占 4 个字节,64 位系统中占 8 个字节。定义变量时,整数的默认推导类型就是 int 型。

    这里有个吐槽点,我在下面的隐式转换中再来吐槽。

    (2) 浮点数

    没有 floatdouble,而是用 float32float64 表示。
    浮点类型默认声明为 64 位。

    var f = 3.14
    fmt.Printf("%T", f)
    // 输出 float64

    也可以用科学计数法来表示( E 和 e 都可以)

    var f = 3.14E2
    (3) 字符类型(char)

    Golang 中没有专门的字符类型,如果要存储单个的字符,一般用 byte 来保存。

    字符串是一串固定长度的字符连接起来的字符序列。在其他语言中,字符串是由字符组成的,而 Golang 的字符串不同,它是由字节组成的。(此处有坑,稍后详解)

    var c byte = 'a'
    fmt.Println("C =", c)
    // 输出 97

    当直接输出字符的值时,实际输出的是字符对应的码值。如果需要输出字符,则需要用格式化输出。

    fmt.Printf("c = %c", c)

    Golang 中,中文也可以是一个字符,这在其他一些语言中是不可以的。但是中文的码值显然超出了 byte 的范围,可以用 intrune 来定义。Golang 中统一使用 UTF-8 编码。

    var c rune = '中'
    fmt.Printf("%v %c", c, c)
    (4) 字符串

    多行字符串,用 ` (ESC下面那个键)引起来

    var str string = `hello
    world`

    字符串的默认值是 ""

    隐式转换

    Golang 没有隐式转换,所有不同类型变量之间必须显示转换。类型转换的基本语法类似 python。

    var i int = 100
    var f float32 = float32(i)

    将一个大的数据类型转换为一个小的数据类型时(例如 int64 转 int32),可能导致溢出,溢出不会报错。

    var num1 int64 = 999999
    var num2 int8 = int8(num1)  // 转换结果是63

    吐槽开始,也许你觉得,隐式转换没有就没有吧,最多用的时候强转一下。看下面的代码,你还会觉得如此吗?



    不同类型无法比较。想说 fuck 吗?
    之前说道 int 类型的时候,有个要吐槽的,来看下面的代码!


    不管你是啥系统,int 和 int32、int64 都是不同的类型,想直接比较?没门!

     

  • 相关阅读:
    Redis学习手册(Set数据类型)
    Redis学习手册(Key操作命令)
    Redis学习手册(String数据类型)
    Redis学习手册(开篇)
    SQLite学习手册(目录)
    Redis学习手册(Hashes数据类型)
    Redis学习手册(SortedSets数据类型)
    Redis学习手册(List数据类型)
    加密,解密
    异步 '省','市','区' 三级连动
  • 原文地址:https://www.cnblogs.com/gl1573/p/10261281.html
Copyright © 2011-2022 走看看