设为首页 收藏本站
查看: 1975|回复: 0

[经验分享] Golang入门教程(二)Ubuntu16.04下安装golang(实例:Golang 定时任务管理器)

[复制链接]

尚未签到

发表于 2018-9-19 12:31:30 | 显示全部楼层 |阅读模式
通过两种方式安装
  一、通过apt-get安装
  1、安装
  

sudo apt-get install golang  

  2、设置GOPATH变量
  GOPATH是扩展库的目录,Go先搜索标准库目录,然后搜索GOPATH库目录,所有的非标准库都放在GOPATH下。以GOPATH为“/usr/local/go”目录为例子:
  (1)把export GOPATH=/opt/go加入到~/.bashrc文件的最后。
  (2)source ~/.bashrc 重新加载配置
  这样就加好了GOPATH。注意:apt-get命令安装只能安装go1.6版本现在很多开源项目都用上了1.7以上建议手动安装更高版本。
  二、手动安装新的稳定版本(重要)
  1、以1.8版本为例子下载go1.8.linux-amd64.tar.gz安装包,官方下载地址:https://golang.org/dl/,官方经常抽风打不开。
  下载地址:http://www.golangtc.com/download
DSC0000.png

  2、使用tar命令将安装包解压到/usr/local目录下:
  

tar -xzf go1.8.linux-amd64.tar.gz  -C /usr/local  

  注意:root 权限问题
  验证安装结果,执行以下命令:
  

/usr/local/go/bin/go version  

  出现以下结果表示安装成功:
DSC0001.png

  3、环境变量的设置
  【1】单个用户配置:在 ~/.bashrc文件末尾加上如下环境变量:
  

vim ~/.bashrc  

  

export GOPATH=/opt/go  
export GOROOT
=/usr/local/go  
export GOARCH
=386  
export GOOS
=linux  
export GOBIN
=$GOROOT/bin/  
export GOTOOLS
=$GOROOT/pkg/tool/  
export PATH
=$PATH:$GOBIN:$GOTOOLS  

  重新加载 profile 文件,加载环境变量到内存。查看安装版本
  

source ~/.bashrc  

  【2】多用户配置(推荐)
  

vim /etc/profile  # 文件末尾添加以下内容  

  

export GOPATH=/home/www/golang/gopath  
export GOROOT
=/usr/local/go  
export GOARCH
=386  
export GOOS
=linux  
export GOTOOLS
=$GOROOT/pkg/tool  
export PATH
=$PATH:$GOROOT/bin:$GOPATH/bin  

  重新加载 profile 文件,加载环境变量到内存
  

source /etc/profile  

  在任意目录查看安装版本:
  

www@TinywanAliYun:~$ go version  
go version go1.
9.1 linux/amd64  

  附带:Windows 环境变量配置
DSC0002.png

  4.、编写hello.go文件,测试安装是否成功,代码如下:
  

package main  
import
"fmt"  
func main() {
  fmt.Println(
"Hello World!")  
}
  

  5、运行hello.go
  【1】用go run命令直接运行hello.go
  

www@TinywanAliYun:~/golang$ pwd  
/home/www/golang
  
www@TinywanAliYun:
~/golang$ go run hello.go  
Hello World
!  

  【2】用go build命令生成hello可执行文件
  

www@TinywanAliYun:~/golang$ go build hello.go  
www@TinywanAliYun:
~/golang$ ls  
hello  hello.go
  
www@TinywanAliYun:
~/golang$ ./hello  
Hello World
!  

  【3】环境变量查看
  

www@TinywanAliYun:/usr/local/go$ go env  
GOARCH
="386"  
GOBIN
=""  
GOEXE
=""  
GOHOSTARCH
="amd64"  
GOHOSTOS
="linux"  
GOOS
="linux"  
GOPATH
="/home/www/golang/gopath"  
GORACE
=""  
GOROOT
="/usr/local/go"  
GOTOOLDIR
="/usr/local/go/pkg/tool/linux_amd64"  
GCCGO
="gccgo"  
GO386
="sse2"  
CC
="gcc"  
GOGCCFLAGS
="-fPIC -m32 -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build103397464=/tmp/go-build -gno-record-gcc-switches"  
CXX
="g++"  
CGO_ENABLED
="0"  
CGO_CFLAGS
="-g -O2"  
CGO_CPPFLAGS
=""  
CGO_CXXFLAGS
="-g -O2"  
CGO_FFLAGS
="-g -O2"  
CGO_LDFLAGS
="-g -O2"  
PKG_CONFIG
="pkg-config"  

  注意:GOPATH路径,要自己动手创建:mkdir -p /home/www/golang/gopath
  主要变量说明:
  1、GOROOT就是go的安装路径
  2、GOPATH是作为编译后二进制的存放目的地和import包时的搜索路径 (其实也是你的工作目录, 你可以在src下创建你自己的go源文件, 然后开始工作)
  3、GOPATH目录结构
  

goWorkSpace // (goWorkSpace为GOPATH目录)  -- bin    // golang编译可执行文件存放路径,可自动生成。
  -- pkg    // golang编译的.a中间文件存放路径,可自动生成。
  -- src    // 源码路径。按照golang默认约定,go run,go install等命令的当前工作路径(即在此路径下执行上述命令)。
  

  GOPATH之下主要包含三个目录: bin、pkg、src
  (1)bin目录主要存放可执行文件;
  (2)pkg目录存放编译好的库文件, 主要是*.a文件;
  (3)src目录下主要存放go的源文件
  (4) GOPATH可以是一个目录列表, go get下载的第三方库, 一般都会下载到列表的第一个目录里面
  (5) 需要把GOPATH中的可执行目录也配置到环境变量中, 否则你自行下载的第三方go工具就无法使用了, 操作如下:
  (6)GOBIN go install编译存放路径。不允许设置多个路径。可以为空。为空时则遵循“约定优于配置”原则,可执行文件放在各自GOPATH目录的bin文件夹中(前提是:package main的main函数文件不能直接放到GOPATH的src下面
  参考文章:https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/01.2.md
  GOPATH下的src目录就是接下来开发程序的主要目录,所有的源码都是放在这个目录下面,那么一般我们的做法就是一个目录一个项目,例如: $GOPATH/src/mymath 表示mymath这个应用包或者可执行应用,这个根据package是main还是其他来决定,main的话就是可执行应用,其他的话就是应用包。
  (7)目录结构
  

www@TinywanAliYun:~/golang/gopath$ tree -L 2  
.
  
├── bin
  
├── pkg
  
└── src
  

  注意:$GOPATH 指定的目录要自己新建,包括下面的src目录
  下面我就以mymath为例来讲述如何编写应用包,执行如下代码
  

cd $GOPATH/src  

mkdir mymath  

  新建文件sqrt.go,内容如下
  

// $GOPATH/src/mymath/sqrt.go源码如下:  
package mymath
  

  
func Sqrt(x float64) float64 {
  z :
= 0.0  for i := 0; i < 1000; i++ {
  z -= (z*z - x) / (2 * x)
  }
  return z
  
}
  

  这样我的应用包目录和代码已经新建完毕,注意:一般建议package的名称和目录名保持一致
  编译应用
  上面我们已经建立了自己的应用包,如何进行编译安装呢?有两种方式可以进行安装
  1、只要进入对应的应用包目录,然后执行go install,就可以安装了
  2、在任意的目录执行如下代码go install mymath
  安装完之后,我们可以进入如下目录:
  

www@TinywanAliYun:~/golang/gopath$ tree -L 3  
.
  
├── bin
  
├── pkg
  
│   └── linux_386
  
│       └── mymath.a
  
└── src
  └── mymath
  └── sqrt.go
  

  这个.a文件是应用包,那么我们如何进行调用呢?
  接下来我们新建一个应用程序来调用这个应用包
  新建应用包mathapp
  

cd $GOPATH/src  

mkdir mathapp  
cd mathapp
  
vim main.go
  

  $GOPATH/src/mathapp/main.go源码:
  

package main  

  
import (
"mymath"  "fmt"
  
)
  

  
func main() {
fmt.Printf("Hello, world.  Sqrt(2) = %v\n", mymath.Sqrt(2))  
}
  

  可以看到这个的package是main,import里面调用的包是mymath,这个就是相对于$GOPATH/src的路径,如果是多级目录,就在import里面引入多级目录,如果你有多个GOPATH,也是一样,Go会自动在多个$GOPATH/src中寻找。
  如何编译程序呢?进入该应用目录,然后执行go build,那么在该目录下面会生成一个mathapp的可执行文件
  

www@TinywanAliYun:~/golang/gopath/src/mathapp$ ls  
main.go
  
www@TinywanAliYun:
~/golang/gopath/src/mathapp$ go build  
www@TinywanAliYun:
~/golang/gopath/src/mathapp$ ls  
main.go  mathapp
  

  执行可执行文件 ,输出如下内容
  

www@TinywanAliYun:~/golang/gopath/src/mathapp$ ./mathapp  
Hello, world.  Sqrt(
2) = 1.414213562373095  

  如何安装该应用,进入该目录执行go install,那么在$GOPATH/bin/linux_386下增加了一个可执行文件mathapp, 还记得前面我们把$GOPATH/bin加到我们的PATH里面了,这样可以在命令行输入如下命令就可以执行
  

www@TinywanAliYun:~/golang/gopath/src/mathapp$ go install  
www@TinywanAliYun:
~/golang/gopath/src/mathapp$ cd $GOPATH/bin  
www@TinywanAliYun:
~/golang/gopath/bin$ ls  
linux_386
  
www@TinywanAliYun:
~/golang/gopath/bin$ cd linux_386/  
www@TinywanAliYun:
~/golang/gopath/bin/linux_386$ ls  
mathapp
  
www@TinywanAliYun:
~/golang/gopath/bin/linux_386$ ./mathapp  
Hello, world.  Sqrt(
2) = 1.414213562373095  

  以上我们展示如何编译和安装一个可运行的应用,以及如何设计我们的目录结构。
  获取远程包
  go语言有一个获取远程包的工具就是 go get
  通过这个命令可以获取相应的源码:
  

www@TinywanAliYun:~/golang/gopath/src$ go get github.com/astaxie/beedb  
www@TinywanAliYun:
~/golang/gopath/src$ ls  
github.com  mathapp  mymath
  

  通过上面获取的代码在我们本地的源码相应的代码结构如下:
  

www@TinywanAliYun:~/golang/gopath$ tree -L 3  
.
  
├── bin
  
│   └── linux_386
  
│       └── mathapp
  
├── pkg
  
│   └── linux_386
  
│       ├── github.com
  
│       └── mymath.a
  
└── src
  ├── github.com
  │   └── astaxie
  ├── mathapp
  │   └── main.go
  └── mymath
  └── sqrt.go
  

  go get本质上可以理解为首先第一步是通过源码工具clone代码到src下面,然后执行go install,在代码中如何使用远程包,很简单的就是和使用本地包一样,只要在开头import相应的路径就可以:
  

import "github.com/astaxie/beedb"  

  从上面的结构我们可以很清晰的看到,bin目录下面存的是编译之后可执行的文件,pkg下面存放的是应用包,src下面保存的是应用源代码
  刚学习的支持扩展一下,搞一个Golang 写的 定时任务管理器
  源码地址:https://github.com/lisijie/webcron
  切换到$GOPATH/src目录下,下载源码:
  

git clone https://github.com/lisijie/webcron.git  

  通过 go build 编译一个可执行文件webcron
  

gopath/src# cd webcron/  
gopath
/src/webcron# ls  
app  conf
install.sql  main.go  pack.sh  README.md  run.sh  screenshot.png  static  views  
gopath
/src/webcron# go build  
gopath
/src/webcron# ls  
app  conf
install.sql  main.go  pack.sh  README.md  run.sh  screenshot.png  static  views  webcron  

DSC0003.png

  以上提示表示链接mysql数据有问题
  修改mysql数据库配置信息,创建一个数据库webcron
  mysql -u root -p123456
  

mysql> create database webcron;  
Query OK,
1 row affected (0.03 sec)  

  
mysql
> show databases;  

+--------------------+  
| Database           |
  
+--------------------+
  
| information_schema |
  
| mysql              |
  
| performance_schema |
  
| webcron            |
  
| zabbix             |
  
+--------------------+
  
5 rows in set (0.00 sec)
  

  导入数据:
  

/home/www/gopath/src/webcron#  mysql -u root -p123456 -D webcron < install.sql  

  修改配置文件:vim conf/app.conf
  

# 数据库配置  
db.host
= 127.0.0.1  
db.user
= root  
db.password
= "123456"  
db.port
= 3306  
db.name
= webcron  
db.prefix
= t_  
db.timezone
= Asia/Shanghai  

  再次执行,看来是OK了
DSC0004.png

  浏览器查看:http://127.0.0.1:8000/login
DSC0005.png

DSC0006.png

DSC0007.png

  修改可执行文件到后台运行
DSC0008.png

  再次测试mysql数据库信息
DSC0009.png

  定制任务执行的结果
DSC00010.png

DSC00011.png

  发送邮件配置 : vim conf/app.conf
  

# 邮件服务器配置  
mail.queue_size
= 100  
mail.from
= tinywan@163.com  
mail.host
= smtp.163.com  
mail.port
= 25  
mail.user
= tinywan@163.com  
mail.password
= 123456  

  任务失败,邮件通知信息
DSC00012.png

  邮箱接受到的信息
DSC00013.png

DSC00014.png

  两封邮件的时间间隔恰好是10s
DSC00015.png

  添加一个redis 执行脚本
  

#!/bin/bash  
logs_path
="/home/www/bin/"  
TIME
=`date '+%Y-%m-%d %H:%M:%S'`  
REDIS_HOST
='127.1.1.1'  
REDIS_PORT
='639'  
REDIS_PASS
='tinywan2321'  
REDIS_DB
=12  
GO
=$(redis-cli -h 127.0.01 -p 23423  -a  dddd -n 12 get Golang)  

echo " Redis Crontab [ " $(date '+%Y-%m-%d %H:%M:%S') " ] ::" $GO  >> /home/www/bin/crontab_redis_12.log  

  脚本执行结果,红色为redis 数据库获取的数据
DSC00016.png

  php 执行脚本
  

#!/usr/bin/php  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-594269-1-1.html 上篇帖子: Golang哲学思想 下篇帖子: Golang源码探索(一) 编译和调试源码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表