Go part 1 初探
Go 语言简介
- Go 语言是 Google 在2007年开发的一种开源编程语言,于2009年11月10日向全球公布
- 出自 Ken Thompson 和 Rob Pike、Robert Griesemer 之手,他们都是计算机科学领域的重量级人物
- 是非常年轻的一门语言,它的主要目标是“兼具 Python 等动态语言的开发速度和 C/C++等编译型语言的性能与安全性”
- 是编程语言设计的又一次尝试,是对类C语言的重大改进,它不但能让你访问底层操作系统,还提供了强大的网络编程和并发编程支持。Go 语言的用途众多,可以进行网络编程、系统编程、并发编程、分布式编程
Go 语言的设计和实现体现了多位计算机专家多年的经验以及对其他编程语言优缺点的深入认识。因 C++ 的不良体验而出现的 Go 语言是一门现代编程语言,可用来创建性能卓越的 Web 服务器和系统程序
Go 语言吉祥物
Go 语言有一个吉祥物,在会议、文档页面和博文中,大多会包含下图所示的 Go Gopher,这是才华横溢的插画家 Renee French 设计的,她也是 Go 设计者之一 Rob Pike 的妻子
Go 是编译型语言
Go 使用编译器来编译代码,编译器将源代码编译成二进制(或字节码)格式;在编译时,编译器检查错误,优化性能并输出可在不同平台上运行的二进制文件
要创建并运行 Go 程序,必须执行如下步骤:
- 使用编辑器创建 go 程序,保存文件
- 编译程序
- 运行编译得到的可执行文件
环境搭建
根据平台环境在官网下载最新版本安装包即可,然后配置环境变量:GOPATH,GOROOT
官网教程:golang.org
第一句代码
package main import (
"fmt"
) func main(){
fmt.Println("hello, golang~")
}
语言特性
垃圾回收
- 内存自动回收,不需要开发人员进行内存管理
- 专注业务实现,降低心智负担
- 只需要 new 分配内存,不需要释放
天然并发
- 从语言层面上支持并发,非常简单
- goroutine 轻量级线程,创建成千上万个 goroutine 成为可能
- 基于 CSP(Communicating Sequential Process)模型实现
channel
- 管道,类似于 unix / linux 中的 pipe
- 多个 goroutine 之间通过 channel 进行通信
- 支持任何类
func main(){
pipe := make(chan int, 2)
pipe <- 1
pipe <- 2
}
多个 goroutine 中,使用 channel 进行通信,程序可以将需要并发的环节设计为生产者和消费者模式,将数据放入通道,通道的另外一端的代码将这些数据进行计算并返回结果,如下图:
下面代码中的生产者每秒生成一个字符串,并通过通道传给消费者,生产者使用两个 goroutine 并发运行,消费者在 main() 函数的 goroutine 中进行处理:
package main import (
"fmt"
"math/rand"
"time"
) func producer(header string, channel chan string){
for{
channel <- fmt.Sprintf("%s: %v", header, rand.Int31()) // 生成一个随机数
time.Sleep(time.Second)
}
} func customer(channel chan string){
for{
message := <- channel // 从管道中获取数据
fmt.Println(message)
}
} func main(){
var channel chan string = make(chan string) // 创建一个 字符串类型的管道
go producer("cat", channel) // 并发执行一个生产者函数
go producer("dog", channel) customer(channel)
}
多返回值
一个函数多返回值
package main import (
"fmt"
) func calc(a int, b int) (int, int) {
sum := a + b
avg := (a + b) / 2
return sum, avg
} func main(){
sum, avg := calc(100, 200)
fmt.Println("sum", sum, "avg", avg)
}
包的概念
- 和 python 一样,把相同功能的代码放在一个目录,称之为包
- 包可以被其它包引用(包内文件中定义的函数名首字母需大写,否则不能被其它包应用)
- main 包用来生成可执行文件,每个程序只有一个 main 包
- 包的主要作用是提高代码的可复用性
关于 main 包中的 main() 函数,Go 程序经过编译之后,运行该程序,会将编译好的二进制文件加载到内存中,会首先调用 main() 函数,所以 main() 函数是程序的入口,必须要有 package main
关于包,是我们可以把一些常用的功能封装到包中,这个时候包中的每个 go 文件的开头则不需要 package main,而是 package 自定义名称,这个自定义名称是根据这个包的功能进行命名
包的命名
Go 语言包的命名,遵循简洁,小写,和 go 文件所在目录同名的原则,这样就便于我们引用、书写以及快速定位查找
比如 net/http 这个包,它这个目录下的所有 go 文件都属于这个 http 包,所以使用 http 包里边的函数、接口,导入这个 http 包就好了
net 下面的包:
net
├── http
├── internal
├── rpc
├── smtp
├── testdata
├── textproto
└── url
目录结构规范
举一个简单的例子:如果我们在建立一个 go_project 目录,通常在这个目录下我们会创建如下目录
src:存放不同的项目代码
bin:存放编译后的可执行文件
vender 存放引用的第三方库
pkg:存放静态库
作业
使用 fmt 分别打印字符串,二进制,十进制,十六进制,浮点数
ending ~
Go part 1 初探的更多相关文章
- 初探领域驱动设计(2)Repository在DDD中的应用
概述 上一篇我们算是粗略的介绍了一下DDD,我们提到了实体.值类型和领域服务,也稍微讲到了DDD中的分层结构.但这只能算是一个很简单的介绍,并且我们在上篇的末尾还留下了一些问题,其中大家讨论比较多的, ...
- CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探
CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码 ...
- 从273二手车的M站点初探js模块化编程
前言 这几天在看273M站点时被他们的页面交互方式所吸引,他们的首页是采用三次加载+分页的方式.也就说分为大分页和小分页两种交互.大分页就是通过分页按钮来操作,小分页是通过下拉(向下滑动)时异步加载数 ...
- JavaScript学习(一) —— 环境搭建与JavaScript初探
1.开发环境搭建 本系列教程的开发工具,我们采用HBuilder. 可以去网上下载最新的版本,然后解压一下就能直接用了.学习JavaScript,环境搭建是非常简单的,或者说,只要你有一个浏览器,一个 ...
- .NET文件并发与RabbitMQ(初探RabbitMQ)
本文版权归博客园和作者吴双本人共同所有.欢迎转载,转载和爬虫请注明原文地址:http://www.cnblogs.com/tdws/p/5860668.html 想必MQ这两个字母对于各位前辈们和老司 ...
- React Native初探
前言 很久之前就想研究React Native了,但是一直没有落地的机会,我一直认为一个技术要有落地的场景才有研究的意义,刚好最近迎来了新的APP,在可控的范围内,我们可以在上面做任何想做的事情. P ...
- 【手把手教你全文检索】Apache Lucene初探
PS: 苦学一周全文检索,由原来的搜索小白,到初次涉猎,感觉每门技术都博大精深,其中精髓亦是不可一日而语.那小博猪就简单介绍一下这一周的学习历程,仅供各位程序猿们参考,这其中不涉及任何私密话题,因此也 ...
- Key/Value之王Memcached初探:三、Memcached解决Session的分布式存储场景的应用
一.高可用的Session服务器场景简介 1.1 应用服务器的无状态特性 应用层服务器(这里一般指Web服务器)处理网站应用的业务逻辑,应用的一个最显著的特点是:应用的无状态性. PS:提到无状态特性 ...
- NoSQL初探之人人都爱Redis:(3)使用Redis作为消息队列服务场景应用案例
一.消息队列场景简介 “消息”是在两台计算机间传送的数据单位.消息可以非常简单,例如只包含文本字符串:也可以更复杂,可能包含嵌入对象.消息被发送到队列中,“消息队列”是在消息的传输过程中保存消息的容器 ...
- Unity3D游戏开发初探—1.跨平台的游戏引擎让.NET程序员新生
一.Unity3D平台简介 Unity是由Unity Technologies开发的一个让轻松创建诸如三维视频游戏.建筑可视化.实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的 ...
随机推荐
- Redis发生异常WRONGTYPE Operation against a key holding the wrong kind of value
Redis发生异常WRONGTYPE Operation against a key holding the wrong kind of value Redis发生异常WRONGTYPE Operat ...
- 002-创建型-01-工厂方法模式(Factory Method)
一.概述 定义一个创建对象的接口,但让实现这个接口的类来决定实例化那个类,工厂方法让类的实例化推迟到子类中进行. 工厂方法模式(FACTORY METHOD)同样属于一种常用的对象创建型设计模式,又称 ...
- MySQL数据库备份之mysqldump
创建用户备份的用户 MariaDB [mysql]> create user 'backdata'@'localhost' identified by 'test@123456';Query O ...
- 关于Jmeter+Ant+Jenkins作为接口、性能自动化框架的误区
说明:Apach-Jmeter有完善的桌面客户端,关联数据的处方方式,各种参数化的方式,各种Jar包的扩展,也可以用作抓包工具使用,当然最重要的是它是[开源!开源!开源!],重要的事说三遍,目前也有基 ...
- Django之中间件、缓存以及信号
Django之中间件 中间件执行流程 我们从浏览器发出一个请求 Request,得到一个响应后的内容 HttpResponse ,这个请求传递到 Django的过程如下: 也就是说,每一个请求都是先通 ...
- 代理IP爬取和验证(快代理&西刺代理)
前言 仅仅伪装网页agent是不够的,你还需要一点新东西 今天主要讲解两个比较知名的国内免费IP代理网站:西刺代理&快代理,我们主要的目标是爬取其免费的高匿代理,这些IP有两大特点:免费,不稳 ...
- linux cron计划任务防止多个任务同时运行
使用linux flock 文件锁实现任务锁定,解决冲突格式:flock [-sxun][-w #] fd#flock [-sxon][-w #] file [-c] command选项-s, --s ...
- CSS基础(html+css基础)
css: CSS全称为“层叠样式表 (Cascading Style Sheets)”,它主要是用于定义HTML内容在浏览器内的显示样式,如文字大小.颜色.字体加粗等. 1.CSS代码语法: css ...
- w10环境下Hexo博客搭建
w10使用hexo+github手把手搭建自己的第一个博客 对一个程序员来说,博客的重要性不言而喻,不但可以积累知识,还可以更好的给别人分享自己的心得.今天就以时下比较流行的hexo博客搭建属于自己的 ...
- kali安装chrome
文章搬到自己的网站上,如下: http://101.132.137.140:202/archives/2019-11-25