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

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


自动添加分号

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

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

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

    • 一个标识符

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

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

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

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

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

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

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

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

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

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

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

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

回车和换行

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

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

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

运行结果:

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

运行结果:

  1. world!

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

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

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

变量的定义

(1)一般定义

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

  1. int i = 10

在 Golang 中,是反过来的:

  1. var i int = 10

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

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

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

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

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

  1. var name string
    name = "Tom"
(4)一次性声明多个变量
  1. // 方法一
    var n1, n2, n3 int
  2. //方法二
    var name, age = "Tom", 20
  3. //方法三:类型推导
    name, age := "Tom", 20
(5)声明全局变量
  1. //方法一
    var name string = "Tom"
    var age int = 20
  2. //方法二
    var (
        name = "Tom"
        age = 20
    )

基本数据类型

(1) 整数

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

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

(2) 浮点数

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

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

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

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

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

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

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

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

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

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

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

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

  1. var str string = `hello
    world`

字符串的默认值是 ""

隐式转换

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

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

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

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

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

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

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

Go:学习笔记兼吐槽(1)的更多相关文章

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

    Go:学习笔记兼吐槽(1) Go:学习笔记兼吐槽(2) Go:学习笔记兼吐槽(3) 数组 Golang 中,数组是值类型. 数组的声明 var arr [10]int 数组的初始化 var arr1  ...

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

    Go:学习笔记兼吐槽(1) Go:学习笔记兼吐槽(2) Go:学习笔记兼吐槽(3) 基本数据类型和string之间的转换 (1) 基本类型转string 使用 fmt.Sprintf(“%参数”, 表 ...

  3. Salesforce学习笔记之吐槽

    迄今感到的几个不方便 1. SOQL里没有SELECT * ,只好根据参考手册和用vs code的一个插件Schema Explorer来辅助生成SELECT语句. 2. SOQL不支持注释,Deve ...

  4. R语言学习笔记之: 论如何正确把EXCEL文件喂给R处理

    博客总目录:http://www.cnblogs.com/weibaar/p/4507801.html ---- 前言: 应用背景兼吐槽 继续延续之前每个月至少一次更新博客,归纳总结学习心得好习惯. ...

  5. Android学习笔记之短信验证码的获取和读取

    PS:最近很多事情都拖拖拉拉的..都什么办事效率啊!!! 还得吐槽一下移动运营商,验证码超过五次的时候,直接把我的手机号封闭.真是受够了. 学习笔记: 1.Android之如何获取短信验证码. 2.如 ...

  6. 【Stage3D学习笔记续】真正的3D世界(一):透视矩阵

    如果各位看官跟着我的学习笔记一路看过来的话,一定会吐槽我的,这都是什么3D啊?从头到尾整个都是在使用GPU绘制一堆2D图像而已,的确,之前我们一直使用正交矩阵利用GPU加速来实现2D世界的展示,算不上 ...

  7. Web Service学习笔记(webservice、soap、wsdl、jws详细分析)

    Web Service概述 Web Service的定义 W3C组织对其的定义如下,它是一个软件系统,为了支持跨网络的机器间相互操作交互而设计.Web Service服务通常被定义为一组模块化的API ...

  8. Web Service学习笔记

    Web Service概述 Web Service的定义 W3C组织对其的定义如下,它是一个软件系统,为了支持跨网络的机器间相互操作交互而设计.Web Service服务通常被定义为一组模块化的API ...

  9. Web Service学习笔记(webservice、soap、wsdl、jws详细分析) (转)

    Web Service概述 Web Service的定义 W3C组织对其的定义如下,它是一个软件系统,为了支持跨网络的机器间相互操作交互而设计.Web Service服务通常被定义为一组模块化的API ...

随机推荐

  1. python笔记:#002#第一个python程序

    第一个 Python 程序 目标 第一个 HelloPython 程序 Python 2.x 与 3​​.x 版本简介 执行 Python 程序的三种方式 解释器 -- python / python ...

  2. 3D Lut 电影级调色算法 附完整C代码

    在前面的文章,我提到过VSCO Cam 的胶片滤镜算法实现是3d lut. 那么3d lut  到底是个什么东西呢? 或者说它是用来做什么的? 长话短说,3d lut(全称 : 3D Lookup t ...

  3. (ospf、rip、isis、EIGRP)常见的动态路由协议简介

    路由器要转发数据必须先配置路由数据,通常根据网络规模的大小可设置静态路由或设置动态路由.静态路由配置方便,对系统要求低,适用于拓扑结构简单并且稳定的小型网络.缺点是不能自动适应网络拓扑的变化,需要人工 ...

  4. arcEngine开发之查看属性表

    这篇文章给出实现属性表功能的具体步骤,之后再对这些步骤中的代码进行分析. 环境准备 拖动TOCControl.MapControl控件到Form窗体上,然后拖动ContextMenuStrip控件至T ...

  5. Python_跟随目标主机IP变换

    ''' 为了防止黑客攻击或者负载均衡,会经常变换主机,这样同一个域名在不同时间可能会对应不同的IP地址,在这种情况下可以通过 socket模块的gethostbyname()函数来实时获取目标主机的I ...

  6. 如何使用RedisTemplate访问Redis数据结构

    RedisTemplate介绍 spring封装了RedisTemplate对象来进行对redis的各种操作,它支持所有的 redis 原生的api. RedisTemplate在spring代码中的 ...

  7. SSM-MyBatis-05:Mybatis中别名,sql片段和模糊查询加getMapper

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 简单概述一下本讲 别名,sql片段简单写一下,模糊查询多写一点 一.别名 <typeAliases> ...

  8. 以太坊ERC20代币开发

    以太坊ERC20代币开发首先需要对以太坊,代币,ERC20,智能合约等以太坊代币开发中的基本概念有了解.根据我们的示例代码就可以发行自己的以太坊代币. 什么是ERC20 可以把ERC20简单理解成以太 ...

  9. C++的反思[转]

    最近两年 C++又有很多人出来追捧,并且追捧者充满了各种优越感,似乎不写 C++你就一辈子是低端程序员了,面对这种现象,要不要出来适时的黑一下 C++呢?呵呵呵. 咱们要有点娱乐精神,关于 C++的笑 ...

  10. Linux kernel的中断子系统之(六):ARM中断处理过程

    返回目录:<ARM-Linux中断系统>. 总结:二中断处理经过两种模式:IRQ模式和SVC模式,这两种模式都有自己的stack,同时涉及到异常向量表中的中断向量. 三ARM处理器在感知到 ...