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

your first golang tutorial

<!--more-->

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
~/.zshrc~/.bashrc

check version

go version
go version go1.13.1 linux/amd64

uninstall

 /usr/local/go

set GOPATH

$HOME/go
GOPATHGOPATH$HOME/go
GOPATH

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) ...
symbolic links
import path

<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>

<!-- kzl in-article ad -->

<ins class="adsbygoogle" style="display:block; text-align:center;" data-ad-layout="in-article" data-ad-format="fluid" data-ad-client="ca-pub-5653382914441020" data-ad-slot="7925631830"></ins>

<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 build github.com/kezunlin/hello/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
namepackage 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.
stringutilhello.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

_test.goTestXXX(t *testing.T)t.Errort.Fail
t.Errort.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
  • Post author: kezunlin
  • Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.