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开发的一个让轻松创建诸如三维视频游戏.建筑可视化.实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的 ...
随机推荐
- 设备树中的interrupts属性解析
interrupts属性会有两种不同的参数: 1. 带两个参数的情形 示例: interrupt-parent = <&gpio2>; interrupts = <5 1& ...
- com.alibaba.fastjson.JSONObject;的使用
转: com.alibaba.fastjson.JSONObject;的使用 2018-11-04 23:51:23 mameng1998 阅读数 6404更多 分类专栏: java 1 POM ...
- LeetCode_190. Reverse Bits
190. Reverse Bits Easy Reverse bits of a given 32 bits unsigned integer. Example 1: Input: 000000101 ...
- using 关键字有两个主要用途
转自:https://www.jianshu.com/p/5357dc4efcf8 using 关键字有两个主要用途: (一).作为指令,用于为命名空间创建别名或导入其他命名空间中定义的类型. (二) ...
- Swift学习 (三)
3.函数: 在Swift中函数的定义基本与OC一样. 主要区别为: 通过func关键词定义函数 返回值在->关键词后标注 各举一个类方法与实例方法例子. 1 2 + (UIColor*)blac ...
- 【c# 学习笔记】封装
封装 指的是把类内部的数据隐藏起来,不让对象实例直接对其操作.c#中提供了属性机制来对类内部的状态进行操作. 在c#中,封装可以通过Public.Private.Protected和Internal等 ...
- Hystrix多个线程池切换执行超时带来的问题(图解)
线程池切换带来的超时问题 上图有什么问题: Controller的Hystrx线程池已经到了超时时间,而FeignClient的Hystrx线程池还没到超时时间. 场景: Controller ...
- 【数据库开发】在Windows上以服务方式运行 MSOPenTech/Redis
在Windows上以服务方式运行 MSOPenTech/Redis ServiceStack.Redis 使用教程里提到Redis最好还是部署到Linux下去,Windows只是用来做开发环境,现在这 ...
- Java 文件下载工具类
Java 文件下载工具类 import org.slf4j.Logger; import org.slf4j.LoggerFactory; private static Logger logger = ...
- Snapshot Array
Implement a SnapshotArray that supports the following interface: SnapshotArray(int length) initializ ...