Go:学习笔记兼吐槽(2)html
Go:学习笔记兼吐槽(3)python
在不少其余的编程语言中,每一行代码的结尾都必须有分号(假设一行中只有一句代码),Golang 的开发者认为,既然每行都要加,不如编译器自动来加。固然,你加了分号也不会报错。nginx
Golang 中,在如下两种状况下会自动加入分号:apache
当输入被断开为标记时,若是行末标记为编程
一个标识符app
一个整数、浮点数、虚数、字符或字符串文字编程语言
关键字 break、continue、fallthrough、return
中的一个函数
运算符和分隔符 ++、--、)、]、}
中的一个post
若是让复合语句占用单独一行,则在 )
或 }
后面的分号能够被省略。学习
Golang 的这个特性,产生了不少写法上的强制性规定。
这种写法在其余语言中是绝对没有问题的,可是在 Golang 中会报找不到方法体,由于根据上面的规则,编译器会在 func main()
后面自动加上分号。
若是你必定要把两条语句写在一行中,那么也是能够的,可是必需要在第一条语句后面手动加上分号。可是强烈不建议这么作。
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
都能起到换行的做用。
fmt.Println("hello\nworld!")
运行结果:
hello
world!
fmt.Println("hello\rworld!")
运行结果:
world!
这虽然有点坑,但其实还好,通常人换行符都会用
\r\n
或\n
,不多有人会用\r
吧。
这是强迫症患者的福音,例如我
通常语言中,定义变量时是类型在前,变量名在后:
int i = 10
在 Golang 中,是反过来的:
var i int = 10
包括函数传参时亦是如此:
func test(str string){
fmt.Println(str)
}
定义时若不声明类型直接赋值,会根据值自行断定变量类型
var i = 10 // i 就是 int 类型
name := "Tom"
注意:是 :=
,冒号不可省略,省略后就变成赋值了。而且变量名不能是已经声明过的,由于这是声明并赋值。
上面的语句等价于:
var name string
name = "Tom"
// 方法一
var n1, n2, n3 int
//方法二
var name, age = "Tom", 20
//方法三:类型推导
name, age := "Tom", 20
//方法一
var name string = "Tom"
var age int = 20
//方法二
var (
name = "Tom"
age = 20
)
整数的类型有不少,int、int八、int1六、int3二、int64,还有 uint 系列。这里要说明一下的是 int 这个类型,它在 32 位系统中占 4 个字节,64 位系统中占 8 个字节。定义变量时,整数的默认推导类型就是 int 型。
这里有个吐槽点,我在下面的隐式转换中再来吐槽。
没有 float
和 double
,而是用 float32
和 float64
表示。
浮点类型默认声明为 64 位。
var f = 3.14
fmt.Printf("%T", f)
// 输出 float64
也能够用科学计数法来表示( E 和 e 均可以)
var f = 3.14E2
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)
多行字符串,用 ` (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
吐槽开始,也许你以为,隐式转换没有就没有吧,最多用的时候强转一下。看下面的代码,你还会以为如此吗?