Golang Go Go Go part1:安装及运行
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=""
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
Golang Go Go Go part1:安装及运行的更多相关文章
- .net RabbitMQ 介绍、安装、运行
RabbitMQ介绍 什么是MQ Message Queue(简称:MQ),消息队列 顾名思义将内容存入到队列中,存入取出的原则是先进先出.后进后出. 其主要用途:不同进程Process/线程Thre ...
- Python 2/3 安装与运行环境设置
Python 2/3 安装与运行环境设置: 1.Python 软件源:https://www.python.org/ 下载Win版本 https://www.python.org/downloa ...
- 使用工具安装,运行,停止,卸载Window服务
WSWinForm.exe介绍 WSWinForm.exe是我自己开发的一个实用的小工具,用于将任何EXE程序作为Windows服务运行.也就是说WSWinForm只是其注册程序的服务外壳,这个特性对 ...
- VMware10.06精简版安装后台运行
VMware10.06精简版安装时会出现一个安装功能选择菜单,里面有一条后台运行必选功能,一般人会跳过条.当你打算在服务器上用vmware时,一定要安装后台运行服务,否则你无法换出正在运行的后台虚拟机 ...
- phpstudy 出现“请自行检查是否安装VC9运行库??”问题 -- 缺少vc9库
phpStudy是一款PHP调试环境的程序集成包,该程序包集成最新的Apache+PHP+MySQL+phpMyAdmin+ZendOptimizer,一次性安装,无须配置即可使用,是非常方便.好用的 ...
- JavaWeb学习之tomcat安装与运行、tomcat的目录结构、配置tomcat的管理用户、web项目目录、虚拟目录、虚拟主机(1)
1.tomcat安装与运行双击tomcat目录下的bin/startup.bat,启动之后,输入http://localhost:8080,出现安装成功的提示,表示安装tomcat成功 2.tomca ...
- 解决安装vc2005运行库时提示Command line option syntax error.Type Command/?for Help
安装vc2005运行库时提示 这是因为它要自解压到用户的临时文件夹下,如果用户名中带中文,就会报错. 简单的解决方法是,手动解压之,再安装 当然,你也可以修改用户名或者再新建个用户.
- 解决不安装VC运行库(VC2005,VC2008),程序运行出错的方法
因为VS2005以后程序采用了manifest的生成方式,所以发布的时候要和运行库一起发布.但是我们平时开发和发布的时候如果都要客户安装运行库,那就不太方便了.你可以Microsoft下载:http: ...
- win7 64下暗黑世界V1.1 服务器端及客户端的安装及运行 成功
原地址:http://bbs.gameres.com/thread_223717.html 屌丝一枚,没有MAC 更没有XCODE 潜心整了星期六与星期天两天才安装运行成功...只能说安装太复杂了,, ...
- Visual Studio 2015 Update 1 成功安装后运行 “出现未能正确加载[XXXX]包,此问题可能是由配置更改或安装另一个扩展导致的。” 可能的解决方法
作死装Visual Studio 2015 update 1.安装过程中虽然波澜不惊,但是安装之后运行回报未能正确安装[XXXX]包.找了半天,在stackoverflow中找到了相关的问题,在问题描 ...
随机推荐
- JDBC编程六部曲
今天初学jdbc,明白了大致的编程流程,在此总结一下: JDBC编程可以分为六步——六部曲: * 第一步:注册驱动. * 1.1 获取驱动对象 * 1.2 注册驱动 * 第二步:获取数据库连接 * 第 ...
- nginx rewrite规则笔记
优先级 在nginx的location和配置中location的顺序没有太大关系.正location表达式的类型有关.相同类型的表达式,字符串长的会优先匹配. 第一优先级:等号类型(=)的优先级最高. ...
- RabbitMQ开启服务却无法登录
我之前无聊之际修改了我的电脑名,后来发现我的rabbitmq服务无法开启,后来我又把电脑名改回去了还是不行,我从网上看了很多教程都没有成功,后来看到了这个方法,出处忘记了,不好意思,发出来记忆一下 包 ...
- js获取当前时间并实时刷新
效果如图: 代码如下: <html> <head> <title>js获取当前时间并实时刷新</title> <script> //页面加载 ...
- 小米Note 2简单卡刷开发版启用root超级权限的步骤
小米的机器不同手机型号一般MIUI官方论坛都提供两个不同版本,分别为稳定版和开发版,稳定版没有提供Root超级权限管理,开发版中就开启了Root超级权限,较多时候我们需要使用的一些功能强大的软件,都需 ...
- [转] iphoneX、iphoneXS、iphoneXSMax、iphoneXR适配
基础知识 1. 关于iphoneX .iphoneXS.iphoneXSMax.iphoneXR机型的大小和像素 机型尺寸 注意:开发人员只需要记住开发尺寸 2. 屏幕组成 齐刘海(44px) + ...
- PHP删除目录及目录下所有文件
/** * 删除目录及目录下所有文件或删除指定文件 * @param str $path 待删除目录路径 * @param int $delDir 是否删除目录,1或true删除目录,0或false则 ...
- RabbitMQ通过Exchange.topic 对routingkey 进行正则表达式匹配
消费者: static void Main(string[] args) { ConnectionFactory factory = new ConnectionFactory() { HostNam ...
- YOLOv3:训练自己的数据(附优化与问题总结)
环境说明 系统:ubuntu16.04 显卡:Tesla k80 12G显存 python环境: 2.7 && 3.6 前提条件:cuda9.0 cudnn7.0 opencv3.4. ...
- HeadFirst学习笔记-1. 设计模式入门
1.概念 在开始学习前,我们先了解一些概念,方便我们接下来的学习. OO基础 抽象 继承 多态 封装 OO原则 封装变化 多用组合,少用继承 针对接口编程,不针对实现编程 设计模式 设计模式(Desi ...