Golang极简入门教程(四):编写第一个项目

workspace

Golang 的代码必须放置在一个 workspace 中。一个 workspace 是一个目录,此目录中包含几个子目录:

1.src 目录。包含源文件,源文件被组织为包(一个目录一个包)
2.pkg 目录。包含包对象(package objects)
3.bin 目录。包含可执行的命令

包源文件(package source)被编译为包对象(package object),命令源文件(command source)被编译为可执行命令(command executable)。使用 go 命令进行构建生成的包对象位于 pkg 目录中,生成的可执行命令位于 bin 目录中。开发 Golang 需要设置一个环境变量 GOPATH,此环境变量用于指定 workspace 的路径,另外,也可以把 workspace 的 bin 目录加入到 PATH 环境变量中去。

包路径

包位于 src 目录下,只要不发生冲突(例如和标准库冲突),我们可以使用任意的包路径。假如我们在 GitHub 有一个账号 name5566,并且存在一个项目 hello,那么我们可以在 src 目录下构建这样的目录结构:

代码如下:

github.com/name5566/hello

第一个可执行命令

现在来编写第一个 Golang 程序 hello。假定已经配置好了 GOPATH,并且包路径使用 github.com/name5566/hello,在此目录下创建文件 hello.go:

代码如下:

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

执行命令(可在任意处执行):

代码如下:

go install github.com/name5566/hello

这个命令可以编译 hello 命令,生成一个可执行命令 hello 并放置于 bin 目录下。如果 go 命令没有任何输出表示执行成功。

第一个包对象

现在开始创建一个包对象(也就是库文件),首先建立包路径 github.com/name5566/newmath,在此目录下创建文件 sqrt.go:

代码如下:

package newmath
 
func Sqrt(x float64) float64 {
    z := 1.0
    for i := 0; i < 1000; i++ {
        z -= (z*z - x) / (2 * z)
    }
    return z
}

我们可以测试编译此包:

代码如下:

go build github.com/name5566/newmath

此命令不会有任何输出文件,如果需要在 pkg 目录下生成包对象,使用 go install。

现在来修改一下 hello.go:

代码如下:

package main
 
import (
    "fmt"
    "github.com/name5566/newmath"
)
 
func main() {
    fmt.Printf("Hello, world. Sqrt(2) = %v\n", newmath.Sqrt(2))
}

编译安装 hello:

代码如下:

go install github.com/name5566/hello

go 命令能够自己分析依赖关系,这里的 newmath 包会被自动安装到 pkg 目录下。

另外需要注意的是,Golang 使用静态链接(运行 Go 程序无需包对象)。

测试

Golang 带有轻量级测试框架,主要包括:

1.go test 命令
2.testing 包

创建文件 _test.go 来编写测试,例如为 sqrt.go 创建的测试文件为 sqrt_test.go:

代码如下:

package newmath
 
import "testing"
 
func TestSqrt(t *testing.T) {
    const in, out = 4, 2
    if x := Sqrt(in); x != out {
        t.Errorf("Sqrt(%v) = %v, want %v", in, x, out)
    }
}

执行测试使用 go test:

代码如下:

go test github.com/name5566/newmath

测试文件中包含的所有测试函数 func TestXxx(t *testing.T) 都会被执行。测试函数可以通过 Error、Fail 等相关方法告知出现错误。

另外,在测试文件中还可以编写范例代码,例如:

代码如下:

func ExampleHello() {
    fmt.Println("hello")
    // Output: hello
}

这里 Example 函数结尾可以跟上一个以 “Output:” 字符串开始的注释(被叫做输出注释),在测试运行时会将 Example 函数输出注释中字符串和函数标准输出进行比对。需要注意的是,如果没有输出注释,Example 函数是不会被运行的(但是会被编译)。

Example 函数命名有这样的习惯:

代码如下:

func Example() { ... }
func ExampleF() { ... }
func ExampleT() { ... }
func ExampleT_M() { ... }

这里的 F 为函数名,T 为类型名,T_M 为类型 T 上的方法 M。

获取远程仓库的包

使用 go get 能够自动获取远程仓库的包,例如:

代码如下:

go get code.google.com/p/go.example/hello

(0)

相关推荐

  • 我放弃Python转Go语言的9大理由(附优秀书籍推荐)

    前言 Go大概2009年面世以来,已经8年了,也算是8年抗战.在这8年中,已经有很多公司开始使用Go语言开发自己的服务,甚至完全转向Go开发,也诞生了很多基于Go的服务和应用,比如Dokcer.k8s等,很多的大公司也在用,比如google(作为开发Go语言的公司,当仁不让).Facebook.腾讯.百度.阿里.京东.小米以及360,当然除了以上提到的,还有很多公司也都开始尝试Golang,这其中是什么原因呢?让我们来一起分析分析. 原因 1:性能 Go 极其地快.其性能与 Java 或 C++

  • Python书单 不将就

    每天都有小伙伴询问Python的书,哎呀,动力所致,书单来了.7本,涵盖范围蛮大的.Python热持续中,入门计算机首选语言. python游戏编程快速上手 (斯维加特著) (点击,直接下载) 本书可以帮助读者在轻松有趣的过程中,掌握Python游戏编程的基本技能.本书适合不同年龄和层次的Python编程初学者阅读. 像计算机科学家一样思考Python (点击,直接下载) 全书共19章和3个附录,详细介绍了Python语言编程的方方面面.<像计算机科学家一样思考Python>是一本实用的学习指

  • Mac OS系统安装golang教程

    下载golang安装包 下载地址: http://www.golangtc.com/download https://code.google.com/p/go/downloads/list go1.4.darwin-amd64-osx10.8.pkg  go1.4 Mac OS X (x86 64-bit) PKG installer 设置环境变量 配置 GOROOT 和 GOPATH: 复制代码 代码如下: 创建目录下的go文件夹: mkdir ~/go 下面的东西放到.bash_rc(也可能

  • Golang极简入门教程(一):基本概念

    安装 Golang 在 http://golang.org/dl/ 可以下载到 Golang.安装文档:http://golang.org/doc/install. Hello Go 我们先创建一个文件 hello.go: 复制代码 代码如下: package main   import "fmt"   func main() {     fmt.Printf("hello Golang\n"); } 执行此程序: 复制代码 代码如下: go run hello.g

  • 不可错过的十本Python好书

    以往的文章中小编已经给大家陆续推荐了很多的Python书籍,可以说品种齐全.本本经典了,不知道你是不是已经眼花缭乱,不知道该选择哪本好了呢?今天我来为大家分享十本不可错过的Python好书,分别适合入门.进阶到精深三个不同阶段的人来阅读. Python高性能编程 Amazon 五星畅销书. Python 入门进阶必读. Python代码仅仅能够正确运行还不够,你需要让它运行得更快. Python核心编程(第3版) (点击图书,可直接下载) 系列销量逾70000册. Python高手进阶图书,详解

  • GO语言(golang)基础知识

    今天说一些golang的基础知识,还有你们学习会遇到的问题,先讲解hello word 复制代码 代码如下: package main import "fmt" func main() {    fmt.Println("你好,我们"); } package name 包机制,每一个独立的go程序都需要有一个package main的申明,主要是要为下边入口函数main()做申明的,import和java一样导入包用的 就是下边我们函数用的fmt.Println()

  • Golang极简入门教程(四):编写第一个项目

    workspace Golang 的代码必须放置在一个 workspace 中.一个 workspace 是一个目录,此目录中包含几个子目录: 1.src 目录.包含源文件,源文件被组织为包(一个目录一个包) 2.pkg 目录.包含包对象(package objects) 3.bin 目录.包含可执行的命令 包源文件(package source)被编译为包对象(package object),命令源文件(command source)被编译为可执行命令(command executable).

  • Golang极简入门教程(二):方法和接口

    方法 在 Golang 中没有类,不过我们可以为结构体定义方法.我们看一个例子: 复制代码 代码如下: package main   import (     "fmt"     "math" )   type Vertex struct {     X, Y float64 }   // 结构体 Vertex 的方法 // 这里的方法接收者(method receiver)v 的类型为 *Vertex func (v *Vertex) Abs() float64

  • Golang极简入门教程(三):并发支持

    Golang 运行时(runtime)管理了一种轻量级线程,被叫做 goroutine.创建数十万级的 goroutine 是没有问题的.范例: 复制代码 代码如下: package main   import (     "fmt"     "time" )   func say(s string) {     for i := 0; i < 5; i++ {         time.Sleep(100 * time.Millisecond)       

  • Pytorch学习笔记DCGAN极简入门教程

    目录 1.图片分类网络 2.图片生成网络 首先是图片分类网络: 重点是生成网络 每一个step分为三个步骤: 1.图片分类网络 这是一个二分类网络,可以是alxnet ,vgg,resnet任何一个,负责对图片进行二分类,区分图片是真实图片还是生成的图片 2.图片生成网络 输入是一个随机噪声,输出是一张图片,使用的是反卷积层 相信学过深度学习的都能写出这两个网络,当然如果你写不出来,没关系,有人替你写好了 首先是图片分类网络: 简单来说就是cnn+relu+sogmid,可以换成任何一个分类网络

  • JavaScript极简入门教程(一):基础篇

    阅读本文需要有其他语言的编程经验. 开始学习之前 大多数的编程语言都存在好的部分和差的部分.本文只讲述 JavaScript 中好的部分,这是因为: 1.仅仅学习好的部分能够缩短学习时间 2.编写的代码更加健壮 3.编写的代码更加易读 4.编写的代码更加易于维护 弱类型和强类型 通常来说,越早的修复错误,为之付出的代价就越小.强类型语言的编译器可以在编译时检查某些错误.而 JavaScript 是一门弱类型语言,其解释器无法检查类型错误,但实践表明: 1.强类型能够避免的错误并不是那些关键性错误

  • JavaScript极简入门教程(二):对象和函数

    阅读本文需要有其他语言的编程经验. JavaScript 中的简单类型包括: 1.数字 2.字符串 3.布尔(true 和 false) 4.null 5.undefined 此外的其他类型均是对象(我们不要被 typeof 操作符的返回值所迷惑),例如: 1.函数 2.数组 3.正则表达式 4.对象(对象自然也是对象) 对象基础 在 JavaScript 中,对象是属性的集合(对象为关联数组),每个属性包括: 1.属性名,必须为字符串 2.属性值,可以为除了 undefined 之外的任何值

  • Nodejs极简入门教程(三):进程

    Node 虽然自身存在多个线程,但是运行在 v8 上的 JavaScript 是单线程的.Node 的 child_process 模块用于创建子进程,我们可以通过子进程充分利用 CPU.范例: 复制代码 代码如下: var fork = require('child_process').fork; // 获取当前机器的 CPU 数量 var cpus = require('os').cpus(); for (var i = 0; i < cpus.length; i++) {     // 生

  • Nodejs极简入门教程(二):定时器

    setTimeout 和 clearTimeout 复制代码 代码如下: var obj = setTimeout(cb, ms); setTimeout 用于设置一个回调函数 cb,其在最少 ms 毫秒后被执行(并非在 ms 毫秒后马上执行).setTimeout 返回值可以作为 clearTimeout 的参数,clearTimeout 用于停止定时器,这样回调函数就不会被执行了. setInterval 和 clearInterval 复制代码 代码如下: var obj = setInt

  • Nodejs极简入门教程(一):模块机制

    JavaScript 规范(ECMAScript)没有定义一套完善的能适用于大多数程序的标准库.CommonJS 提供了一套 JavaScript 标准库规范.Node 实现了 CommonJS 规范. 模块基础 在 Node 中,模块和文件是一一对应的.我们定义一个模块: 复制代码 代码如下: // circle.js var PI = Math.PI;   // 导出函数 area exports.area = function(r) {     return PI * r * r; }  

随机推荐