Go:学习笔记兼吐槽(1)
自动添加分号
在很多其他的编程语言中,每一行代码的结尾都必须有分号(假设一行中只有一句代码),Golang 的开发者认为,既然每行都要加,不如编译器自动来加。当然,你加了分号也不会报错。
Golang 中,在以下两种情况下会自动加入分号:
当输入被断开为标记时,如果行末标记为
一个标识符
一个整数、浮点数、虚数、字符或字符串文字
关键字
break、continue、fallthrough、return
中的一个运算符和分隔符
++、--、)、]、}
中的一个
如果让复合语句占用单独一行,则在
)
或}
后面的分号可以被省略。
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) 浮点数
没有 float
和 double
,而是用 float32
和 float64
表示。
浮点类型默认声明为 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
的范围,可以用 int
或 rune
来定义。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)的更多相关文章
- Go:学习笔记兼吐槽(3)
Go:学习笔记兼吐槽(1) Go:学习笔记兼吐槽(2) Go:学习笔记兼吐槽(3) 数组 Golang 中,数组是值类型. 数组的声明 var arr [10]int 数组的初始化 var arr1 ...
- Go:学习笔记兼吐槽(2)
Go:学习笔记兼吐槽(1) Go:学习笔记兼吐槽(2) Go:学习笔记兼吐槽(3) 基本数据类型和string之间的转换 (1) 基本类型转string 使用 fmt.Sprintf(“%参数”, 表 ...
- Salesforce学习笔记之吐槽
迄今感到的几个不方便 1. SOQL里没有SELECT * ,只好根据参考手册和用vs code的一个插件Schema Explorer来辅助生成SELECT语句. 2. SOQL不支持注释,Deve ...
- R语言学习笔记之: 论如何正确把EXCEL文件喂给R处理
博客总目录:http://www.cnblogs.com/weibaar/p/4507801.html ---- 前言: 应用背景兼吐槽 继续延续之前每个月至少一次更新博客,归纳总结学习心得好习惯. ...
- Android学习笔记之短信验证码的获取和读取
PS:最近很多事情都拖拖拉拉的..都什么办事效率啊!!! 还得吐槽一下移动运营商,验证码超过五次的时候,直接把我的手机号封闭.真是受够了. 学习笔记: 1.Android之如何获取短信验证码. 2.如 ...
- 【Stage3D学习笔记续】真正的3D世界(一):透视矩阵
如果各位看官跟着我的学习笔记一路看过来的话,一定会吐槽我的,这都是什么3D啊?从头到尾整个都是在使用GPU绘制一堆2D图像而已,的确,之前我们一直使用正交矩阵利用GPU加速来实现2D世界的展示,算不上 ...
- Web Service学习笔记(webservice、soap、wsdl、jws详细分析)
Web Service概述 Web Service的定义 W3C组织对其的定义如下,它是一个软件系统,为了支持跨网络的机器间相互操作交互而设计.Web Service服务通常被定义为一组模块化的API ...
- Web Service学习笔记
Web Service概述 Web Service的定义 W3C组织对其的定义如下,它是一个软件系统,为了支持跨网络的机器间相互操作交互而设计.Web Service服务通常被定义为一组模块化的API ...
- Web Service学习笔记(webservice、soap、wsdl、jws详细分析) (转)
Web Service概述 Web Service的定义 W3C组织对其的定义如下,它是一个软件系统,为了支持跨网络的机器间相互操作交互而设计.Web Service服务通常被定义为一组模块化的API ...
随机推荐
- python笔记:#002#第一个python程序
第一个 Python 程序 目标 第一个 HelloPython 程序 Python 2.x 与 3.x 版本简介 执行 Python 程序的三种方式 解释器 -- python / python ...
- 3D Lut 电影级调色算法 附完整C代码
在前面的文章,我提到过VSCO Cam 的胶片滤镜算法实现是3d lut. 那么3d lut 到底是个什么东西呢? 或者说它是用来做什么的? 长话短说,3d lut(全称 : 3D Lookup t ...
- (ospf、rip、isis、EIGRP)常见的动态路由协议简介
路由器要转发数据必须先配置路由数据,通常根据网络规模的大小可设置静态路由或设置动态路由.静态路由配置方便,对系统要求低,适用于拓扑结构简单并且稳定的小型网络.缺点是不能自动适应网络拓扑的变化,需要人工 ...
- arcEngine开发之查看属性表
这篇文章给出实现属性表功能的具体步骤,之后再对这些步骤中的代码进行分析. 环境准备 拖动TOCControl.MapControl控件到Form窗体上,然后拖动ContextMenuStrip控件至T ...
- Python_跟随目标主机IP变换
''' 为了防止黑客攻击或者负载均衡,会经常变换主机,这样同一个域名在不同时间可能会对应不同的IP地址,在这种情况下可以通过 socket模块的gethostbyname()函数来实时获取目标主机的I ...
- 如何使用RedisTemplate访问Redis数据结构
RedisTemplate介绍 spring封装了RedisTemplate对象来进行对redis的各种操作,它支持所有的 redis 原生的api. RedisTemplate在spring代码中的 ...
- SSM-MyBatis-05:Mybatis中别名,sql片段和模糊查询加getMapper
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 简单概述一下本讲 别名,sql片段简单写一下,模糊查询多写一点 一.别名 <typeAliases> ...
- 以太坊ERC20代币开发
以太坊ERC20代币开发首先需要对以太坊,代币,ERC20,智能合约等以太坊代币开发中的基本概念有了解.根据我们的示例代码就可以发行自己的以太坊代币. 什么是ERC20 可以把ERC20简单理解成以太 ...
- C++的反思[转]
最近两年 C++又有很多人出来追捧,并且追捧者充满了各种优越感,似乎不写 C++你就一辈子是低端程序员了,面对这种现象,要不要出来适时的黑一下 C++呢?呵呵呵. 咱们要有点娱乐精神,关于 C++的笑 ...
- Linux kernel的中断子系统之(六):ARM中断处理过程
返回目录:<ARM-Linux中断系统>. 总结:二中断处理经过两种模式:IRQ模式和SVC模式,这两种模式都有自己的stack,同时涉及到异常向量表中的中断向量. 三ARM处理器在感知到 ...