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/

 

posted @ 2022-06-21 15:57  hyserendipity  阅读(97)  评论(0编辑  收藏  举报