如何编写go代码

1:代码组织

go开发者通常将所有的go代码放在一个单独的workspace中。一个workspace可以包含多个版本控制库(比如git),每一个库包含若干package,每个package就是包含一个或多个go源码文件的目录;package目录的路径决定他的引用路径;

workspace下通常有3个子目录:src包含go源码文件;pkg包含package对象;bin包含可执行程序。go编译时,构建src中的go源码,并将编译后的二进制文件安装到pkg和bin中;

下面是一个workspace的例子:

bin/
    hello                          # command executable
    outyet                         # command executable
pkg/
    linux_amd64/
        github.com/golang/example/
            stringutil.a           # package object
src/
    github.com/golang/example/
        .git/                      # Git repository metadata
        hello/
            hello.go               # command source
        outyet/
            main.go                # command source
            main_test.go           # test source
        stringutil/
            reverse.go             # package source
            reverse_test.go        # test source
    golang.org/x/image/
        .git/                      # Git repository metadata
        bmp/
            reader.go              # package source
            writer.go              # package source
    ... (many more repositories and packages omitted) ...

上面的workspace中包含两个版本库:example和image。example库包含2个可执行程序:hello和outyet,一个库文件stringutil。image库包含bmp和其他package等。

2:GOPATH环境变量

环境变量GOPATH指明了workspace的位置。默认情况下,该环境变量的值是home目录下的名为go的子目录,比如Unix下的$HOME/go,Windows下的C:\Users\YourName\go。

通过设置GOPATH来指明workspace的具体位置。注意GOPATH不能设置为和GO的安装目录一样。

“go env GOPATH”命令可以打印出GOPATH的当前值。

3:引用路径(import path)

引用路径用于唯一标识一个package。package的引用路径对应该packge相对于workspace中的位置,或者是一个远程库的地址。

标准库中的package引用路径都是像”fmt”和”net/http”这样的短路径。对于自己定义的package,必须选择一个不会与标准库发生冲突的基路径。

比如,以github.com/user为基路径,需要在workspace中创建对应的目录:

mkdir -p $GOPATH/src/github.com/user

4:第一个程序

首先是确定package路径,这里使用的路径是github.com/user/hello,在workspace中创建对应的目录:

mkdir $GOPATH/src/github.com/user/hello

然后在上面的目录中新建源码文件hello.go,其内容如下:

package main

import "fmt"

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

接下来就可以编译、构建并安装该package了:

go install github.com/user/hello

上面的命令可以在系统内任意位置执行。go编译器可以通过GOPATH环境变量得到workspace的路径,进而在其中的github.com/user/hello这个package中找到源码。

go install命令构建hello,产生一个可执行文件,并将该文件安装到workspace中的bin目录下。运行该程序如下:

$GOPATH/bin/hello
Hello, world.

5:第一个库

首先是确定package路径,并且在workspace中创建对应的目录:

mkdir $GOPATH/src/github.com/user/stringutil

接下来,在该目录中创建reverse.go源码文件,内容如下:

// Package stringutil contains utility functions for working with strings.
package stringutil

// Reverse returns its argument string reversed rune-wise left to right.
func Reverse(s string) string {
    r := []rune(s)
    for i, j := 0, len(r)-1; i < len(r)/2; i, j = i+1, j-1 {
        r[i], r[j] = r[j], r[i]
    }
    return string(r)
}

然后,使用go build命令验证是否能编译成功:

go build github.com/user/stringutil

上面的命令不会产生输出文件。必须使用go install命令,才能在pkg目录下生成package对象。

接下来,修改hello.go文件如下:

package main

import (
    "fmt"
    "github.com/user/stringutil"
)

func main() {
    fmt.Printf(stringutil.Reverse("!oG ,olleH"))
}

当go编译安装package或二进制文件时,它也会安装它的依赖。所以,当安装hello时,它所依赖的stringutil也会被自动安装:

go install github.com/user/hello

  

运行新程序,结果如下:

hello
Hello, Go!

现在,workspace的内容如下:

bin/
    hello                 # command executable
pkg/
    linux_amd64/          # this will reflect your OS and architecture
        github.com/user/
            stringutil.a  # package object
src/
    github.com/user/
        hello/
            hello.go      # command source
        stringutil/
            reverse.go    # package source

go install命令会将stringutil.a文件安装到pkg/linux_amd64目录中,对应于源码的子目录下。因此,后续编译时,编译器可以找到该package文件,避免不必要的重编译。”linux_amd64”主要是用于跨平台编译时,用于标识操作系统和CPU架构。

go可执行程序是静态链接的,运行go程序时,package对象文件不是必须存在的。

6:Package名

go源码文件中的第一条声明语句必须是:package name

其中的name就是package的引用名,同一个package中的源码文件必须使用相同的名字。

GO的惯例是package名就是引用路径的最后一个元素,比如引用路径为"crypto/rot13"的package,其名为rot13。

可执行程序必须以main作为package名。

多个package链接成一个二进制文件时,这些package的名字不一定必须是独一无二的,只要他们的引用路径不同即可。

7:测试

go具有一个轻量级的测试框架,该测试框架包含go test命令,以及testing package。

编写测试代码时,源码文件名需要以”_test.go”结尾,函数的形式是:func TestXXX(t *testing.T)。

测试框架运行每个测试函数,如果函数中调用到了t.Error或t.Fail,表示测试失败。

比如,如果需要测试stringutil这个package,则可以创建文件$GOPATH/src/github.com/user/stringutil/reverse_test.go,该文件内容如下:

package stringutil

import "testing"

func TestReverse(t *testing.T) {
    cases := []struct {
        in, want string
    }{
        {"Hello, world", "dlrow ,olleH"},
        {"Hello, 世界", "界世 ,olleH"},
        {"", ""},
    }
    for _, c := range cases {
        got := Reverse(c.in)
        if got != c.want {
            t.Errorf("Reverse(%q) == %q, want %q", c.in, got, c.want)
        }
    }
}

运行测试代码:

go test github.com/user/stringutil
ok      github.com/user/stringutil 0.165s

或者,如果当前就在package目录中,可以直接运行go test命令:

go test
ok      github.com/user/stringutil 0.165s

8:远端package

package的引用路径还可以用于描述如何从版本控制系统如git或mercurial中获取源码。go编译器可以使用该特性从远端库中获取package。

比如上面例子中的代码也存在于GIT库:github.com/golang/example中。如果在源码中,引用路径使用的是该URL地址,则可以使用go get命令,该命令会从远端拉取package,并进行编译安装:

go get github.com/golang/example/hello
$GOPATH/bin/hello
Hello, Go examples!

如果package不在当前的workspace中,go get将会将其放置到GOPATH指定的workspace下,如果该package已经存在了,则go get会省略远端拉取的过程,剩下的动作与go install一样。

运行完go get命令后,workspace目录层次结构如下:

bin/
    hello                           # command executable
pkg/
    linux_amd64/
        github.com/golang/example/
            stringutil.a            # package object
        github.com/user/
            stringutil.a            # package object
src/
    github.com/golang/example/
    .git/                       # Git repository metadata
        hello/
            hello.go                # command source
        stringutil/
            reverse.go              # package source
            reverse_test.go         # test source
    github.com/user/
        hello/
            hello.go                # command source
        stringutil/
            reverse.go              # package source
            reverse_test.go         # test source

可以重新编辑github.com/user/hello/hello.go文件,将

import "stringutil"

改为

import "github.com/golang/example/stringutil"

这样,执行go get github.com/user/hello时,就会首先从远端下载stringutil这个package,然后再编译安装hello。

https://golang.org/doc/code.html

时间: 2024-10-14 08:23:47

如何编写go代码的相关文章

实时显示iOS编写UI代码效果

编写iOS应用UI的方式大概有两种,一种是Storyboard/Xib,另一种是手写代码.采用Storyboard/Xib方式组织UI,由于提供可视化的特性,只要从UI库中拖动UI控件,便可以显示结果,极大地提高开发速度.但面临一个问题就是多人协作开发,由于所有的UI都放在同一个Storyboard文件中,使用Git/SVN合并代码就会出现冲突.多人协作开发还不是主要问题,有人提出可以创建多个Storyboard来分开UI编写,而Storyboard/Xib最主要问题是代码复用性比较差.所以有些

第1课第4.4节_Android硬件访问服务编写HAL代码

4 编写HAL代码 源码下载方法 第一次: git clone https://github.com/weidongshan/SYS_0001_LEDDemo.git 更新: git pull origin 取出指定版本: git checkout v1 // 有JNI没有HAL git checkout v2 // 有JNI,HAL git checkout v3 // add MODULE TAG, DEVICE TAG JNI 向上提供本地函数, 向下加载HAL文件并调用HAL的函数HAL

JNI技术基础(2)——从零开始编写JNI代码

书接上文: <JNI技术基础(1)——从零开始编写JNI代码> 2.编译源程序HelloWorld.java并生成HelloWorld.class 3.生成头文件HelloWorld.h 在Linux控制台输入命令:javah –jni HelloWorld 生成HelloWorld.h头文件 //HelloWorld.h /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header

编写css代码的方式

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <!-- html 在一个网页中负责的事情是一个页面的结构 c

C#和JAVA中编写事务代码

C#  DAL层代码,执行多条增删改,使用事务操作: /// <summary> /// 执行 多条增删改 (非查询语句) /// </summary> /// <param name="strSql"></param> /// <param name="paras"></param> /// <returns></returns> public static int E

对编写html代码的几点儿小建议

1.DOCTYPE说明:告诉浏览器要使用哪种规范来解释该文档内容: <!DOCTYPE html PUBLIC "-W3//DTD//XHTML 1.0  Transitional//EN"  "http://www.w3.org/1999/xhmlt"> 解释:-W3:w3标准:DTD:文档类型定义: XHTML 1.0:XHTML 1.0版本:Transitional:过渡模式(Strict:严格模式):EN:语言为英语: "http://

以优美方式编写JavaScript代码

英文原文:CoffeeScript: The beautiful way to write JavaScript 我用 JavaScript 编程很多年了,写了大量的 JavaScript 代码,即便是我这样的经历,但我仍然还在努力地去写出更优美的 JavaScript 代码,在这篇文章中,我将探索为什么写出漂亮的 JavaScript 代码是如此困难,如何使用CoffeScript(一种简约且能编译成 JavaScript 的语言)改善它. 什么是优美的代码? 我想从个人观点来声明如何定义优美

不要将时间浪费到编写完美代码上(转)

add by zhj:文章主要说的是代码会经常变化,追求完美只会浪费更多时间. (英文:DZone,译者:raygodlee) 不要将时间浪费到编写完美代码上,原因就在于一个系统的迭代开发可能持续运行5年至10年甚至是20年,而某行代码甚至某个设计的生命周期则要短很多,只有几个月或者几天.所以说有没有必要将大量时间花在写代码上? 一个系统的迭代开发可能持续运行5年至10年甚至是20年.相比之下,某行代码甚至某个设计的生命周期则要短很多,只有几个月或者几天,甚至当你为了解决一个问题迭代测试不同方案

赤手空拳编写C#代码

有时候服务器上并没有安装任何IDE或典型的代码编辑器,只能完全手写C#代码. 不妨假设一台全新的PC,较新版本的Windows自带了.net框架,无需开发工具即可编程了. 除了以往的Bat批处理.VBS脚本,以及利用浏览器支持编写简单的程序,连C#.VB.net等编译型语言也可以直接开发了. 设置环境变量 为了方便启动C#的编辑器,而无需每次输入完整路径,我们可以将csc.exe加入系统默认搜索的路径. 1.搜索csc.exe的路径 比如是C:\Windows\Microsoft.NET\Fra