Skip to content

Update 1.5.md #1

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 14 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion 1.3.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@
build.out 旧的test记录,由Makefiles遗留
*.[568ao] object文件,由Makefiles遗留

DIR(.exe) 由go build产生
DIR(.exe) 由go build产生(已确认windows下单个文件时,是根据文件名的,其他待确认;上述“编译输出的文件名”或许也要修改)
DIR.test(.exe) 由go test -c产生
MAINFILE(.exe) 由go build MAINFILE.go产生

Expand Down
2 changes: 1 addition & 1 deletion 1.4.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@

根据自己相应的系统下载相应的版本,然后打开Sublime,对于不熟悉Sublime的同学可以先看一下这篇文章[Sublime Text 2 入门及技巧](http://lucifr.com/139225/sublime-text-2-tricks-and-tips/)

1. 打开之后安装 Package Control:Ctrl+` 打开命令行,执行如下代码:
1. 打开之后安装 Package Control:Ctrl+` 打开命令行,执行如下代码(命令行依赖失败时,可选通过Sublime界面方式来安装)

import urllib2,os; pf='Package Control.sublime-package'; ipp=sublime.installed_packages_path(); os.makedirs(ipp) if not os.path.exists(ipp) else None; urllib2.install_opener(urllib2.build_opener(urllib2.ProxyHandler())); open(os.path.join(ipp,pf),'wb').write(urllib2.urlopen('http://sublime.wbond.net/'+pf.replace(' ','%20')).read()); print 'Please restart Sublime Text to finish installation'

Expand Down
2 changes: 1 addition & 1 deletion 1.5.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,4 @@
## links
* [目录](<preface.md>)
* 上一节: [Go开发工具](<1.4.md>)
* 下一章: [go语言基础](<2.md>)
* 下一章: [Go语言基础](<2.md>)
6 changes: 3 additions & 3 deletions 2.1.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,17 +13,17 @@
import "fmt"

func main() {
fmt.Printf("Hello, world or καλημ ́ρα κóσμ or こんにちは世界\n")
fmt.Printf("Hello, world or 你好,世界 or καλημ ́ρα κóσμ or こんにちは世界\n")
}

输出如下:

Hello, world or καλημ ́ρα κóσμ or こんにちは世界
Hello, world or 你好,世界 or καλημ ́ρα κóσμ or こんにちは世界

## 详解
首先我们要了解一个概念,Go程序是通过`package`来组织的

`package <pkgName>`(在我们的例子中是`package main`)这一行告诉我们当前文件属于哪个包,而包名`main`则告诉我们它是一个可独立运行的包,它在编译后会产生可执行文件。除了`main`包之外,其它的包最后都会生成`*.a`文件(也就是包文件)并放置在`$GOPATH/pkg/$GOOS_$GOARCH`中(以Mac为例就是`$GOPATH/pkg/darwin_amd64`)。
`package <pkgName>`(在我们的例子中是`package main`)这一行告诉我们当前文件属于哪个包,而包名`main`则告诉我们它是一个可独立运行的包,它在编译后会产生可执行文件。除了`main`包之外,其它的包最后都会生成`*.a`文件(也就是包文件)并放置在`$GOPATH/pkg/$GOOS_$GOARCH`(需要Go install 才会到此处)中(以Mac为例就是`$GOPATH/pkg/darwin_amd64`)。

>每一个可独立运行的Go程序,必定包含一个`package main`,在这个`main`包中必定包含一个入口函数`main`,而这个函数既没有参数,也没有返回值。

Expand Down
2 changes: 1 addition & 1 deletion 2.3.md
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,7 @@ Go里面最强大的一个控制逻辑就是`for`,它即可以用来循环读
- 上面返回值声明了两个变量`output1`和`output2`,如果你不想声明也可以,直接就两个类型
- 如果只有一个返回值且不声明返回值变量,那么你可以省略 包括返回值 的括号
- 如果没有返回值,那么就直接省略最后的返回信息
- 如果有返回值, 那么必须在函数的外层添加return语句
- 如果有返回值, 那么必须在函数的返回处带return语句

下面我们来看一个实际应用函数的例子(用来计算Max值)

Expand Down
2 changes: 1 addition & 1 deletion 2.7.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

## Goroutines

Goroutines是Go并行设计的核心。Goroutines说到底其实就是线程,但是他比线程更小,十几个Goroutines可能体现在底层就是五六个线程,Go语言内部帮你实现了这些Goroutines之间的内存共享。Go语言的作者经常说着这样一句话,不要通过共享来通信,而要通过通信来共享。
Goroutines是Go并行设计的核心。Goroutines理解上类似线程,但是他比线程更小,十几个Goroutines可能体现在底层就是五六个线程,Go语言内部帮你实现了这些Goroutines之间的内存共享。Go语言的作者经常说着这样一句话,不要通过共享来通信,而要通过通信来共享。

Goroutines是通过Go的runtime管理的一个线程管理器。Goroutines通过`go`关键字实现了,其实就是一个普通的函数。

Expand Down
4 changes: 2 additions & 2 deletions 3.1.md
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同

![](images/3.1.web.png?raw=true)

上面这张图我们可以了解到整个的通讯过程,同时细心的读者是否注意到了一点,一个URL请求但是左边栏里面为什么会有那么多的资源请求(这些都是静态文件,go对于静态文件有专门的处理方式)。
上面这张图我们可以了解到整个的通讯过程,同时细心的读者是否注意到了一点,一个URL请求但是左边栏里面为什么会有那么多的资源请求(这些都是静态文件,Go对于静态文件有专门的处理方式)。

这个就是浏览器的一个功能,第一次请求url,服务器端返回的是html页面,然后浏览器开始渲染HTML:当解析到HTML DOM里面的图片连接,css脚本和js脚本的链接,浏览器就会自动发起一个请求静态资源的HTTP请求,获取相对应的静态资源,然后浏览器就会渲染出来,最终将所有资源整合、渲染,完整展现在我们面前的屏幕上。

Expand All @@ -143,4 +143,4 @@ Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同
## links
* [目录](<preface.md>)
* 上一节: [Web基础](<3.md>)
* 下一节: [GO搭建一个web服务器](<3.2.md>)
* 下一节: [Go搭建一个Web服务器](<3.2.md>)
14 changes: 7 additions & 7 deletions 3.2.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# 3.2 GO搭建一个web服务器
# 3.2 Go搭建一个Web服务器

前面小节已经介绍了Web是基于http协议的一个服务,Go语言里面提供了一个完善的net/http包,通过http包可以很方便的就搭建起来一个可以运行的web服务。同时使用这个包能很简单地对web的路由,静态文件,模版,cookie等数据进行设置和操作。
前面小节已经介绍了Web是基于Http协议的一个服务,Go语言里面提供了一个完善的net/http包,通过Http包可以很方便的就搭建起来一个可以运行的Web服务。同时使用这个包能很简单地对Web的路由,静态文件,模版,cookie等数据进行设置和操作。

## http包建立web服务器
## Http包建立Web服务器

package main

Expand Down Expand Up @@ -48,17 +48,17 @@

![](images/3.2.goweb.png?raw=true)

我们看到上面的代码,要编写一个web服务器很简单,只要调用http包的两个函数就可以了
我们看到上面的代码,要编写一个Web服务器很简单,只要调用Http包的两个函数就可以了

>如果你以前是PHP程序员,那你也许就会问,我们的nginx、apache服务器不需要吗?Go就是不需要这些,因为他直接就监听tcp端口了,做了nginx做的事情,然后sayhelloName这个其实就是我们写的逻辑函数了,也就是php里面的控制层(controller)函数类似。

>如果你以前是python程序员,那么你一定听说过tornado,这个代码和他是不是很像,对,没错,go就是拥有类似python这样动态语言的特性,写web应用很方便
>如果你以前是python程序员,那么你一定听说过tornado,这个代码和他是不是很像,对,没错,go就是拥有类似python这样动态语言的特性,写Web应用很方便

>如果你以前是ruby程序员,那么和ROR的/script/server启动有点类似。

我们看到Go通过简单的几行代码就已经运行起来一个web服务了,而且这个Web服务内部有支持高并发的特性,我将会在接下来的两个小节里面详细的讲解一下go是如何实现Web高并发的
我们看到Go通过简单的几行代码就已经运行起来一个Web服务了,而且这个Web服务内部有支持高并发的特性,我将会在接下来的两个小节里面详细的讲解一下Go是如何实现Web高并发的

## links
* [目录](<preface.md>)
* 上一节: [Web工作方式](<3.1.md>)
* 下一节: [Go如何使得web工作](<3.3.md>)
* 下一节: [Go如何使得Web工作](<3.3.md>)
8 changes: 4 additions & 4 deletions 3.md
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
# 3 Web基础

## 目录
* 1. [web工作方式](3.1.md)
* 2. [GO搭建一个简单的web服务](3.2.md)
* 1. [Web工作方式](3.1.md)
* 2. [Go搭建一个简单的Web服务](3.2.md)
* 3. [Go如何使得web工作](3.3.md)
* 4. [Go的http包详解](3.4.md)
* 4. [Go的Http包详解](3.4.md)
* 5. [小结](3.5.md)

学习基于Web的编程可能正是你读本书的原因。事实上,如何通过Go来编写Web应用也是我编写这本书的初衷。前面已经介绍过,Go目前已经拥有了成熟的Http处理包,这使得编写能做任何事情的动态Web程序易如反掌。在接下来的各章中将要介绍的内容,都是属于Web编程的范畴。本章则集中讨论一些与Web相关的概念和Go如何运行Web程序的话题。

## links
* [目录](<preface.md>)
* 上一章: [第二章总结](<2.8.md>)
* 下一节: [web工作方式](<3.1.md>)
* 下一节: [Web工作方式](<3.1.md>)