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. Java多线程:synchronized的可重入性

    从Java多线程:线程间通信之volatile与sychronized这篇文章中我们了解了synchronized的基本特性,知道了一旦有一个线程访问某个对象的synchronized修饰的方法或代码 ...

  2. Qt中绘制五子棋棋盘

    一个需要做大作业的同学问我相关内容,就顺手写了一个,贴出来. 项目包含头文件 mainwindowh,源文件mainwindow.cpp和主函数main.cpp. 如下: mainwindow.h # ...

  3. api大全

    免费api大全(更新中) API大全  http://www.apidq.com/    (这个碉堡了) 天气接口 气象局接口 完整数据:http://m.weather.com.cn/data/10 ...

  4. 第六章 MySQL 查询

    查询数据表 语法: SELECT {* | <字段列表>} [ FROM <表1>, <表2>.... [ where <表达式> ] [ group ...

  5. PAT1133:Splitting A Linked List

    1133. Splitting A Linked List (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Y ...

  6. selenium webdriver (python)的基本用法一

    阅在线 AIP 文档:http://selenium.googlecode.com/git/docs/api/py/index.html目录一.selenium+python 环境搭建........ ...

  7. swap分析及其使用

    什么是swap swap主要是在内存不够用的时候,将部分内存上的数据交换到swap空间上,以便让系统不会因为内存不够用而导致oom或者更致命的情况出现.当内存使用存在压力的时候,开始触发内存回收行为, ...

  8. Spring 数据处理框架的演变

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 定量分析的成败在很大程度上取决于采集,存储和处理数据的能力.若能及时地向业务决策者提供深刻并可靠的数据解读,大数据项目就会有更多机会取得成功 ...

  9. 优雅地实现CSS Animation delay

    今天写一个css动画时遇到一个有意思的问题,记录如下: 1.需求: 等待元素A的动画加载完,再加载B元素的动画(下图中A为大熊猫,B为下方卡片) 先来看下最后的效果啦: 2.初始思路: 在B元素的动画 ...

  10. 《javascript语言精粹》读书笔记 Item1 精华与语法

    第一章 精华 任何语言都有其精华的部分和鸡肋的部分,javascript也不例外,而且鸡肋的部分还很多.但javascript的流行却不受他的质量影响. javascript为何如此流行?因为他是we ...