你的首个golang语言详细入门教程 | your first golang tutorial

本文首发于个人博客https://kezunlin.me/post/a0fb7f06/,欢迎阅读最新内容!

your first golang tutorial

go tutorial

versions:

  • go: 1.13.1

install

    wget https://dl.google.com/go/go1.13.1.linux-amd64.tar.gz
    sudo tar -C /usr/local -xzf go1.13.1.linux-amd64.tar.gz
    ll /usr/local/go
    vim ~/.bashrc
    export PATH=$PATH:/usr/local/go/bin
    source ~/.bashrc

> zsh uses env profile ~/.zshrc, bash use env profile ~/.bashrc.

check version

    go version
    go version go1.13.1 linux/amd64

uninstall

just delete /usr/local/go

set GOPATH

Create your workspace directory, $HOME/go.

The GOPATH environment variable specifies the location of your workspace. If no GOPATH is set, it is assumed to be $HOME/go on Unix systems.

Note that GOPATH must not be the same path as your Go installation.

issue the commands

    vim .bashrc 
    # for golang
    export GOPATH=$HOME/go
    export PATH=/usr/local/go/bin:$GOPATH:$PATH
    source .bashrc
    #go env -w GOPATH=$HOME/go
    $ echo $GOPATH 
    /home/kezunlin/go
    $ go env GOPATH
    /home/kezunlin/go

code organization

  • Go programmers typically keep all their Go code in a single workspace.
  • A workspace contains many version control repositories (managed by Git, for example).
  • Each repository contains one or more packages.
  • Each package consists of one or more Go source files in a single directory.
  • The path to a package's directory determines its import path.

like this

    bin/
        hello                          # command executable
        outyet                         # command executable
    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) ...

Note that symbolic links should not be used to link files or directories into your workspace.

An import path is a string that uniquely identifies a package.

<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <script>(adsbygoogle = window.adsbygoogle || []).push({});</script>

go example

your first program

    mkdir -p $GOPATH/src/github.com/kezunlin/hello
    cd $GOPATH/src/github.com/kezunlin/hello
    vim hello.go

with code

package main

import "fmt"

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

build and run

    go build
    ./hello
    hello, world

install and clean binary files

    # install hello to $HOME/go/bin
    go install  
    # clean $HOME/go/bin/*
    go clean -i

~/go/src$ go build github.com/kezunlin/hello/

~/go/src$ go install github.com/kezunlin/hello/

your first library

stringutil library

    mkdir -p $GOPATH/src/github.com/kezunlin/stringutil
    cd $GOPATH/src/github.com/kezunlin/stringutil
    vim reverse.go

code

// 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)
}

    package name
> where `name` is the package's default name for imports. (All files in a package must use the same name.)
> executable commands must always use `package main`.

build library

    go build github.com/kezunlin/stringutil
    #This won't produce an output file. Instead it saves 
    #the compiled package in the local build cache.

use stringutil in hello.go

package main

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

func main() {
    fmt.Printf("hello, world\n")
    fmt.Println(stringutil.Reverse("!oG ,olleH"))
}

build and install

    go build github.com/kezunlin/hello
    go install github.com/kezunlin/hello
    ~/go/bin$ ./hello 
    hello, world
    Hello, Go!

folder structure

     tree .
    .
    ├── bin
    │   └── hello
    └── src
        └── github.com
            └── kezunlin
                ├── hello
                │   └── hello.go
                └── stringutil
                    └── reverse.go
    6 directories, 3 files

testing

You write a test by creating a file with a name ending in _test.go that contains functions named TestXXX with signature func (t *testing.T). The test framework runs each such function; if the function calls a failure function such as t.Error or t.Fail, the test is considered to have failed.

  • file name: xxx_test.go
  • function name: TextXXX
  • error: t.Error or t.Fail
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)
        }
    }
}

test ok

     $ go test github.com/kezunlin/stringutil
     ok      github.com/kezunlin/stringutil 0.165s

test error

    --- FAIL: TestReverse (0.00s)
        reverse_test.go:16: Reverse("Hello, 世界2") == "2界世 ,olleH", want "界世 ,olleH"
    FAIL
    exit status 1
    FAIL    github.com/kezunlin/stringutil  0.003s    

remote packages

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

go commands

    go help gopath 
    go help importpath 
    go help test
    go build
    go install 
    go clean
    go get # fetch,build and install

Reference

History

  • 20191011: created.

Copyright

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值