您的位置:首页 > 编程语言 > Go语言

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

2020-01-15 00:01 92 查看

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

<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script><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

  • 点赞
  • 收藏
  • 分享
  • 文章举报
kezunlin 发布了72 篇原创文章 · 获赞 0 · 访问量 1143 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: