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开发的一个让轻松创建诸如三维视频游戏.建筑可视化.实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的 ...
随机推荐
- ES--Kibana相关操作创建索引和Mapping
创建索引 kibana 使用如下命令进行创建索引内容. PUT test_index/ 创建别名 POST _aliases { "actions": [{ "add&q ...
- mongo 导入import 导出 exprot操作
.mongo export导出 /mongoexport /h [ip地址] /port [端口] /u [用户名] /p [密码] /d [数据库] -c [表名] /q [查询语句] /o [保 ...
- JavaScript箭头函数(Lambda表达式)
箭头函数也叫lambda表达式 据说其主要意图是定义轻量级的内联回调函数 栗有: 1 var arr = ["wei","ze","yang" ...
- ES6深入浅出-2 新版函数:箭头函数 2 视频-1.视频 箭头函数
ES3里面的写法 匿名函数是用不了的 还是需要给他赋值 选中的这一部分叫做匿名函数 等于号叫做赋值 let xxx叫做声明 所以说这个地方是三个语法,首先声明一个匿名函数,然后声明一个xxx变量,最后 ...
- Mac下给sublime text3配置Nodejs
传送门: http://blog.csdn.net/phil_young/article/details/50950206
- iframe重定向让父页面跳转
情景描述 我们在使用一些后台程序的html模板(比如H-ui)的时候,这些html前端程序是iframe版的, 也就是说在使用的时候,每当我点击左侧导航栏的一个按钮,在右侧就会弹出一个菜单栏,在显示的 ...
- C,OC,C++语言对比
1.C与OC.C++的区别: C语言的特点:面向过程 1)C语言是结构化语言,层次清晰,调试和维护比较容易 2)表现能力和处理能力比较强,可直接访问内存的物理地址 3)c语言实现对硬件的编辑,c语言课 ...
- (三)Asp.net web api中的坑-【http post请求中的参数】
接上篇, HttpPost 请求 1.post请求,单参数 前端 var url = 'api/EnterOrExit/GetData2';var para = {};para["Phone ...
- Xena L23网络测试仪Valkyrie使用技巧100例,目录
Xena L23网络测试仪Valkyrie使用技巧100例,先写个目录 100例,会不会有点多,写不完... ^_^ 第1次编辑于2019-11-27 22:05:52, Evan YE. 编号 标题 ...
- Lnamp的高级网站架构+动静分离+反向代理
Lnamp的架构 环境: 图上面是5台服务器 192.168.1.116 是nginx负载均衡+动静分离 192.168.1.117:linux+apache+php 192.168.1.118:li ...