21

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

 4 years ago
source link: https://studygolang.com/articles/25384
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

本文首发于个人博客 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

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>

<!-- 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/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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK