目录

    1. 背景

    最近十多年来,C/C++ 在计算领域没有很好得到发展,没有跟上计算机发展的脚步。

    现有的编程语言,开发程度和系统效率在很多情况下不能兼得。要么执行效率高,但低效的开发和编译;要么执行效率低,但拥有高效的编译;所以需要一种拥有较高效的执行速度、编译速度和开发速度的编程语言,Go 语言就横空出世了。

    Go 语言的主要目标是将静态语言的安全性和高效性与动态语言的易开发性进行有机结合起来。

    另外一个目标是对于网络通信、并发和并行编程的支持,从而更好地利用大量的分布式和多核的计算机。

    2. Go 语言简介

    Go 语言是一个 Google 公司推出的一个开源项目,是一个系统开发语言。

    Go 语言最初的设计由 Robert Griesemer,Rob Pike 和 Ken Thompson 在2007年9月开始的,官方的发布是在 2009 年 11 月。2010 年 5 月由 Rob Pike 公开的将其运用于 Google 内部的一个后台系统。

    Go 可以运行在 Linux、Mac OS X、FreeBSD、OpenBSD、Plan 9 和 Windows 系统上,同时也支持多种处理器架构:I386、AMD64 和 ARM。

    由于Go 语言针对多 CPU 系统进行了优化,使用 GO 编写的程序执行效率可以与 C 媲美,同时更加安全,支持并行。

    3. 优势

    • 部署简单 Go 编译生成的是一个静态可执行文件,除了 glibc 外没有其他外部依赖
    • 并发行好 Goroutine 和 Channel 使得编写高并发的服务端软件十分容易。很多情况下,完全不需要考虑锁机制。Go 语言的并发不是以库的形式提供,而是语言层面加入了对并发的支持。
    • 程序员友好 与 C/C++ 相比,Go 不支持一些高级语法,代码更简明,同时拥有一些动态语言的特性
    • 执行性能好 执行效率高,虽不如 C/C++, 但比 Python 高很多,同时内存使用也很高效。

    4. Go 语言基本概念与语法

    • 文件名 Go 的源文件以 .go 为后缀名存储在计算机中,这些文件名均由小写字母组成,如 scanner.go 。如果文件名由多个部分组成,则使用下划线 _ 对它们进行分隔,如 scanner_test.go
    • 包 包是结构化代码的一种方式:每个程序都由包(通常简称为 pkg)的概念组成,可以使用自身的包或者从其它包中导入内容。在源文件的第一行指明该文件属于哪一个包,如:package main,表示一个可独立执行的程序。
    • 常量 常量使用关键字 const 定义,用于存储不会改变的数据。常量的定义格式:const identifier [type] = value。
    • 变量 声明变量的一般形式是使用 var 关键字:var identifier type。
    • 数据类型 18个基本类型,bool、string、rune、byte、int、uint、int8、uint8、int16、uint16、int32、uint32、int64、uint64、float32、float64、complex64、complex128,7个复合类型:array、struct、function、interface、slice、map、channel
    • 控制结构 Go 提供 if-else 结构、switch 结构、select 结构、for (range) 结构
    • 函数定义
      func g() {
      }
      

    5. 内置标准库

    • fmt fmt 包实现了格式化的 I/O 函数,类似C语言中的 printf 和 scanf,但是更加简单。
    • strings strings 包实现了用于操作字符串的简单函数,包括 strings 导出函数和 Reader, Replacer 两个结构体。
    • time time 包提供显示和计算时间用的函数。
    • os os 包提供了不依赖平台的操作系统函数接口。错误处理设计为Go 风格,失败的调用会返回错误值而非错误码。通常错误值里包含更多信息。
    • path path 实现了对斜杠分隔的路径进行操作的函数。
    • io io 包提供了对 I/O 原语的基本接口,这些接口抽象出了泛用的函数并附加了一些操作。因为这些接口是对底层实现完全不同的低水平操作的包装,除非得到其它方面的通知,客户端不应假设它们是并发安全的。
    • log log 包实现了简单的日志服务,log 包定义了 Logger 类型,该类型提供了一些格式化输出的方法。也提供了一个预定义的标准 Logger,可以通过辅助函数 Print[f|ln]、Fatal[f|ln] 和Panic[f|ln] 访问,比手工创建一个 Logger 对象更容易使用。Logger 会打印每条日志信息的日期、时间,默认输出到标准错误。Fatal 系列函数会在写入日志信息后调用os.Exit(1)。Panic 系列函数会在写入日志信息后调用 panic。

    6. Hello World

    6.1 环境配置

    IDE推荐: JetBrains Gogland ,也可以任意编辑器配合 Go 插件,如:Atom + go-plus

    以 CentOS 下安装为例:

    yum install go -y
    

    查看 Go 环境配置

    go env
    
    GOARCH="amd64"
    GOOS="linux"
    GOROOT="/usr/lib/golang"
    GOTOOLDIR="/usr/lib/golang/pkg/tool/linux_amd64"
    CC="gcc"
    GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-    map=/tmp/go-build157488013=/tmp/go-build -gno-record-gcc-switches"
    CGO_LDFLAGS="-g -O2"
    

    6.2 Hello

    hello.go 文件

    package main  
    
    import "fmt"  
    
    func main() {  
        fmt.Printf("Hello, world.\n")  
    }  
    

    运行代码

    $go run hello.go
    Hello, world.
    

    7. 参考