你的首个golang语言详细入门教程 | your first golang tutorial
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
.
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) ...
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
ort.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
- Post link: https://kezunlin.me/post/a0fb7f06/
- Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK