go语言

一 搭建环境
去官网(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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值