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 编译报错时,首先想想看,如果每一句后面都加个分号,代码还是你预期中的样子吗。

回车和换行

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

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

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

运行结果:

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

运行结果:

world!

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

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

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

变量的定义

(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 都是不同的类型,想直接比较?没门!

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. AndroidEclipse里的视图里想添加SDK Manager但是找不到怎么办?

    有时候,我们想配置SDK Manager,但是发现找不到这个窗口,怎么办呢,网上有解释(上截图): —————————————————————————————————————————————————— ...

  2. Manifest文件的最新理解

    今天看了Manifest文件内容的相关视频,感觉对知识的理解深刻了一些: 首先,先来说说这个文件的作用,这个文件可以说是聚集了很多个标签,其实对于每个主标签,在将来编译的时候,都会被处理成一个类,而标 ...

  3. SVN使用指引(Windows)

    SVN使用指引(本地服务器为Windows) 原:http://wiki.open.qq.com/wiki/SVN%E4%BD%BF%E7%94%A8%E6%8C%87%E5%BC%95%EF%BC% ...

  4. 2017年Kali Linux更新源

    终端输入: leafpad /etc/apt/sources.list 打开更新源配置文件,将下面的更新源复制到原内容的前面: #163网易 Kali源 deb http://mirrors.163. ...

  5. Kali Linux图形界面与命令行界面的切换

    前言: 有时候为了节约系统资源,使用命令行界面能够让Linux系统的运行更加流畅,处理任务的速度也更加快.现在的Kali安装完成后默认是开机就启动图形化界面.本文将介绍通过编辑Kali启动引导文件的方 ...

  6. TGI

    淘宝的很多分析会用到TGI这个指标,但是是如何计算的以及该如何理解和应用这个指标?TGI:即Target Group Index(目标群体指数)TGI指数= [目标群体中具有某一特征的群体所占比例/总 ...

  7. sessionStorage的保存和获取

    保存一组数组,需要转换为字符串格式: var arr = [1,2,3]; var str = JSON.stringify(arr); window.sessionStorage.setItem(' ...

  8. Struts2(一)---struts2的环境搭建及实例

    刚刚接触struts2,有点懵懵懂懂,还是习惯于先写代码,然后慢慢来理解其中的思想. 这篇文章主要内容是strusts的环境搭建及通过一个简单的例子来理解到底是怎么使用struts来简化编程的. 1. ...

  9. 把一个机器上1天内新增的文件用rsync传送到另外一台机器

    我的shell很菜,只好用shell和php结合来做 1.查找新增的文件,构造rsync的参数,把结果写入到log中 find /data/bmob/test/teststorage/data/ -m ...

  10. selenium 定位元素成功, 但是输入失败 (textarea)

    问题描述 UI页面功能测试中, 定位元素并输入(通过sendKey()方法输入), 显示输入失败. 根本原因 为了修复一个bug, 这个元素从input改成了textarea, 而textarea是有 ...