2010-03-31 Go 编程语言入门教程

原文:http://golang.org 翻译:刘金雨 http://log4think.com

介绍

本文档是关于Go编程语言基础的一个介绍性的入门教程,偏向于熟悉C或C++的读者。本文并非一份语言的完整指南,如果需要的话可以参考语言规范。读完本教程之后,你可以继续学习Effective Go,这份文档会更深入的挖掘如何使用Go语言。

此外还有一份《三日入门》的教程可供参考:

本文将会以一系列适当的程序来说明语言的一些关键特性。所有的示例程序都是可运行的(在撰写本文时),并且这些程序都会提交到版本库的

/doc/progs/

目录下。

程序片段都会标注上在源文件中的行号,为了清晰起见,空行前面的行号留空。

Hello World

先从一个最常见的开始:

05    package main

07    import fmt "fmt"  // 本包实现了格式化输入输出

09    func main() {
10        fmt.Printf("Hello, world; or Καλημέρα κόσμε; or こんにちは 世界n");
11    }

每份Go的源文件都会使用

语句声明它的包名。同时也可以通过导入其它包来使用其中定义的功能。这段代码导入了包

来调用我们的老朋友--现在它的开头字母是大写的,并且前面带有包名限定

函数的声明使用关键字func,整个程序将会从为

包中的

函数开始(经过初始化之后)。

字符串常量可以包含Unicode字符,采用UTF-8编码(事实上,所有Go程序的源文件都是使用UTF-8编码的)。

注释的方式同C++一样:

稍后我们会继续提到

编译

Go是一个编译型语言。目前有两个编译器,其中

编译器采用了GCC作为后端,此外还有一系列根据其所适用的架构命名的编译器,例如

适用于64位的x86结构,8g 适用于32位的x86结构,等等。这些编译器比gccgo运行的更快、生成的代码更加有效率。在撰写本文的时候(2009年底),他们还具有一个更加健壮的运行期系统,但是gccgo也正在迎头赶上。

下面来看看如何编译和运行程序。采用

是这样的

的方式看起来更加传统一些。

Echo

下一步,来实现一个Unix的传统命令Echo:

这段程序很小,但是却有几个新出现的概念。前面这个例子中,我们看到可以使用

来声明一个函数,同时关键字

目前还没有用到)也可以用于声明,就好像

一样。

注意,我们可以将同一类的声明放到括号中,以分号分隔。例如第7-10行和第14-17行。但也并非一定要如此,例如可以这样写

echo

for

Stdout

Stdout

*os.File

import

fmt

fmt

import "fmt"

os.Stdout

WriteString

实 际flag

-n

omitNewline

main.main

var

:=

for

flag

for

while

do

if

switch

for

s

-n

main.main

main.main

os

os.Args

flag

int

float

int8

float64

uint

uint32

int

int32

byte

uint8

string

byte

strings.go

const

arrayOfInt

arrayOfInt

a[low : high]

low

high-1

[]

[10]

sum.go

sum()

[3]int{1,2,3}

&

sum()

...

&

sum还第一次出现 了

len(),用于返回元素数量。

for

range

int

struct

new()

make()

nil

make()

new(T)

*T

make(T)

T

new()

0LL

0x0UL

ints

ints

floats

file.go

file

os

syscall

type

File

File

File

File

File

File

File

*File

newFile

Open

Open

File

syscall.Open

r

e

int

syscall

File

syscall.Open

r

NewFile

nil

os

Open

errno

os.Errno

os.Error

Files

*File

file

this

struct

struct

structs

String

os.EINVAL

os.Error

EINVAL

os

./

./file

file

cat(1)

progs/cat.go

switch

for

if

switch

switch

nr

er

f.Read()

if

switch

switch

true

for

true

switch

if-else

switch

case

break

Write()

cat

rot13

cat()

f

Read()

String()

progs/cat_rot13.go

reader

file.File

reader

cat

reader

*file.File

reader

reader

rot13

reader

rot13

cat()

main

cat()

rot13

reader

rotate13

reader

*reader

struct

rot13

file.File

reader

writer

progs/sort.go

Interface

Sort

Len

Less

Swap

sort

int

struct

progs/sortmain.go

sort

fmt

Printf

Fprintf

fmt

Printf

...

stdarg.h

interface {}

Printf

Printf

%llud

%d

Printf

%v

Print

Println

Printf

Print

%v

Println

Printf

Printf

Print

String()

*testType

String()

String()

Sprint

fmt

Printf

%T

Printf

String()

v

v.(Stringer)

v

Stringer

s

ok

true

ok

Stringer

Printf

Sprintf

Fprintf

Fprintf

io.Writer

io

Write

io.Reader

io.ReadWriter

Fprintf

Write()

make

progs/sieve.go

generate

ch

<-

ch

filter

<-

go

generate

filter

ch

generate

progs/sieve1.go

ch

generate

filter

sieve

main

request

binOp

server

N

main

quit

server

server

select

select

quit

``` channel at the end of main:

关于Go编程和并发程序设计还有许多其它的内容,但这份快速入门教程应该已经给你提供了一点基础知识。

最后更新于

这有帮助吗?