什么是go语言

go是一门并发支持,垃圾回收的编译型 系统编程语言,旨在创造一门具有静态编译语言的高性能和动态语言的高效开发之间拥有一个良好平衡点 的一门编程语言。

go有什么优点?
  1. 自动垃圾回收机制,和python类似,开发者不需要关心内存垃圾是怎么回收的,由系统自动判断在合适的时候(比如CPU相对空闲的时候)进行自动垃圾收集工作
  2. 更丰富的内置类型,更丰富的内置类型,除了常规的数组字符串之外,还有字典类型(map),数组切片(slice)等等
  3. 函数多返回值,和python一样,可以在return 的时候返回很多个值。
  4. 错误处理,go语言中引入了三个关键字用于标准的错误处理流程,分别是defer、panic和recover。
  5. 匿名函数和闭包,匿名函数就是没有命名的函数
  6. 类型和接口
  7. 并发编程,go语言中引入了goroutine概念,它使得并发编程非常简单,使用消息传递来共享消息而不是使用共享内存来通信。
  8. 反射,和python里面的反射都差不多

go的安装

安装的话我们可以看官网,我这里在windows下开发,所以使用的msi版本的

官网下载地址

安装完成之后,我们看看环境变量的作用。

C:\Users\Leo>go env
set GOARCH=amd64 # CPU类型
set GOBIN= # 工作目录下的bin文件夹
set GOEXE=.exe # 生成可执行文件的后缀
set GOHOSTARCH=amd64 #
set GOHOSTOS=windows # 使用到交叉编译的时候才会使用
set GOOS=windows # 当前系统版本
set GOPATH=C:\Users\Leo\go # 工作目录
set GORACE=
set GOROOT=C:\Go # 安装目录
set GOTOOLDIR=C:\Go\pkg\tool\windows_amd64 # 工具目录
set GCCGO=gccgo
set CC=gcc
set GOGCCFLAGS=-m64 -mthreads -fmessage-length=0
set CXX=g++
set CGO_ENABLED=1
set PKG_CONFIG=pkg-config
set CGO_CFLAGS=-g -O2
set CGO_CPPFLAGS=
set CGO_CXXFLAGS=-g -O2
set CGO_FFLAGS=-g -O2
set CGO_LDFLAGS=-g -O2

根据约定,我们需要在GOPATH下需要创建三个目录

  1. pkg 存放编译后生成的包文件
  2. bin 存放编译后生成的可执行文件
  3. src 存放项目的源码

那么问题来了,我们在windows下怎么去配置GOPATH呢?

我们 在windows上添加一个系统变量为GOPATH即可。目录自己制定,注意变量名一定是要大写的GOPATH。 我的GOPATH设置为:H:\Go\project

go 常用命令介绍

  1. go get 获取远程包(需要提前安装git或者hg)
  2. go run 直接运行程序
  3. go build 测试编译,检查是否有编译错误
  4. go fmt 格式化源码(部分IDC在保存的时候自动调用)
  5. go install 编译包文件并编译整个郑旭
  6. go test 运行测试文件
  7. go doc 查看文档
例如:C:\Users\Leo>godoc fmt Println

有时候我们无法访问官网,那么怎么在本地搭建一个官网来查看模块的用法呢?通过下面这条命令就能轻松搭建好:

C:\Users\Leo>godoc --http=:8080

然后我们访问127.0.0.1:8080就可以了

IDE的选择

IDC多种多样,我这里选择一个原生支持go的IDC,叫做liteide,等同于pycharm一样原生支持python,不需要安装其他插件,

liteide下载地址

下载后解压即可使用,国人写的IDE,原生中文。

我们新建一个go文件,文件名是hello.go,我的这个hello.go文件是在GOPATH下面的src下面,

hello world

开始写一个Hello world,我们先不要去纠结每个干嘛的,我就先简单说下:

// hello   注释
package main // package名字为main表示编译后为可执行文件,否则的话是后缀为.a的包(模块) import ( // 导入一个包
"fmt"
) func main() { // 主函数,print hello,既没有参数也没有返回值,执行main函数必须在package main里面
fmt.Println("Hello World!晚安,Leo先生")
}

解释下:

  • package: 每个go源码文件的开头都是一个package声明,表示该go代码所属的包。包是go语言里最基本的分发单位,也是工程管理中依赖关系的体现。
  • main : 要生成可执行程序,必须建立一个名字为main的包,并且在该包中包含一个叫main()的函数(该函数是Go可执行程序的执行起点),main函数不能带参数,也不能定义返回值。

下面执行这个文件:

H:\Go\Development\src>go run hello.go
Hello World!晚安,Leo先生

如果使用IDE运行的话,有两种方式:

  1. 找到右上角的build 按钮编译下,然后在点击run按钮才能够执行,此时你发现这个src目录下多了 一个src.exe可执行文件了。
  2. 点击IDE右上角的fileRun即可运行
以下代码可以查看我的github

包的简单代码实现:

我们下面看看几个简单的包,来充分了解下Go下面的包是怎么样的。

我的目录如下:

我这次要说的就是package_example下的代码。 package_example代码是用来做加法和减法的代码。 package_example下面的有两个子目录,一个calc子目录是负责计算的包,main是main包。

我们首先看看calc下面的add.go和sub.go:

add.go
// add
package calc // 包名要和这个目录一致,表示这个go文件属于这个包的。 func Add(a, b int) int { // 定义的函数,看不懂先别管。
return a + b
}
sub.go
// sub
package calc func Sub(a, b int) int {
return a + b
}
  1. 我们要注意查看下面两段代码的package关键字,你们可以看到它们都是些的calc,为啥,因为他们所在目录就是calc,他们所实现的功能都是calc包的功能,所以必须写成calc,这样add.go和sub.go才是属于calc包的。
  2. calc下面的代码文件的方法如果想要被外部函数调用,那么函数名首字母必须要大写才可以。

再看下main包里面的main.go

main.go
// main
package main import (
"fmt"
"go_dev/day1/package_example/calc"
) func main() {
ss := calc.Add(100, 200)
su := calc.Sub(200, 123)
fmt.Println("sum=", ss)
fmt.Println("su=", su)
}
  1. 在main.go里面,我们可以看到package是main,因为这个是主程序的入口,在这个main目录下可以有多个文件的package写成main,但是只有一个文件可以有main函数。
  2. 我们要在main文件里导入calc的包,那么前提条件你是设值好了GOPATH路径,我的GOPATH路径是H:\Go\project,所以我导入calc的包的时候,就以 src下的go_dev开始,到calc目录为止即可。

那么写完代码编译的话,我们就可以编译了,编译的话我们只需要对main包下面的编译就行,因为只有main包下面的编译后才是可执行文件。编译前提的是你的GOPATH是设了值,比如我这里的GOPATH是H:\Go\project,那么我们编译的时候就不需要写src了,直接下src下面的路径即可,一直到main这个子目录下,不要写到main.go这个代码文件上。了解以后可以这么编译:

H:\Go\project> go build go_dev\day1\package_example\main

也可以添加-o参数,指定exe文件的存放位置:

H:\Go\project>go build -o bin/hehe.exe go_dev\day1\package_example\main

编译完成后就可以执行了:

H:\Go\project\bin>hehe.exe   指定放在bin下面的那么就在bin下面执行hehe.exe即可
H:\Go\project>main.exe 没有指定那么就直接执行main.exe

提前尝鲜 goroutine

我们知道Go天生并发,所以我们可以提前看看goroutine的并发功能,同样我们还是用了上面我们所说的包组织,让大家更加了解包组织结构。

包组织目录如下:

我们先聊下进程间通信的方式,进程间通信的方式是采用管道/消息队列 来交换数据的,所以我们使用goroutine也一样,使用channel来让goroutine与main函数交换数据的。

还是先看看calc下面代码:

add.go
// add
package calc func Add(a, b int, p chan int) {
p <- (a + b) // 把和放入到channel里面,让main函数从中取值。
}
sub.go
// sub
package calc func Sub(a, b int, p chan int) {
p <- (a - b) // 把差放入到channel里面,让main函数从中取值。
}

我们在看看main目录下面的main.go

main.go
// main
package main import (
"fmt"
"go_dev/day1/goroutine_example/calc"
) var p chan int // 声明p是一个只可以放入int型的channel func main() {
p = make(chan int, 3) // 初始化这个channel,缓冲区为3,
go calc.Add(10, 324, p) // 使用go这个关键字来启动goroutine
go calc.Sub(123123, 123, p)
ss := <-p // 从channel里面获取一个数据
su := <-p
fmt.Println("sum=", ss) //打印这个数据
fmt.Println("sub=", su)
}

写完后就可以编译执行了,执行参考步骤上面所说的。

上面的几段代码就简单演示了goroutine的使用方法。后期我会细写goroutine的概念与方法。反正我是深深感受了go天生并发的好处,personally,其他语言的多进程/线程并发编程我感觉就是噩梦一场,挺费劲的。

1 go 开发环境搭建与简单代码实现的更多相关文章

  1. android Jni NDK开发环境搭建及其简单实例的编写

    android  Jni  NDK开发环境搭建及其简单实例的编写 由于工作需要,需要采用开发想要的JNI,由于之前没有接触过安卓的开发,所以更加网上的帖子,学习了下.遇到了些问题,然后总结下学习过程中 ...

  2. Java Web开发SpringMVC和MyBatis框架开发环境搭建和简单有用

    1.下载SpringMVC框架架包,下载地址: 点击下载 点击打开地址如图所看到的.点击下载就可以 然后把相关的jar拷贝到lib下导入 2.MyBatis(3.4.2)下载 X-Amz-Algori ...

  3. zookeeper Eclipse 开发环境搭建及简单示例

    一,下载Zookeeper安装包 从官方网站下载稳定版安装包后,解压. 其中ZK_HOME 为:D:\Program Files\zookeeper-3.4.9 二,启动Zookeeper Serve ...

  4. PHP开发环境搭建(转载)

    转载自:http://blog.csdn.net/rosetta/article/details/53967215 前言   最近学了n种语言,学每种语言的套路无非就是先搭建一个开发环境,再找本书或者 ...

  5. iOS开发——实战OC篇&环境搭建之纯代码(玩转UINavigationController与UITabBarController)

    iOS开发——实战OC篇&环境搭建之纯代码(玩转UINavigationController与UITabBarController)   这里我们就直接上实例: 一:新建一个项目singleV ...

  6. Spark+ECLIPSE+JAVA+MAVEN windows开发环境搭建及入门实例【附详细代码】

    http://blog.csdn.net/xiefu5hh/article/details/51707529 Spark+ECLIPSE+JAVA+MAVEN windows开发环境搭建及入门实例[附 ...

  7. 从无到有实现搭建vue+ElementUI+less+ES6的开发环境并进行简单的开发的项目

    项目简介:该项目是基于日常计算宿舍水电煤气费的需求写的,旨在从无到有实现搭建vue+ElementUI+less+ES6的开发环境并进行简单的开发,使用webpack进行代码的编译.压缩和打包,并疏通 ...

  8. 最新 obs-studio vs2019 开发环境搭建 代码编译

    距离上一篇文章很久了,重新开始记录 OBS 开发相关情况,第一步就是环境搭建,第二步是构建 OBS-Studio VS 2019 开发环境搭建 下载软件和资源 软件安装没有特别说明的,下载安装即可. ...

  9. (0)ASP.NET Core 简单介绍 和开发环境搭建 - ASP.NET从MVC5升级到MVC6

    ASP.NET从MVC5升级到MVC6 总目录 ASP.NET Core 首先,ASP原本只是一种技术,这种技术从上个世纪90年代就有了. Active Service Page 和 Java Ser ...

随机推荐

  1. C++中cin的用法汇总

    cin可以用于接收输入,最常见的是从控制台接收.在刚学习C++的时候经常会用cin来接收数据,这里想要系统的总结一下cin的用法,保证不灌水. C++中的cin是一个 istream对象,从标准输入中 ...

  2. 【驱动】——错误: 初始值设定项里有未知的字段‘ioctl’

    这个错误网上搜索发现3.0.0.15版本内核 file_operation结构体已经删除了ioctl函数,取代的是: long (*unlocked_ioctl) (struct file *, un ...

  3. mongo 记得开启验证 auth = true

    dbpath=/mnt/mongodb/data/logpath=/usr/local/mongodb/log/mongodb.logauth = trueport=27017logappend=1f ...

  4. CENTOS6.5安装CDH5.12.1(一) https://mp.weixin.qq.com/s/AP_m0QqKgzEUfjf0PQCX-w

    CENTOS6.5安装CDH5.12.1(一) 原创: Fayson Hadoop实操 2017-09-13 温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看. 1.概述   本文档主要描 ...

  5. Ubuntu free以及Linux内存占用大的解释

    -bash-3.00$ free total used free shared buffers cached Mem: 514020 465932 48088 0 15864 348844 -/ bu ...

  6. 构建Java并发模型框架

    Java的多线程特性为构建高性能的应用提供了极大的方便,但是也带来了不少的麻烦.线程间同步.数据一致性等烦琐的问题需要细心的考虑,一不小心就会出现一些微妙的,难以调试的错误.另外,应用逻辑和线程逻辑纠 ...

  7. js在IE与firefox的差别。。。

    1.firefox不能对innerText支持.firefox支持innerHTML但却不支持innerText,它支持textContent来实现innerText,不过默认把多余的空格也保留了.如 ...

  8. Linux gcc/g++链接编译顺序详解

    gcc/g++链接时对库的顺序要求 -Ldir Add directory dir to the list of directories to be searched for -l. -llibrar ...

  9. Three ways to make your WPF images pop out on MouseOver

    There are a couple of ways in WPF to make an image pop out when moving mouse over it. Of course we w ...

  10. 9、Qt 事件处理机制

    原文地址:http://mobile.51cto.com/symbian-272812.htm 在Qt中,事件被封装成一个个对象,所有的事件均继承自抽象类QEvent. 接下来依次谈谈Qt中有谁来产生 ...