|
| 1 | +> Go 语言入门垫脚石 |
| 2 | +> |
| 3 | +> https://www.runoob.com/go/go-tutorial.html |
| 4 | +
|
| 5 | + |
| 6 | + |
| 7 | +Go语言是什么? |
| 8 | + |
| 9 | +Go出自名门Google公司,是一门支持并发 、垃圾回收的编译型高级编程语言。Go兼具静态编译语言的高性能以及动态语言的高开发效率。 该项目的三位领导者均是著名的语言学家: |
| 10 | + |
| 11 | +Rob Pike: |
| 12 | + |
| 13 | +Go 语言项目总负责人,贝尔实验室 Unix 团队成员,参与的项目包括 Plan9,Inferno 操作系统和 Limbo 编程语言 |
| 14 | + |
| 15 | +Ken Thompson: |
| 16 | + |
| 17 | +贝尔实验室 Unix 团队成员,C 语言、Unix 和 Plan 9 的创始人之一,与 Rob Pike 共同开发了 UTF-8 字符集规范,图灵奖获得者 |
| 18 | + |
| 19 | +Robert Griesemer: |
| 20 | + |
| 21 | +参与开发 Java HotSpot 虚拟机、 V8 Javascript engine |
| 22 | + |
| 23 | + |
| 24 | + |
| 25 | +**为什么选** **Go****?** |
| 26 | + |
| 27 | +❑ 语言简单、开发效率高 |
| 28 | + ❑ 高效的垃圾回收机制 |
| 29 | + ❑ 支持多返回值 |
| 30 | + ❑ 更丰富的内置类型:map、slice、channel、interface ❑ 语言层面支持并发编程 |
| 31 | + |
| 32 | +❑ 编译型语言,编译即测试 ❑ 跨平台编译 |
| 33 | + |
| 34 | + |
| 35 | + |
| 36 | + |
| 37 | + |
| 38 | + |
| 39 | + |
| 40 | + |
| 41 | + |
| 42 | + |
| 43 | + |
| 44 | + |
| 45 | + |
| 46 | + |
| 47 | + |
| 48 | +基础概念 |
| 49 | + |
| 50 | +数据类型和语句 |
| 51 | + |
| 52 | +Go 程序的测试 |
| 53 | + |
| 54 | +标准库的用法 |
| 55 | + |
| 56 | + |
| 57 | + |
| 58 | +## Hello world |
| 59 | + |
| 60 | +Go 语言的基础组成有以下几个部分: |
| 61 | + |
| 62 | +- 包声明 |
| 63 | +- 引入包 |
| 64 | +- 函数 |
| 65 | +- 变量 |
| 66 | +- 语句 & 表达式 |
| 67 | +- 注释 |
| 68 | + |
| 69 | +```go |
| 70 | +package main |
| 71 | + |
| 72 | +import "fmt" |
| 73 | + |
| 74 | +func main() { |
| 75 | + /* 这是我的第一个简单的程序 */ |
| 76 | + fmt.Println("Hello, World!") |
| 77 | +} |
| 78 | +``` |
| 79 | + |
| 80 | +> 1. 第一行代码 *package main* 定义了包名。你必须在源文件中非注释的第一行指明这个文件属于哪个包,如:package main。package main表示一个可独立执行的程序,每个 Go 应用程序都包含一个名为 main 的包。 |
| 81 | +> 2. 下一行 *import "fmt"* 告诉 Go 编译器这个程序需要使用 fmt 包(的函数,或其他元素),fmt 包实现了格式化 IO(输入/输出)的函数。 |
| 82 | +> 3. 下一行 *func main()* 是程序开始执行的函数。main 函数是每一个可执行程序所必须包含的,一般来说都是在启动后第一个执行的函数(如果有 init() 函数则会先执行该函数)。 |
| 83 | +> 4. 下一行 /*...*/ 是注释,在程序执行时将被忽略。单行注释是最常见的注释形式,你可以在任何地方使用以 // 开头的单行注释。多行注释也叫块注释,均已以 /* 开头,并以 */ 结尾,且不可以嵌套使用,多行注释一般用于包的文档描述或注释成块的代码片段。 |
| 84 | +> 5. 下一行 *fmt.Println(...)* 可以将字符串输出到控制台,并在最后自动增加换行字符 \n。 |
| 85 | +> 使用 fmt.Print("hello, world\n") 可以得到相同的结果。 |
| 86 | +> Print 和 Println 这两个函数也支持使用变量,如:fmt.Println(arr)。如果没有特别指定,它们会以默认的打印格式将变量 arr 输出到控制台。 |
| 87 | +> 6. 当标识符(包括常量、变量、类型、函数名、结构字段等等)以一个大写字母开头,如:Group1,那么使用这种形式的标识符的对象就可以被外部包的代码所使用(客户端程序需要先导入这个包),这被称为导出(像面向对象语言中的 public);标识符如果以小写字母开头,则对包外是不可见的,但是他们在整个包的内部是可见并且可用的(像面向对象语言中的 protected )。 |
| 88 | +
|
| 89 | + |
| 90 | + |
| 91 | + |
| 92 | + |
| 93 | +与Java 的区别: |
| 94 | + |
| 95 | +- 行分隔符:在 Go 程序中,一行代表一个语句结束。每个语句不需要像 C 家族中的其它语言一样以分号 ; 结尾,因为这些工作都将由 Go 编译器自动完成。 |
| 96 | + |
| 97 | + |
| 98 | + |
| 99 | +## 工作区和GOPATH |
| 100 | + |
| 101 | +我们学习 Go 语言时,要做的第一件事,都是根据自己电脑的计算架构(比如,是 32 位的计算机还是 64 位的计算机)以及操作系统(比如,是 Windows 还是 Linux),从[Go 语言官网](https://golang.google.cn)下载对应的二进制包,也就是可以拿来即用的安装包。 |
| 102 | + |
| 103 | +随后,我们会解压缩安装包、放置到某个目录、配置环境变量,并通过在命令行中输入`go version`来验证是否安装成功。 |
| 104 | + |
| 105 | +在这个过程中,我们还需要配置 3 个环境变量,也就是 GOROOT、GOPATH 和 GOBIN。这里我可以简单介绍一下。 |
| 106 | + |
| 107 | +- GOROOT:Go 语言安装根目录的路径,也就是 GO 语言的安装路径。 |
| 108 | +- GOPATH:若干工作区目录的路径。是我们自己定义的工作空间。 |
| 109 | +- GOBIN:GO 程序生成的可执行文件(executable file)的路径。 |
| 110 | + |
| 111 | +其中,GOPATH 背后的概念是最多的,也是最重要的。那么,**今天我们的面试问题是:你知道设置 GOPATH 有什么意义吗?** |
| 112 | + |
| 113 | +关于这个问题,它的**典型回答**是这样的: |
| 114 | + |
| 115 | +你可以把 GOPATH 简单理解成 Go 语言的工作目录,它的值是一个目录的路径,也可以是多个目录路径,每个目录都代表 Go 语言的一个工作区(workspace)。 |
| 116 | + |
| 117 | +我们需要利于这些工作区,去放置 Go 语言的源码文件(source file),以及安装(install)后的归档文件(archive file,也就是以“.a”为扩展名的文件)和可执行文件(executable file)。 |
| 118 | + |
| 119 | +事实上,由于 Go 语言项目在其生命周期内的所有操作(编码、依赖管理、构建、测试、安装等)基本上都是围绕着 GOPATH 和工作区进行的。所以,它的背后至少有 3 个知识点,分别是: |
| 120 | + |
| 121 | +**1. Go 语言源码的组织方式是怎样的;** |
| 122 | + |
| 123 | +**2. 你是否了解源码安装后的结果(只有在安装后,Go 语言源码才能被我们或其他代码使用);** |
| 124 | + |
| 125 | +**3. 你是否理解构建和安装 Go 程序的过程(这在开发程序以及查找程序问题的时候都很有用,否则你很可能会走弯路)。** |
| 126 | + |
| 127 | + |
| 128 | + |
| 129 | +## 命令源码文件 |
| 130 | + |
| 131 | +**源码文件又分为三种,即:命令源码文件、库源码文件和测试源码文件,它们都有着不同的用途和编写规则。** |
| 132 | + |
| 133 | + |
0 commit comments