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. Spring结合log4j(slf4j)

    maven依赖         <!-- slf4j (级联:log4j/slf4j-api) --> <dependency>         <groupId> ...

  2. XShell上传文件到Linux服务器上

    在学习Linux过程中,我们常常需要将本地文件上传到Linux主机上,这里简单记录下使用Xsheel工具进行文件传输 1:首先连接上一台Linux主机 2:输入rz命令,看是否已经安装了lrzsz,如 ...

  3. JavaScript (一、ECMAScript )

    一.js简介和变量 1.JavaScript的概述组成和特点 a.JavaScript 是脚本语言,是世界上最流行的编程语言,这门语言可用于 HTML 和 web,更可广泛 用于服务器.PC.笔记本电 ...

  4. .NET开发微信小程序-接收微信支付回调数据

    获取微信支付传回来的数据 1.MVC控制器 /// <summary> /// 付款返回的数据 /// </summary> /// <returns></r ...

  5. Nginx安装及配置

    Nginx是一款速度快,功能强大的http以及反向代理服务器,经过简单的配置之后即可以用来托管页面. 不幸的是,和很多其他系统管理工具一样,相关的原理教程和配置说明文档都很少.虽然官方提供了一个wik ...

  6. @component @bean区别

    from: http://stackoverflow.com/questions/10604298/spring-component-versus-bean http://stackoverflow. ...

  7. Scrapy爬虫框架第五讲(linux环境)【download middleware用法】

    DOWNLOAD MIDDLEWRE用法详解 通过上面的Scrapy工作架构我们对其功能进行下总结: (1).在Scheduler调度出队列时的Request送给downloader下载前对其进行修改 ...

  8. Linux用户登录日志查询

    # 1 utmp.wtmp.btmp文件 Linux用户登录信息放在三个文件中: 1 /var/run/utmp:记录当前正在登录系统的用户信息,默认由who和w记录当前登录用户的信息,uptime记 ...

  9. windows远程桌面到linux

    centos:  http://lovesoo.org/xmanager-to-connect-to-the-remote-desktop-centos.html redhat:  http://ww ...

  10. Kali Linux安装中文输入法全纪录

    前言: 我使用的是英文版的Kali,默认没有安装中文输入法,也没有安装小企鹅(我后来才知道),折腾了很久,现在终于可以在Kali里输入中文了(这篇文章就是在Kali里面用leafpad写的).安装的过 ...