1. 安装go in linux
# yum install go -y
#[root@fc30-hadoop go]# which go
/usr/bin/go
#[root@fc30-hadoop go]# go version
go version go1.12.13 linux/amd64
[root@fc30-hadoop go]#
1.1 go 环境变量
[root@fc30-hadoop go]# go env
GOARCH="amd64"
GOBIN=""
GOCACHE="/root/.cache/go-build"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/root/go"
GOPROXY=""
GORACE=""
GOROOT="/usr/lib/golang"
GOTMPDIR=""
GOTOOLDIR="/usr/lib/golang/pkg/tool/linux_amd64"
GCCGO="gccgo"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build130025366=/tmp/go-build -gno-record-gcc-switches"
2. golang helloworld 版本说明
[root@fc30-hadoop go]# cat helloworld.go
package main
import "fmt"
import "time"
func main() {
//2006-01-02 15:04:05是go的诞生时间,所以这么设计Format的Layout,任何更改都不行
var currtime = time.Now().Format("2006-01-02 15:04:05 Mon")
fmt.Print("Today is:",currtime,"\n")
fmt.Println("Hello, World!")
}
说明如下:
第一行代码 package main 定义了包名。你必须在源文件中非注释的第一行指明这个文件属于哪个包,如:package main。package main表示一个可独立执行的程序,每个 Go 应用程序都包含一个名为 main 的包
下一行 import "fmt" 告诉 Go 编译器这个程序需要使用 fmt 包(的函数,或其他元素),fmt 包实现了格式化 IO(输入/输出)的函数。
func main() 是程序开始执行的函数。main 函数是每一个可执行程序所必须包含的,一般来说都是在启动后第一个执行的函数(如果有 init() 函数则会先执行该函数)。
当标识符(包括常量、变量、类型、函数名、结构字段等等)以一个大写字母开头,如:Group1,那么使用这种形式的标识符的对象就可以被外部包的代码所使用(客户端程序需要先导入这个包),这被称为导出(像java/c++中的 public);标识符如果以小写字母开头,则对包外是不可见的,但在整个包的内部是可见并且可用的(像java/c++中的 protected )。
###引用包要放在声明之前
###下面写法会报编译错误
package main
type Empty struct {}
import "fmt"
# command-line-arguments
./set.go:3:1: syntax error: non-declaration statement outside function body
修正后的可以如下:
package main
import "fmt"
type Empty struct {}
3. 执行go程序
3.1 类似于脚本语言运行 类似于java/python
#go run helloworld.go
Hello, World!
3.2 编译成目标语言运行,类似于c/c++
[root@fc30-hadoop go]# go build helloworld.go
[root@fc30-hadoop go]# ls
helloworld helloworld.go
[root@fc30-hadoop go]# ./helloworld
Hello, World!
[root@fc30-hadoop go]# ll
total 3908
-rwxr-xr-x. 1 root root 1997284 Dec 2 21:25 helloworld
-rw-r--r--. 1 root root 77 Dec 2 17:57 helloworld.go
[root@fc30-hadoop go]# ./helloworld
Hello, World!
3.3 ##go install error
install compile and install packages and dependencies
install 后接文件夹名称
[root@fc30-hadoop week1]# go install routin
can't load package: package routin: cannot find package "routin" in any of:
/usr/lib/golang/src/routin (from $GOROOT)
/root/go/src/routin (from $GOPATH)
3.4 ###go build error
build compile packages and dependencies
编译后的目标文件位于当前目录
[root@fc30-hadoop week1]# go build routin
can't load package: package routin: cannot find package "routin" in any of:
/usr/lib/golang/src/routin (from $GOROOT)
/root/go/src/routin (from $GOPATH)
4. go 时间程序
引入其他时间包 time 操作系统包os
package main
import "fmt"
import "time"
import "os"
func hostinformation() {
fmt.Println(os.Hostname())
}
func main() {
//:= 短变量声明
start := time.Now().UnixNano()
hostinformation()
end := time.Now().UnixNano()
//测试hostinformation运行时间
fmt.Printf("cost is :%d \n", ( end-start)/1000)
}
5.go 并发执行
go function( 参数1 参数2 ... 参数n) 会启动一个轻量级线程 goroutine来启动task,线程之间共享地址空间。
package main
import (
"fmt"
"time"
)
func say(s string) {
for i := 0; i < 10; i++ {
time.Sleep(100*time.Millisecond)
fmt.Println(s)
}
}
func main() {
go say("I Love")
say("China")
}
运行结果如下:
[root@fc30-hadoop week1]# ./routin
I Love
China
China
I Love
I Love
China
China
I Love
I Love
China
China
I Love
I Love
China
China
I Love
I Love
China
China
其实从运行结果来看是不能使用的程序,虽然做到了并发,但输出结果并无意义。