本文首发于个人博客https://kezunlin.me/post/a0fb7f06/,欢迎阅读最新内容!
your first golang tutorial
<!--more-->
go tutorialversions:
- 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.
- Post author: kezunlin
- Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.