zoukankan      html  css  js  c++  java
  • 你的首个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.

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

    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
    ")
        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

  • 相关阅读:
    Uva10305(dfs)
    Uva572
    Uva122
    Uva679
    Uva136
    Uva489
    Uva133
    Uva1339
    Uva1588
    《世纪的哭泣》读后感 读书笔记
  • 原文地址:https://www.cnblogs.com/kezunlin/p/12047365.html
Copyright © 2011-2022 走看看