一 搭建环境
去官网(https://golang.org/dl/,墙内地址:https://golangtc.com/download)下载源码。
1、下载源码包:go1.9.linux-amd64.tar.gz。(1.4调mysql有问题)
2、将下载的源码包解压至 /usr/local目录。
tar -C /usr/local -xzf go1.9.linux-amd64.tar.gz
vi /etc/profile
export GOROOT=/usr/local/go #设置为go安装的路径
export GOPATH=$HOME/gocode #默认安装包的路径
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
source /etc/profile
查看版本号。
go version
liteide搭建
下载liteide,地址:https://www.golangtc.com/download/liteide(境外下载地址:https://github.com/visualfc/liteide/releases/tag/x33.3),如: liteidex32.1.linux64-qt4-system.tar.bz2
tar jxvf liteidex32.1.linux64-qt4-system.tar.bz2
进入到解压后的目录
/home/xxx/Desktop/liteide/bin
安装qt yum install qt
直接运行liteide
qt4装上还是不能用
可能是qt4跟lite工具不匹配。
修改字体
“查看”-》“选项”,可以改liteOutput,liteEditor的字体。
二 安装测试
创建工作目录 C:\>Go_WorkSpace。
文件名: test.go,代码如下:
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
使用 go 命令执行以上代码输出结果如下:
C:\Go_WorkSpace>go run test.go
Hello, World!
sleep
package main
import (
"fmt"
"os/exec"
"time"
)
func main() {
time.Sleep(15 * time.Second)
}
//start ffmpeg cmd
t := time.Now()
tstart := t.Unix()
//do something
t = time.Now()
tend := t.Unix()
costtime := tend - tstart
//得到效率
rate := float64(costtime) * 1000 / float64(totalSec)
fmt.Println("costtime:", costtime, "rate:", rate)
transinfo += fmt.Sprintf("<rate>%.2fX</rate>", rate)
// 打印当前时间
package main
import (
"fmt"
"time"
)
func main() {
fmt.Println(time.Now().Format("2006-01-02 15:04:05"))
}
#函数
package main
import "fmt"
func swap(x, y string) (string, string) {
return y, x
}
func main() {
a, b := swap("Mahesh", "Kumar")
fmt.Println(a, b)
}
执行结果为:Kumar Mahesh
#执行shell脚本
package main
import (
"bytes"
"fmt"
"log"
"os/exec"
)
func exec_shell(s string) {
cmd := exec.Command("/bin/bash", "-c", s)
var out bytes.Buffer
cmd.Stdout = &out
err := cmd.Run()
if err != nil {
log.Fatal(err)
}
fmt.Printf("%s", out.String())
}
func main() {
exec_shell("uname ")
}
最简单的方法:
cmd := exec.Command("/bin/sh/", "-c", "linux命令")
:= exec.Command("/bin/sh/", "-c", "linux命令")
或复杂的, 各个参数都要单独写
cmd := exec.Command("ls", "-l", "-a")
:= exec.Command("ls", "-l", "-a")
Start执行不会等待命令完成就,Run会阻塞等待命令完成。
//lsCmd := exec.Command("bash", "-c", "/home/shell/modifyhls.sh /data/channellist/channel03/index.m3u8 10 a a & ")
关键字:
defer是golang语言中的关键字,用于资源的释放,会在函数返回之前进行调用。
一般采用如下模式:
f,err := os.Open(filename)
if err != nil {
panic(err)
}
defer f.Close()
如果有多个defer表达式,调用顺序类似于栈,越后面的defer表达式越先被调用。
package
// File: main.go
package main
import "fmt"
func learn() {
fmt.Println("I am learning.")
}
func main() {
fmt.Println("----main start ----")
learn()
eat()
fmt.Println("----main end ----")
}
// File: eat.go
package main
import "fmt"
func eat() {
fmt.Println("I am eating.")
}
在命令行编译一下,然后执行
$ go build . # 会在当前目录生成名为`go`的执行文件
$ ./go
结果输出
----main start ----
I am learning.
I am eating.
----main end ----
初始化
Go里面有两个保留的函数:init函数(能够应用于所有的package)和main函数(只能应用于package main)。这两个函数在定义时不能有任何的参数和返回值。虽然一个package里面可以写任意多个init函数,但这无论是对于可读性还是以后的可维护性来说,我们都强烈建议用户在一个package中每个文件只写一个init函数。
Go程序会自动调用init()和main(),所以你不需要在任何地方调用这两个函数。每个package中的init函数都是可选的,但package main就必须包含一个main函数。
程序的初始化和执行都起始于main包。如果main包还导入了其它的包,那么就会在编译时将它们依次导入。有时一个包会被多个包同时导入,那么它只会被导入一次(例如很多包可能都会用到fmt包,但它只会被导入一次,因为没有必要导入多次)。当一个包被导入时,如果该包还导入了其它的包,那么会先将其它包导入进来,然后再对这些包中的包级常量和变量进行初始化,接着执行init函数(如果有的话),依次类推。等所有被导入的包都加载完毕了,就会开始对main包中的包级常量和变量进行初始化,然后执行main包中的init函数(如果存在的话),最后执行main函数。下图详细地解释了整个执行过程:
类的继承
有些语言支持多重继承,但是如果多个父类存在相同的属性或方法,就会发生冲突,有些语言为了防止这种情况而只支持单继承,很明显就没有了复用多个父类的属性和方法的优势。
go语言其实没有对象的概念,只有结构体。
比如有一个父亲,是中国人:
type Father struct {
MingZi string
}
func (this *Father) Say() string {
return "大家好,我叫 " + this.MingZi
}
可以理解为父亲类有一个属性,有一个Say方法
有父亲当然有母亲,母亲是个外国人:
type Mother struct {
Name string
}
func (this *Mother) Say() string {
return "Hello, my name is " + this.Name
}
父亲和母亲结合有了孩子类,孩子类继承了父亲和母亲:
type Child struct {
Father
Mother
}
然后孩子类有一个实例c:
c := new(Child)
c.MingZi = "张小明"
c.Name = "Tom Zhang"
因为MingZi和Name这个属性在Mother和Father中并没有冲突,所以可以直接使用 c. 就可以获取而没有问题
但是,如果这样直接调用Child类的Say方式:
c.Say()
会出现冲突:
ambiguous selector c.Say
怎么办?其实这样就可以轻松解决:
c.Father.Say()
c.Mother.Say()
上面两条表达式的值分别为:
大家好,我叫 张小明
Hello, my name is Tom Zhang
事实上,Go采用的是组合的方式来实现面向对象中的继承,再次证实了“组合优于继承”这句话。
vscode的搭建
需要安装各种库,如果下载安装不了,估计是网络问题,可以去github上下载,然后安装,例如:
go install github.com/ramya-rao-a/go-outline
go get -u -v github.com/nsf/gocode
go get -u -v github.com/rogpeppe/godef
go get -u -v github.com/golang/lint/golint
go get -u -v github.com/lukehoban/go-find-references
go get -u -v github.com/lukehoban/go-outline
go get -u -v sourcegraph.com/sqs/goreturns
go get -u -v golang.org/x/tools/cmd/gorename
go get -u -v github.com/tpng/gopkgs
go get -u -v github.com/newhook/go-symbols