• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Golang Go Go Go part1:安装及运行

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

golang 知识图谱

https://www.processon.com/view/link/5a9ba4c8e4b0a9d22eb3bdf0

 

一、安装

最新版本安装包地址:https://golang.google.cn/dl/

要自己编译安装下载 source 源码包,否则根据自己 LINUX 系统下载对应版本的编译包,这里直接下载  go1.11.4.darwin-amd64.tar.gz

把下载的 golang 包解压到 /opt 下面:  

sudo tar -C /opt/ -xzf go1.11.4.linux-amd64.tar.gz

 

解压完 golang 语言包存在 /opt/go 下, 使用命令查看go程序路径 , 显示 go 程序的路径是 /opt/go/bin/go

  whereis go

 

查看 go 版本: 

  /opt/go/bin/go version

 

如果需要在 终端内直接 输入 go 就能全局地使用 go 程序, 还需要配置系统环境变量。

在 /etc/profile 文件后面加入配置:

export GOROOT=/opt/go
export GOPATH=/home/ecalf/goProject
export GOBIN=$GOPATH/bin
export PATH=$PATH:$GOBIN:$GOROOT/bin

 

或者建立下面软件接

sudo ln -s /opt/go/bin/go /usr/bin/go
sudo ln -s /opt/go/bin/go /usr/local/bin/go

 

这些配置方法跟 node 的配置类似,有开发过 node 的经验应该会很熟悉。 

 

查看 go 相关环境变量

go env

输出

GOARCH="amd64"
GOBIN="/home/ecalf/goProject/bin"
GOCACHE="/home/ecalf/.cache/go-build"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/home/ecalf/goProject"
GOPROXY=""
GORACE=""
GOROOT="/opt/go"
GOTMPDIR=""
GOTOOLDIR="/opt/go/pkg/tool/linux_amd64"
GCCGO="/usr/bin/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-build111443368=/tmp/go-build -gno-record-gcc-switches"

 

GOROOT 是 go 所在目录,go 命令在 GOROOT/bin 内;

GOPATH 是 go 的工作目录,可以指定多个文件夹。

$GOPATH 目录约定有三个子目录:

1. src 存放源代码(比如:.go .c .h .s等)
2. pkg 编译后生成的文件(比如:.a)
3. bin 编译后生成的可执行文件(为了方便,把此目录加入到 $PATH 变量中)

所有开发的 go 代码都要放在 GOPATH/src 指定的目录下,go get 等命令获取的代码包也会自动放置在这些目录下。

 

环境变量配置好后,查看go版本只要在命令行输入

go version

 

关于程序文件编码: Go语言的源文件采用UTF8编码。

 

二、hello world

在 $GOPATH/src 下创建项目文件夹 hello,在 项目文件夹下面编辑文件:  hello.go 

  
package main
import "fmt"

/*first go program */
//hello world
func main() { //go 程序的新行不能以 { 开始
   fmt.Println("Hello, World!")
}

 

进入$GOPATH/src/hello 目录  

使用 go run 命令直接在终端执行,查看运行结果:

go run ./hello.go

 

 使用 go build 命令把 go 程序编译为可执行文件

go build ./hello.go

 

使用 go install 命令编译并生成可执行文件

go install hello

命令执行后,在 $GOPATH/bin 下生成了可以行文件  hello

 

 

在终端执行生成的程序

./hello

 

下面是几个关于运行和编译的命令:

go run: 编译并直接运行程序,产生一个临时文件,直接在命令行输出程序执行结果但不生成可执行文件,多用于程序的简单调试。当执行的文件引用了包内其他文件的方法时,必须指定编译用到的所有文件,这个时候可以使用通配符来指定编译所有文件   go run *.go 。   该命令执行的文件可以放在任何目录内,只要正确指定要编译的文件路劲即可,但这些文件必须是同一个 main 包内的。

go build:测试编译包,主要检查是否会有编译错误,如果是一个可执行文件的源码(即是 main 包,go 的程序入口是 main 函数),就会在当前目录下直接生成一个可执行文件。

go install:该命令有2个作用,1.编译程序,先编译所有导入的包文件,然后才会编译主程序;2.将编译生成的可执行文件放到 $GOPATH/bin 目录下,编译后的包文件放到 $GOPATH/pkg 目录下。

 

其他 go 命令文档可查阅下面官方文档

https://golang.google.cn/cmd/

 

 

 

三、golang 的 package 概念

GO本身没有项目的概念,只有包,go 通过package来组织结构,每个 go 代码文件的第一行非注释代码都必须使用 package 命令来声明代码所属的包名,同一个目录中(不含子目录)的所有代码文件只能属于同一个包,即一个文件夹就是一个包。

go 的包分两种:可执行包(命令包,有main函数,编译后放在$GOPATH/bin内)和不可执行包(只供调用,没有main函数,编译后放在$GOPATH/pkg内),包开发源代码都放在 $GOPATH/src 目录下,GO命令和编译器会在 $GOROOT/src 和 $GOPATH/src 目录下搜索相应的包。

因为导入包的时候要通过包文件的目录,而使用包提供的方法则需要通过包名,为了方便包定位,供调用的pkg包应该保持包名和目录名称一致,有main函数的可执行包的包名必须是main,可以使用程序名称作为包的文件夹名称。

 

可执行包的 main 函数:

  •  main 函数是go程序的入口, main 函数必须放在 package 名称为 main 的包内。
  • 一个可执行程序有且只有一个main函数,同一个包内不能出现两个main函数,否则 go build 命令和 go install 命令将报错。

 

包的初始化:

  • 一个包如果依赖另一个包,依赖包会被先导入和初始化。
  • 包 可以定义 0个或多个 init 函数,包的 init 函数将在包被导入初始化后先于 main 函数自动执行。
  • init 函数不需要传入参数,也不会返回任何值,不能被主动调用(如果被注定调用会提示init未声明),重复导入包只会执行一次 init 函数,init 函数可以调用其他函数。
  • 如果一个包有多个init函数,他们的执行顺序是不确定的。

 

包的导入:

  • 如果导入了一个包但没有使用它,编译时将报错。
  • 如果你引用包只是为了调用 init 函数去做一些初始化工作,但不打算使用包,可以将导入包重命名为 _  (空标识符,也就是下划线)来避免报错。
  • 当导入第三方包时,包名很可能非常接近或相同,需要使用别名来进行区别和调用。
  • 如果导入的包被重命名为 . (点号),使用包的的方法时可以省略包名,但一般不建议这样做。
  • 包的可见性:定义的常量、变量、类型、接口、结构、函数等的名称如果是小写字母或下划线开头,表示是只能在包内使用(有点像 protected),同一个包内,不同的文件之间可以自由调用各文件定义的常量、变量、函数,如果是大写字母开头则表示可以在包外被访问(有点像 public)。

导入 xxx/yyy 包并重名别名

import _ "xxx/yyy"

  

 

包的执行顺序: 依赖包常量、变量、函数 初始化,赋值 -> 依赖包 init函数 -> 包的初始化 ,赋值 -> 包的init函数 -> main 函数

 

一个简单的测试

src/bin/hello 包内有两个文件:

 

hello.go

package main
import "fmt"
import cat "../cat"



func main() {
	fmt.Println("main function")
   fmt.Println("Hello, World!")
   sayHi();
   wei();
   cat.SayHello();//调用cat包的方法

}

func sayHi(){
	fmt.Println("say hi")
}

func init(){
    fmt.Println("init in hello")
}

    

wei.go

package main
import "fmt"


func init(){
    fmt.Println("init in wei")
}

func wei(){
    fmt.Println("wei...")
}

 

src/bin/cat  包内有一个文件 cat.go :

package cat
import "fmt"


func init(){
    fmt.Println("init in cat")
}

func miao(){
    fmt.Println("miao miao ...")
}

func SayHello(){
	miao()
}

  

 

  

进入 src/hello 下调试:  

go run *.go

 

编译生成可执行文件

go install *.go

 

执行结果

init in cat
init in hello
init in wei
main function
Hello, World!
say hi
wei...
miao miao ...

 

  

 

 

to be continued


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
BP神经网络 - Wanna_Go发布时间:2022-07-10
下一篇:
Go中方法接收者是指针类型和值类型的根本区别发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap