go入门
2022-06-21 15:54:38
Go 语言的起源,发展与普及
正如 “21 世纪的 C 语言” 这句话所说,Go 语言并不是凭空而造的,而是和 C++、Java 和 C# 一样属于 C 系。不仅如此,设计者们还汲取了其它编程语言的精粹部分融入到 Go 语言当中。
Go 语言有一个被称之为 “没有废物” 的宗旨,就是将一切没有必要的东西都去掉,不能去掉的就无底线地简化,同时追求最大程度的自动化。他完美地诠释了敏捷编程的 KISS 秘诀:短小精悍!
- 为什么要创造一门编程语言
1)C/C++的发展速度无法跟上计算机发展的脚步;
2)Go语言取得了最佳平衡:快速编译,高效执行,易于开发;
- 语言特性
Go没有类和继承的概念,通过接口来实现多态性,因此Go语言有一个清晰易懂的轻量级类型系统,在类型之间也没有层级之说。
函数是Go语言中的基本构件,他们的使用方法非常的灵活。
Go语言使用静态类型,所以他是类型安全的一门语言,加上通过构建到本地代码,程序的执行速度也非常快。
作为强类型语言,隐式的类型转换是不被允许的,记住一条原则:让所有东西都是显式的。
- Go性能说明
Go 语言与 C 语言的性能差距大概在 10%~20% 之间。
Go 程序比 Java 或 Scala 应用程序要快上 2 倍,并比这两门语言占用的内存降低了 70%。
Go 就要比任何非静态和编译型语言快 2 到 10 倍,并且能够更加高效地使用内存。
语言核心结构与技术
- 文件名、关键字与标识符
Go 的源文件以 .go
为后缀名存储在计算机中,这些文件名均由小写字母组成,如 scanner.go
。如果文件名由多个部分组成,则使用下划线 _
对它们进行分隔,如 scanner_test.go
。文件名不包含空格或其他特殊字符。
每个语句不需要像 C 家族中的其它语言一样以分号 ;
结尾,因为这些工作都将由 Go 编译器自动完成。如果你打算将多个语句写在同一行,它们则必须使用 ;
人为区分,但在实际开发中我们并不鼓励这种做法。
- 指针
使用new()函数会获得指定类型变量的地址,但由于map/slice本身就是引用类型,因此不应该再取地址,永远用make来构造map/slice。
new(T)
为每个新的类型 T
分配一片内存,初始化为 0
并且返回类型为 *T
的内存地址:这种方法 返回一个指向类型为 T
,值为 0
的地址的指针,它适用于值类型如数组和结构体(参见第 10 章);它相当于 &T{}
。
make(T)
返回一个类型为 T 的初始值,它只适用于 3 种内建的引用类型:切片、map
和 channel。
- 函数与方法的区别
函数将变量作为参数:Function1(recv)
方法在变量上被调用:recv.Method1()
在接收者是指针时,方法可以改变接收者的值(或状态),这点函数也可以做到(当参数作为指针传递,即通过引用调用时,函数也可以改变参数的状态)。
不要忘记 Method1()
后边的括号 ()
,否则会引发编译器错误:method recv.Method1 is not an expression, must be called
接收者必须有一个显式的名字,这个名字必须在方法中被使用。
receiver_type
叫做 (接收者)基本类型,这个类型必须在和方法同样的包中被声明。
在 Go 中,(接收者)类型关联的方法不写在类型结构里面,就像类那样;耦合更加宽松;类型和方法之间的关联由接收者来建立。
方法没有和数据定义(结构体)混在一起:它们是正交的类型;表示(数据)和行为(方法)是独立的。
附录
https://github.com/unknwon/the-way-to-go_ZH_CN/blob/master/eBook/directory.md
https://gobyexample-cn.github.io/