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. C#System.Text.RegularExpressions.Regex使用(一) .

    需要引入命名空间 using System.Text.RegularExpressions;(若不引入,则写Regex时要写成 System.Text.RegularExpressions.Regex ...

  2. django相关网站

    记录django的学习笔记:http://www.cnblogs.com/qwj-sysu/tag/django/ uwsgi的文档:http://uwsgi-docs.readthedocs.io/ ...

  3. vue项目中解决type=”file“ change事件只执行一次的问题

    问题描述 在最近的项目开发中遇到了这样的一个问题,当我上传了一个文件时,我将获取到的文件名清空后,却无法再次上传相同的文件 <template> <div class="h ...

  4. linux编译安装时常见错误解决办法

    This article is post on https://coderwall.com/p/ggmpfa 原文链接:http://www.bkjia.com/PHPjc/1008013.html ...

  5. Android 不规则图像填充 小玩着色游戏

    转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/45788433: 本文出自:[张鸿洋的博客] 一.概述 近期群里偶然看到一哥们在 ...

  6. Android 源码解析 之 setContentView

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/41894125,本文出自:[张鸿洋的博客] 大家在平时的开发中,对于setCont ...

  7. ASP.NET Core 2 学习笔记(一)

    来势汹汹的.NET Core似乎要取代.NET Framework,ASP.NET也随之发布.NET Core版本.虽然名称沿用ASP.NET,但相对于ASP.NET确实有许多架构上的差异,可以说除了 ...

  8. Django+Bootstrap+Mysql 搭建个人博客(六)

    6.1.comments插件 (1)安装 pip install django-contrib-comments (02)settings INSTALLED_APPS = [ 'django.con ...

  9. 一句python代码搭建FTP服务

    环境搭建: python windows/linux pip install pyftpdlib (安装失败请到这里下载:https://pypi.python.org/pypi/pyftpdlib/ ...

  10. Redis in Python:HyperLogLog(pfadd、pfcount、pfmerge)

    redis HyperLogLog 可以接受多个元素作为输入,并给出输入元素的基数估算值. 基数:集合中不同元素的数量.比如 [foo', 'bar', 'foobar', 'bar', 'test' ...