GO语言的进阶之路-初探GO语言
GO语言的进阶之路-初探GO语言
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.为什么我们需要一门新语言
Go语言官方自称,之所以开发Go 语言,是因为“近10年来开发程序之难让我们有点沮丧”。 这一定位暗示了Go语言希望取代C和Java的地位,成为最流行的通用开发语言。
编程语言已经非常多,偏性能敏感的编译型语言有 C、C++、Java、C#、Delphi和Objective-C等,偏快速业务开发的动态解析型语言有PHP、Python、Perl、Ruby、JavaScript和Lua等,面向特定领域的语言有Erlang、R和MATLAB等,那么我们为什么需要 Go这样一门新语言呢?下面我们一起看一下近三年来GO语言在西方国家的使用情况,正杰只能说一路飙升,而且飙升的速度比python还要快!
在2000年前的单机时代,C语言是编程之王。随着机器性能的提升、软件规模与复杂度的提高,Java逐步取代了C的位置。尽管看起来Java已经深获人心,但Java编程的体验并未尽如人意。历年来的编程语言排行榜(如图0-1所示)显示,Java语言的市场份额在逐步下跌,并趋近于C语言的水平,显示了这门语言后劲不足。
2015年12月编程语言排行榜:http://www.csdn.net/article/2015-12-08/2826418-TIOBE(JAVA处于巅峰,此时的GO处于第五十名。)

到2016年12月的时候编程语言排行榜飙升到16名:http://www.52bcx.com/BC/news/1225.html(在Top10榜单中,另一个引入注目的是则属Python,其份额在持续上升中,目前排名第四位,Python易于学习,而且借助Python还可进行全栈开发。)

当然到2017的12月还没有到来,现在是3月,那么问题来了,这个GO语言真的能吃得消吗?会不会逆袭进阶前10呢?让我们拭目以待吧。
二.Windows环境下Golang的安装
说起安装环境大家首先得去下载相应的安装包,给大家推荐2个地址去下载相应的版本,我比较推荐国内的地址,因为没有被墙掉,如果你有VPN的话那就大可不必,直接去国外的官网上下载就好:
a>.https://dl.gocn.io/ (国内下载地址)
b>.https://golang.org/dl/ (国外下载地址,需VPN)
对了,如果不方便翻墙的话(翻墙可是运维的基本功哟!),可以用我下载好的地址:链接:http://pan.baidu.com/s/1pLmJF4n 密码:kdbf
1.选择相应的软件包,我这里选择的是压缩包,这样方便你指定安装的路径。

2.将下载后的软件解压到指定的目录,你可以自定义自己的路径。

3.设置Golang环境变量
Go 语言需要配置 GOROOT 和 Path 两个环境变量:GOROOT 和 GOPATH。以及后期要用到的Go的工作目录环境GOPATH。
a>.根目录 GOROOT 和 Path设置
打开环境变量

新建GOROOT环境变量

编辑PATH环境变量

这个是后续代码目录,新建系统变量 GOPATH,将其指向你的代码目录:

打开 CMD 终端,输入 go env 如果出现以下界面就说明你的安装是成功了。

三.Linux环境下Golang的安装
1.选择相应的版本进行安装,这里我选择的是Linux的安装包。

2.源码安装Golang环境
#!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com '''
[root@yinzhengjie ~]# mkdir -p /yinzhengjie/golang/local #创建go语言的虎安装环境目录
[root@yinzhengjie ~]# cd /yinzhengjie/golang/local/
[root@yinzhengjie local]# yum -y install lrzsz #安装linux和windows交换上传工具(这个工具默认是不支持上传4G的文件的哟)
[root@yinzhengjie local]# ls
go1.8.linux-amd64.tar.gz
[root@yinzhengjie local]# tar -xf go1.8.linux-amd64.tar.gz #用tar解压这个压缩包
You have new mail in /var/spool/mail/root
[root@yinzhengjie local]# ls
go go1.8.linux-amd64.tar.gz
[root@yinzhengjie local]# cd go/bin/ #进入这个已经被解压的目录中的安装程序中去
[root@yinzhengjie bin]# ls -l
total 28108
-rwxr-xr-x 1 root root 10068917 Feb 17 03:28 go
-rwxr-xr-x 1 root root 15226523 Feb 17 03:29 godoc
-rwxr-xr-x 1 root root 3481554 Feb 17 03:28 gofmt
[root@yinzhengjie bin]# ./go #执行这个二进制的程序,如果有以下信息说明你已经安装成功了,现在需要做的就是配置环境变量
Go is a tool for managing Go source code. Usage: go command [arguments] The commands are: build compile packages and dependencies
clean remove object files
doc show documentation for package or symbol
env print Go environment information
bug start a bug report
fix run go tool fix on packages
fmt run gofmt on package sources
generate generate Go files by processing source
get download and install packages and dependencies
install compile and install packages and dependencies
list list packages
run compile and run Go program
test test packages
tool run specified go tool
version print Go version
vet run go tool vet on packages Use "go help [command]" for more information about a command. Additional help topics: c calling between Go and C
buildmode description of build modes
filetype file types
gopath GOPATH environment variable
environment environment variables
importpath import path syntax
packages description of package lists
testflag description of testing flags
testfunc description of testing functions Use "go help [topic]" for more information about that topic. [root@yinzhengjie bin]# '''
3.Go 语言环境变量设置
#!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com ''' [root@yinzhengjie ~]# mkdir -pv /yinzhengjie/golang/path/
[root@yinzhengjie ~]# pwd #查看当前路径
/root
[root@yinzhengjie ~]# more .bash_profile #编辑当前用户的系统变量
# .bash_profile # Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi # User specific environment and startup programs PATH=$PATH:$HOME/bin export PATH export GOROOT=/yinzhengjie/golang/local/go
export GOPATH=/yinzhengjie/golang/path/
export PATH=$GOROOT/bin:$GOPATH/bin:$PATH
[root@yinzhengjie ~]#
[root@yinzhengjie ~]# source .bash_profile #需要手动的刷新一遍
[root@yinzhengjie ~]#
[root@yinzhengjie ~]# go env #如果 出现了以下代码说明你的环境配置已经OK啦
GOARCH="amd64"
GOBIN=""
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/yinzhengjie/golang/path/"
GORACE=""
GOROOT="/yinzhengjie/golang/local/go"
GOTOOLDIR="/yinzhengjie/golang/local/go/pkg/tool/linux_amd64"
GCCGO="gccgo"
CC="gcc"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0"
CXX="g++"
CGO_ENABLED="1"
PKG_CONFIG="pkg-config"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
[root@yinzhengjie ~]# '''
4.关于MAC安装环境我就不必太肥口舌了吧,大家只需要下载想用的软件包,然后解压安装即可,配置和linux配置方法一致。安装包参考下图。

三.GO语言的小技巧
1.编写Golang语言的“hello world”
#!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com '''
[root@yinzhengjie go_file]# more hello_world.go #注意大小写,不然你会进入坑的哟
package main
import "fmt" func main(){
fmt.Println("hello Yinzhengjie! Welcome to use golang!")
}
[root@yinzhengjie go_file]#
[root@yinzhengjie go_file]# go run hello_world.go
hello Yinzhengjie! Welcome to use golang!
[root@yinzhengjie go_file]#
'''
2.将go程序编译成不同操作系统的中可执行的二进制程序。
#!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com '''
[root@yinzhengjie go_file]# ll
total 4
-rw-r--r-- 1 root root 100 Jun 5 16:25 hello_world.go
[root@yinzhengjie go_file]#
[root@yinzhengjie go_file]# GOOS=linux go build -o hello.linux hello_world.go #编译成linux系统可以执行的二级制程序
You have new mail in /var/spool/mail/root
[root@yinzhengjie go_file]#
[root@yinzhengjie go_file]# ls -l
total 1520
-rwxr-xr-x 1 root root 1551621 Jun 5 16:30 hello.linux
-rw-r--r-- 1 root root 100 Jun 5 16:25 hello_world.go
[root@yinzhengjie go_file]#
[root@yinzhengjie go_file]# GOOS=windows go build -o hello.exe hello_world.go #编译成windows系统可以执行的二进制程序
[root@yinzhengjie go_file]#
[root@yinzhengjie go_file]#
[root@yinzhengjie go_file]# GOOS=darwin go build -o hello.mac hello_world.go #编译成mac系统可以执行的二进制程序
[root@yinzhengjie go_file]#
[root@yinzhengjie go_file]# ll #查看编译成功的程序,即使没有go环境照样是好使的
total 4704
-rwxr-xr-x 1 root root 1629696 Jun 5 16:30 hello.exe
-rwxr-xr-x 1 root root 1551621 Jun 5 16:30 hello.linux
-rwxr-xr-x 1 root root 1628192 Jun 5 16:31 hello.mac
-rw-r--r-- 1 root root 100 Jun 5 16:25 hello_world.go
[root@yinzhengjie go_file]#
[root@yinzhengjie go_file]# sz hello.exe #将编译后的windows程序下载下来到一个没有go环境的windwos操作系统中执行。
rz
开始 zmodem 传输。 按 Ctrl+C 取消。
100% 1591 KB 1591 KB/s 00:00:01 0 Errors [root@yinzhengjie go_file]#
'''
以下是我用Windows7虚拟机的测试结果:

3.还在像python,shell,哪有关心你的代码的格式吗?NO!NO!NO!完全没有这个必要,go语言有一个专门矫正格式的工具,他能够让你的代码看起来特别整齐。
#!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com '''
[root@yinzhengjie go_file]# more hello_world.go #先看看“张牙舞爪的代码”
package main
import "fmt" func main(){fmt.Println("hello Yinzhengjie! Welcome to use golang!")
fmt.Println("You are a good boy!")
}
[root@yinzhengjie go_file]#
[root@yinzhengjie go_file]#
[root@yinzhengjie go_file]# gofmt hello_world.go #在看看格式化后的输出,是不是一下就改变了三观,哈哈!
package main import "fmt" func main() {
fmt.Println("hello Yinzhengjie! Welcome to use golang!")
fmt.Println("You are a good boy!")
}
[root@yinzhengjie go_file]#
[root@yinzhengjie go_file]#
[root@yinzhengjie go_file]# go run hello_world.go #代码运行结果如下
hello Yinzhengjie! Welcome to use golang!
You are a good boy!
[root@yinzhengjie go_file]#
'''
四.GOlang语言的IDE。
其实有没有IDE对一个资深的开发工程师来说影响不大(他们打字的速度,真是的快的可怕!这是我身边的牛人,我亲眼所见的!),但是对于一个小白来说,IDE简直就是观世音菩萨,哈哈!因为GO语言是区分大小写的,只要你写错一个关键字的字母的大小写,编译就会出错!但是又IDE的话就可以帮你轻松搞定这样的烦恼。
我在这里推荐五款给大家(其实我在用的就1和5,喜欢的小伙伴可以选择自己喜欢的风格。):
1.atom配合go-plus插件(我的MAC现在用的就是这个);
2.sublime配合gosublime插件;
3.LitelDe专用IDE,我没有用过啊,别问我,自个百度去;
4.emacs + spacemacs配置(相对来说比较麻烦,也是mac的一个不错的选择.)
5.Goland JetBrains出品。(这个我是强烈推荐大家使用的,因为我windows用的就是它,哈哈!)
在网上好多网友都吐槽在windows操作系统下进行Golang编程是很蛋疼的一件事情, 大牛们都比较喜欢用ubantu或是centos又或者是mac编程的。但是我这个人对windows的那是情有独钟啊,说实话我很少在MAC进行编程,工作中用的也都是windows10的操作系统,在windows操作系统下进行编程我觉得挺好的,对于在哪个操作系统下进行编程我不发表个人意见,我觉得“萝卜青菜,各有所爱”,找到适合你自己的那个IDE就好,没有必要纠结别人用哪种IDE工具,只要你自己用着顺手就好。
如果你是小白的话,我推荐一下我在windows操作系统的下安装的IDE供大家参考:
1.下载地址:https://www.jetbrains.com/go/download/#section=windows

2.勾选相应的安装选项

3.自定义Goland语言的工作目录

4.等待安装完毕后,运行Goland

5.这里我们点击第二个,不导入设置,因为我们是第一次安装.

6.这个是goland程序的一些条款,点击同意即可。

7.创建一个新的目录

8.选择好相应的GO环境并且设置好本地的工作路径

9.创建一个新的文件

10.编写代码,如果可以自动补全说明就没有问题

11.用IDE运行你自己写的代码

五.小试牛刀
看到这里,估计你把GO的环境已经搞定了,那么好的,跟我一起学习一下几个简单的脚本,让我们来体验一下GO语言的有趣之处!
写一个简单的web界面
#!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com package main import (
"fmt"
"net/http"
) func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w,"Welcome to YinZhengjie's home page!")
} func main() {
http.HandleFunc("/",handler)
http.ListenAndServe(":8080",nil)
}
在你的服务器上运行这段代码,然后访问你的主机的"8080"端口,就会有以下的信息输出:

你有听说过"C10K"吗?如果将外界访问你的某个端口,对其进行相应的操作呢?我们有以下一个案例,挺好玩的。
#!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com package main import (
"fmt"
"net"
"time"
"log"
) func handle(conn net.Conn){
fmt.Fprint(conn,"Welcome to Yin Zhengjie's home page",time.Now().String())
conn.Close()
} func main() {
l,err := net.Listen("tcp",":6666")
if err != nil {
log.Fatal(err)
}
for {
conn,err := l.Accept()
if err != nil {
log.Fatal(err)
}
go handle(conn)
}
}
你需要在你的服务器上运行以上代码,现在你只需要找一台能够和它互通的服务器来telnet来测试这个端口,看这个端口的反应。我就随便找了2台局域网的来测试。你可以用http的ab工具来进行一下压力测试。


好了,估计搭建看了以上代码都特别有意思吧,就这么几行轻松实现并发,不想python那么麻烦。而且python实现的并发并不是真正意义上的并发。是不是觉得Golang很牛逼?没错,的确很牛逼。等以后有机会了会继续给大家共享的学习成果的。
扩充小知识:
大家玩过python的小哥哥小姐姐都知道Python的变量一切皆为引用。那么在go语言你可能听说过指针,那么指针和引用有什么区别呢?其实理解起来很简单,我们不从微观的角度去说,因为会把小白越绕越糊涂,我简单句两个例子大家应该就能了解什么是指针了。其实我们在生产环境中经常遇到类似的案例,比如,linux服务器上的软连接。迅雷的种子地址(不要想歪哟,我单纯!)。百度网盘的下载地址等等。其实理解指针你可以把它理解成一种访问路径。
别人给你发了一部小电影在线传输,这个电影如果有1G,那么如果你网速好的话可能几分钟就搞定了,如果你的网速不好的话,估计30分钟都搞不定。但是如果此时他给你发送的是一个下载地址,可能就需要1s,1后他可以断开和你的链接。你直接根据这个下载地址去找相应的资源即可。下面我们通过一个简单的脚本来学习一下。
#!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com package main import "fmt" func main() {
var x int //定义一个数字类型的变量
var y int
x = 100
y = 200
swap(&x,&y) //将x.y的值取出来当做位置参数传给swap函数,分别传给了p和q
fmt.Print("X==>>>",x,"\n","Y==>>>",y)
} func swap(p *int,q *int) { //该函数定义要求传入2个参数,p和q
var t int //定义一个数字类型的变量
t = *p //将p的值传给t,此时p的值为100,故此时t和p的值均为100
*p = *q //将q的值传给p,此时q的值为200,故此时p的值有100变为了200
*q = t //将t的值传给q,此刻q的值和t的值均为100,
}
GO语言的进阶之路-初探GO语言的更多相关文章
- GO语言的进阶之路-Golang高级数据结构定义
GO语言的进阶之路-Golang高级数据结构定义 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们之前学习过Golang的基本数据类型,字符串和byte,以及rune也有所了解, ...
- GO语言的进阶之路-goroutine(并发)
GO语言的进阶之路-goroutine(并发) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 有人把Go比作21世纪的C 语言,第一是因为 Go语言设计简单,第二,21世纪最重要的 ...
- GO语言的进阶之路-流程控制
GO语言的进阶之路-流程控制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 流程控制在编程语言中是最伟大的发明了,因为有了它,你可以通过很简单的流程描述来表达很复杂的逻辑.流程控制 ...
- GO语言的进阶之路-网络安全之proxy
GO语言的进阶之路-网络安全之proxy 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在党的带领下,我们大陆的孩子身心健康还是杠杠的,尤其是像我这种农村孩纸,从来不会像<人 ...
- GO语言的进阶之路-网络编程之socket
GO语言的进阶之路-网络编程之socket 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是socket; 在说socket之前,我们要对两个概念要有所了解,就是IP和端口 ...
- GO语言的进阶之路-爬虫进阶之路
GO语言的进阶之路-爬虫进阶之路 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 网络爬虫是一种自动获取网页内容的程序,是搜索引擎的重要组成部分.我们今天要介绍的就是一个简单的网络爬 ...
- GO语言的进阶之路-协程和Channel
GO语言的进阶之路-协程和Channel 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 看过我之前几篇博客小伙伴可能对Golang语言的语法上了解的差不多了,但是,如果想要你的代码 ...
- GO语言的进阶之路-面向对象编程
GO语言的进阶之路-面向对象编程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 当你看完这篇文章之时,我可以说你的Golang算是入门了,何为入门?就是你去看Docker 源码能看 ...
- GO语言的进阶之路-面向过程式编程
GO语言的进阶之路-面向过程式编程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们在用Golang写一个小程序的时候,未免会在多个地方调用同一块代码,这个时候如何优化你的代码呢 ...
随机推荐
- 《Linux内核分析》 期中总结
Linux内核分析 期中总结 20135307 张嘉琪 一.Linux内核分析课程总结 学习笔记汇总 第一节 计算机是如何工作的 第二节 操作系统是如何工作的 第三节 构造一个简单的Linux系统Me ...
- MySQL主从复制配置遇到的部分问题
网上配置教程很多,我也是参考其他人的教程完成的,主要遇到了以下几个问题,如果以后有人遇到相同的希望能够给大家写提示吧. 1.my.cnf文件配置 Master上的my.cnf中配置的server_id ...
- Odoo中连接mysql数据库
how to integrate Odoo with MySQL - Stack Overflowhttps://stackoverflow.com/questions/31959919/how-to ...
- ThreadPoolExecutor使用详解
ThreadPoolExecutor机制 一.概述 1.ThreadPoolExecutor作为java.util.concurrent包对外提供基础实现,以内部线程池的形式对外提供管理任务执行,线 ...
- 自己站点的nginx 配置信息
user www www; worker_processes auto; error_log /home/wwwlogs/nginx_error.log crit; pid /usr/local/ng ...
- hive数据导入load导入命令
LOCAL 指的是操作系统的文件路径,否则默认为HDFS的文件路径 1.向t2和t3的数据表中导入数据 2.导入操作系统的一下三个文件 执行导入命令 3.将HDFS文件中的数据导入到t3中 4.导入 ...
- 周刷题第二期总结(Longest Substring Without Repeating Characters and Median of Two Sorted Arrays)
这周前面刷题倒是蛮开心,后面出了很多别的事情和问题就去忙其他的,结果又只完成了最低目标. Lonest Substring Without Repeating Characters: Given a ...
- Linux基础学习(3)--初学注意
第三章——初学注意 一.学习Linux的注意事项 1.Linux严格区分大小写 2.Linux中所有内容以文件形式保存,包括硬件: (1)硬盘文件是/dev/sd[a-p] (2)光盘文件是/dev/ ...
- js數字
js數字只有一種類型:不是類型語言. js的數字可以使用科學計數法或者不使用科學計數法: js都是64位的, 如果是整數,(不使用科學計數法或者是小數點)最大15位的: 如果是浮點數,最大17位的,浮 ...
- maven 聚合的含义是父类打包 ,清理等 则子类自动打包;也就是一键打包 方便服务
maven 聚合的含义是父类打包 ,清理等 则子类自动打包:也就是一键打包 方便服务