Skip to content

Commit 69065c2

Browse files
author
yangjingjing
committed
init blog
1 parent 3625df4 commit 69065c2

19 files changed

+2451
-79
lines changed

_posts/2015-05-01-初识Go语言.md

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
---
22
layout: post
3-
categories: Go
3+
categories: [Go]
44
description: none
55
keywords: Go
66
---
@@ -28,7 +28,9 @@ Go语言其它的一些特性零散地来自于其他一些编程语言;比如
2828
作为Go语言标志性的并发编程特性则来自于贝尔实验室的Tony Hoare于1978年发表鲜为外界所知的关于并发研究的基础文献:顺序通信进程( communicating sequential processes ,缩写为CSP)。在最初的CSP论文中,程序只是一组没有中间共享状态的平行运行的处理过程,它们之间使用管道进行通信和控制同步。Tony Hoare的CSP并发模型只是一个用于描述并发性基本概念的描述语言,它并不是一个可以编写可执行程序的通用编程语言。
2929

3030
CSP并发模型最经典的实际应用是来自爱立信发明的Erlang编程语言。不过在Erlang将CSP理论作为并发编程模型的同时,同样来自贝尔实验室的Rob Pike以及其同事也在不断尝试将CSP并发模型引入当时的新发明的编程语言中。他们第一次尝试引入CSP并发特性的编程语言叫Squeak(老鼠的叫声),是一个用于提供鼠标和键盘事件处理的编程语言,在这个语言中管道是静态创建的。然后是改进版的Newsqueak语言(新版老鼠的叫声),新提供了类似C语言语句和表达式的语法,还有类似Pascal语言的推导语法。
31+
3132
Newsqueak是一个带垃圾回收的纯函数式语言,它再次针对键盘、鼠标和窗口事件管理。但是在Newsqueak语言中管道已经是动态创建的,管道属于第一类值、可以保存到变量中。然后是Alef编程语言(Alef也是C语言之父Ritchie比较喜爱的编程语言),Alef语言试图将Newsqueak语言改造为系统编程语言,但是因为缺少垃圾回收机制而导致并发编程很痛苦(这也是继承C语言手工管理内存的代价)。在Aelf语言之后还有一个叫Limbo的编程语言(地狱的意思),这是一个运行在虚拟机中的脚本语言。
33+
3234
Limbo语言是Go语言最接近的祖先,它和Go语言有着最接近的语法。到设计Go语言时,Rob Pike在CSP并发编程模型的实践道路上已经积累了几十年的经验,关于Go语言并发编程的特性完全是信手拈来,新编程语言的到来也是水到渠成了。
3335

3436
从早期提交日志中也可以看出,Go语言是从Ken Thompson发明的B语言、Dennis M. Ritchie发明的C语言逐步演化过来的,它首先是C语言家族的成员,因此很多人将Go语言称为21世纪的C语言。
@@ -37,6 +39,7 @@ Limbo语言是Go语言最接近的祖先,它和Go语言有着最接近的语
3739

3840
## Hello, World!
3941
按照惯例,介绍所有编程语言的第一个程序都是“Hello, World!”。虽然本教假设读者已经了解了Go语言,但是我们还是不想打破这个惯例(因为这个传统正是从Go语言的前辈C语言传承而来的)。
42+
4043
代码展示的Go语言程序输出的是“Hello, World!”。
4144
```go
4245
package main
@@ -49,10 +52,13 @@ func main() {
4952
将以上代码保存到 hello.go 文件中。然后进入命令行并切换到 hello.go 文件所在的目录。目前我们可以将Go语言当作脚本语言,在命令行中直接输入 go run hello.go 来运行程序。如果一切正常的话。应该可以在命令行看到输出"Hello, World!"的结果。
5053

5154
现在,让我们简单介绍一下程序。所有的Go程序,都是由最基本的函数和变量构成,函数和变量被组织到一个个单独的Go源文件中,这些源文件再按照作者的意图组织成合适的package,最终这些package再有机地组成一个完整的Go语言程序。其中,函数用于包含一系列的语句(指明要执行的操作序列),以及执行操作时存放数据的变量。
55+
5256
我们这个程序中函数的名字是main。虽然Go语言中,函数的名字没有太多的限制,但是main包中的main函数默认是每一个可执行程序的入口。而package则用于包装和组织相关的函数、变量和常量。在使用一个package之前,我们需要使用import语句导入包。
57+
5358
例如,我们这个程序中导入了fmt包(fmt是format单词的缩写,表示格式化相关的包),然后我们才可以使用fmt包中的Println函数。
5459

5560
而双引号包含的“Hello, World!”则是Go语言的字符串面值常量。和C语言中的字符串不同,Go语言中的字符串内容是不可变更的。在以字符串作为参数传递给fmt.Println函数时,字符串的内容并没有被复制——传递的仅仅是字符串的地址和长度(字符串的结构在 reflect.StringHeader 中定义)。
61+
5662
在Go语言中,函数参数都是以复制的方式(不支持以引用的方式)传递(比较特殊的是,Go语言闭包函数对外部变量是以引用的方式使用)。
5763

5864
## Go语言特性
@@ -89,6 +95,7 @@ import ( "net/http")
8995
$ go run httpserver.go
9096
```
9197
在浏览器里输入http://127.0.0.1:8080即可浏览文件,这些文件正是当前目录在HTTP服务器上的映射目录。
98+
9299
### 编译输出可执行文件
93100
Go语言的代码可以直接输出为目标平台的原生可执行文件。Go语言不使用虚拟机,只有运行时(runtime)提供垃圾回收和goroutine调度等。
94101

Lines changed: 3 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
---
22
layout: post
3-
categories: Go
3+
categories: [Go]
44
description: none
55
keywords: Go
66
---
7-
# Go基本语法
8-
变量、数据类型和常量是编程中最常见,也是很好理解的概念
7+
# Go语言变量
8+
变量是指定存储特定类型值的内存位置的名称。在 Go 中声明变量有多种语法
99

1010
## 变量
1111
变量的功能是存储用户的数据。不同的逻辑有不同的对象类型,也就有不同的变量类型。经过半个多世纪的发展,编程语言已经形成一套固定的类型,这些类型在不同的编程语言中基本是相通的。常见变量的数据类型有:整型、浮点型、布尔型、结构体等。
@@ -131,67 +131,4 @@ GetData()是一个函数,拥有两个整型返回值。每次调用将会返
131131
匿名变量不占用命名空间,不会分配内存。匿名变量与匿名变量之间也不会因为多次声明而无法使用。
132132
**提示:在Lua等编程语言里,匿名变量也被叫做哑元变量。**
133133

134-
## 数据类型
135-
Go语言中有丰富的数据类型,除了基本的整型、浮点型、布尔型、字符串外,还有切片、结构体、函数、map、通道(channel)等。Go语言的基本类型和其他语言大同小异,切片类型有着指针的便利性,但比指针更为安全,很多高级语言都配有切片进行安全和高效率的内存操作。
136-
结构体是Go语言基础的复杂类型之一。 函数也是Go语言的一种数据类型,可以对函数类型的变量进行赋值和获取。
137-
map和切片是开发中常见的数据容器类型。 通道与并发息息相关。
138-
139-
## 整型
140-
整型分为以下两个大类。
141-
- 按长度分为:`int8``int16``int32``int64`
142-
- 还有对应的无符号整型:`uint8``uint16``uint32``uint64`
143-
其中,uint8就是我们熟知的byte型,int16对应C语言中的short型,int64对应C语言中的long型。
144-
145-
- 自动匹配平台的int和uint
146-
Go语言也有自动匹配特定平台整型长度的类型——int和uint。
147-
可以跨平台的编程语言可以运行在多种平台上。平台的字节长度是有差异的。64位平台现今已经较为普及,但8位、16位、32位的操作系统依旧存在。16位平台上依然可以使用64位的变量,但运行性能和内存性能上较差。同理,在64位平台上大量使用8位、16位等与平台位数不等长的变量时,编译器也是尽量将内存对齐以获得最好的性能。
148-
不能正确匹配平台字节长度的程序就类似于用轿车运一头牛和用一辆卡车运送一头牛的情形一样。
149-
在使用int和uint类型时,不能假定它是32位或64位的整型,而是考虑int和uint可能在不同平台上的差异。
150-
151-
- 哪些情况下使用int和uint
152-
逻辑对整型范围没有特殊需求。例如,对象的长度使用内建len()函数返回,这个长度可以根据不同平台的字节长度进行变化。实际使用中,切片或map的元素数量等都可以用int来表示。
153-
154-
反之,在二进制传输、读写文件的结构描述时,为了保持文件的结构不会受到不同编译目标平台字节长度的影响,不要使用int和uint。
155-
156-
## 浮点型
157-
Go语言支持两种浮点型数:`float32``float64`。这两种浮点型数据格式遵循IEEE 754标准。
158-
- float32的浮点数的最大范围约为3.4e38,可以使用常量定义:math.MaxFloat32。
159-
- float64的浮点数的最大范围约为1.8e308,可以使用一个常量定义:math.MaxFloat64。
160-
打印浮点数时,可以使用fmt包配合动词“%f”,代码如下:
161-
```go
162-
01 package main
163-
02
164-
03 import (
165-
04 "fmt"
166-
05 "math"
167-
06 )
168-
07
169-
08 func main() {
170-
09
171-
10 fmt.Printf("%f\n", math.Pi)
172-
11
173-
12 fmt.Printf("%.2f\n", math.Pi)
174-
13 }
175-
```
176-
代码说明如下:
177-
- 第10行,按默认宽度和精度输出整型。
178-
- 第12行,按默认宽度,2位精度输出(小数点后的位数)。
179-
代码输出如下:
180-
```go
181-
3.141593
182-
3.14
183-
```
184-
185-
## 布尔型
186-
布尔型数据在Go语言中以bool类型进行声明,布尔型数据只有true(真)和false(假)两个值。
187-
Go语言中不允许将整型强制转换为布尔型,代码如下:
188-
```go
189-
var n bool
190134

191-
fmt.Println(int(n) * 2)
192-
```
193-
编译错误,输出如下:
194-
```go
195-
cannot convert n (type bool) to type int
196-
```
197-
布尔型无法参与数值运算,也无法与其他类型进行转换。
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
---
2+
layout: post
3+
categories: [Go]
4+
description: none
5+
keywords: Go
6+
---
7+
# Go语言数据类型
8+
9+
## 数据类型
10+
Go语言中有丰富的数据类型,除了基本的整型、浮点型、布尔型、字符串外,还有切片、结构体、函数、map、通道(channel)等。Go语言的基本类型和其他语言大同小异,切片类型有着指针的便利性,但比指针更为安全,很多高级语言都配有切片进行安全和高效率的内存操作。
11+
结构体是Go语言基础的复杂类型之一。 函数也是Go语言的一种数据类型,可以对函数类型的变量进行赋值和获取。
12+
map和切片是开发中常见的数据容器类型。 通道与并发息息相关。
13+
14+
## 整型
15+
整型分为以下两个大类。
16+
- 按长度分为:`int8``int16``int32``int64`
17+
- 还有对应的无符号整型:`uint8``uint16``uint32``uint64`
18+
其中,uint8就是我们熟知的byte型,int16对应C语言中的short型,int64对应C语言中的long型。
19+
20+
- 自动匹配平台的int和uint
21+
Go语言也有自动匹配特定平台整型长度的类型——int和uint。
22+
可以跨平台的编程语言可以运行在多种平台上。平台的字节长度是有差异的。64位平台现今已经较为普及,但8位、16位、32位的操作系统依旧存在。16位平台上依然可以使用64位的变量,但运行性能和内存性能上较差。同理,在64位平台上大量使用8位、16位等与平台位数不等长的变量时,编译器也是尽量将内存对齐以获得最好的性能。
23+
不能正确匹配平台字节长度的程序就类似于用轿车运一头牛和用一辆卡车运送一头牛的情形一样。
24+
在使用int和uint类型时,不能假定它是32位或64位的整型,而是考虑int和uint可能在不同平台上的差异。
25+
26+
- 哪些情况下使用int和uint
27+
逻辑对整型范围没有特殊需求。例如,对象的长度使用内建len()函数返回,这个长度可以根据不同平台的字节长度进行变化。实际使用中,切片或map的元素数量等都可以用int来表示。
28+
29+
反之,在二进制传输、读写文件的结构描述时,为了保持文件的结构不会受到不同编译目标平台字节长度的影响,不要使用int和uint。
30+
31+
## 浮点型
32+
Go语言支持两种浮点型数:`float32``float64`。这两种浮点型数据格式遵循IEEE 754标准。
33+
- float32的浮点数的最大范围约为3.4e38,可以使用常量定义:math.MaxFloat32。
34+
- float64的浮点数的最大范围约为1.8e308,可以使用一个常量定义:math.MaxFloat64。
35+
打印浮点数时,可以使用fmt包配合动词“%f”,代码如下:
36+
```go
37+
01 package main
38+
02
39+
03 import (
40+
04 "fmt"
41+
05 "math"
42+
06 )
43+
07
44+
08 func main() {
45+
09
46+
10 fmt.Printf("%f\n", math.Pi)
47+
11
48+
12 fmt.Printf("%.2f\n", math.Pi)
49+
13 }
50+
```
51+
代码说明如下:
52+
- 第10行,按默认宽度和精度输出整型。
53+
- 第12行,按默认宽度,2位精度输出(小数点后的位数)。
54+
代码输出如下:
55+
```go
56+
3.141593
57+
3.14
58+
```
59+
60+
## 布尔型
61+
布尔型数据在Go语言中以bool类型进行声明,布尔型数据只有true(真)和false(假)两个值。
62+
Go语言中不允许将整型强制转换为布尔型,代码如下:
63+
```go
64+
var n bool
65+
66+
fmt.Println(int(n) * 2)
67+
```
68+
编译错误,输出如下:
69+
```go
70+
cannot convert n (type bool) to type int
71+
```
72+
布尔型无法参与数值运算,也无法与其他类型进行转换。
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ categories: Go
44
description: none
55
keywords: Go
66
---
7-
# Go字符串
7+
# Go语言字符串
88

99
## 字符串
1010
字符串在Go语言中以原生数据类型出现,使用字符串就像使用其他原生数据类型(int、bool、float32、float64等)一样。

_posts/2015-05-04-Go指针.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
---
22
layout: post
3-
categories: Go
3+
categories: [Go]
44
description: none
55
keywords: Go
66
---
7-
# Go指针
7+
# Go语言指针

0 commit comments

Comments
 (0)