Go 语言简介

  1. Go 语言是 Google 在2007年开发的一种开源编程语言,于2009年11月10日向全球公布
  2. 出自 Ken Thompson 和 Rob Pike、Robert Griesemer 之手,他们都是计算机科学领域的重量级人物
  3. 是非常年轻的一门语言,它的主要目标是“兼具 Python 等动态语言的开发速度和 C/C++等编译型语言的性能与安全性”
  4. 是编程语言设计的又一次尝试,是对类C语言的重大改进,它不但能让你访问底层操作系统,还提供了强大的网络编程和并发编程支持。Go 语言的用途众多,可以进行网络编程、系统编程、并发编程、分布式编程

Go 语言的设计和实现体现了多位计算机专家多年的经验以及对其他编程语言优缺点的深入认识。因 C++ 的不良体验而出现的 Go 语言是一门现代编程语言,可用来创建性能卓越的 Web 服务器和系统程序

Go 语言吉祥物


Go 语言有一个吉祥物,在会议、文档页面和博文中,大多会包含下图所示的 Go Gopher,这是才华横溢的插画家 Renee French 设计的,她也是 Go 设计者之一 Rob Pike 的妻子

Go 是编译型语言

Go 使用编译器来编译代码,编译器将源代码编译成二进制(或字节码)格式;在编译时,编译器检查错误,优化性能并输出可在不同平台上运行的二进制文件

要创建并运行 Go 程序,必须执行如下步骤:

  1. 使用编辑器创建 go 程序,保存文件
  2. 编译程序
  3. 运行编译得到的可执行文件

环境搭建

根据平台环境在官网下载最新版本安装包即可,然后配置环境变量: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)
}

包的概念

  1. 和 python 一样,把相同功能的代码放在一个目录,称之为包
  2. 包可以被其它包引用(包内文件中定义的函数名首字母需大写,否则不能被其它包应用)
  3. main 包用来生成可执行文件,每个程序只有一个 main 包
  4. 包的主要作用是提高代码的可复用性

关于 main 包中的 main() 函数,Go 程序经过编译之后,运行该程序,会将编译好的二进制文件加载到内存中,会首先调用 main() 函数,所以 main() 函数是程序的入口,必须要有 package main

关于包,是我们可以把一些常用的功能封装到包中,这个时候包中的每个 go 文件的开头则不需要 package main,而是 package 自定义名称,这个自定义名称是根据这个包的功能进行命名

包的命名

Go 语言包的命名,遵循简洁,小写,和 go 文件所在目录同名的原则,这样就便于我们引用、书写以及快速定位查找

比如 net/http 这个包,它这个目录下的所有 go 文件都属于这个 http 包,所以使用 http 包里边的函数、接口,导入这个 http 包就好了

net 下面的包:

net
├── http
├── internal
├── mail
├── rpc
├── smtp
├── testdata
├── textproto
└── url

目录结构规范

举一个简单的例子:如果我们在建立一个 go_project 目录,通常在这个目录下我们会创建如下目录

src:存放不同的项目代码

bin:存放编译后的可执行文件

vender 存放引用的第三方库

pkg:存放静态库

作业

使用 fmt 分别打印字符串,二进制,十进制,十六进制,浮点数

ending ~

Go part 1 初探的更多相关文章

  1. 初探领域驱动设计(2)Repository在DDD中的应用

    概述 上一篇我们算是粗略的介绍了一下DDD,我们提到了实体.值类型和领域服务,也稍微讲到了DDD中的分层结构.但这只能算是一个很简单的介绍,并且我们在上篇的末尾还留下了一些问题,其中大家讨论比较多的, ...

  2. CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探

    CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码 ...

  3. 从273二手车的M站点初探js模块化编程

    前言 这几天在看273M站点时被他们的页面交互方式所吸引,他们的首页是采用三次加载+分页的方式.也就说分为大分页和小分页两种交互.大分页就是通过分页按钮来操作,小分页是通过下拉(向下滑动)时异步加载数 ...

  4. JavaScript学习(一) —— 环境搭建与JavaScript初探

    1.开发环境搭建 本系列教程的开发工具,我们采用HBuilder. 可以去网上下载最新的版本,然后解压一下就能直接用了.学习JavaScript,环境搭建是非常简单的,或者说,只要你有一个浏览器,一个 ...

  5. .NET文件并发与RabbitMQ(初探RabbitMQ)

    本文版权归博客园和作者吴双本人共同所有.欢迎转载,转载和爬虫请注明原文地址:http://www.cnblogs.com/tdws/p/5860668.html 想必MQ这两个字母对于各位前辈们和老司 ...

  6. React Native初探

    前言 很久之前就想研究React Native了,但是一直没有落地的机会,我一直认为一个技术要有落地的场景才有研究的意义,刚好最近迎来了新的APP,在可控的范围内,我们可以在上面做任何想做的事情. P ...

  7. 【手把手教你全文检索】Apache Lucene初探

    PS: 苦学一周全文检索,由原来的搜索小白,到初次涉猎,感觉每门技术都博大精深,其中精髓亦是不可一日而语.那小博猪就简单介绍一下这一周的学习历程,仅供各位程序猿们参考,这其中不涉及任何私密话题,因此也 ...

  8. Key/Value之王Memcached初探:三、Memcached解决Session的分布式存储场景的应用

    一.高可用的Session服务器场景简介 1.1 应用服务器的无状态特性 应用层服务器(这里一般指Web服务器)处理网站应用的业务逻辑,应用的一个最显著的特点是:应用的无状态性. PS:提到无状态特性 ...

  9. NoSQL初探之人人都爱Redis:(3)使用Redis作为消息队列服务场景应用案例

    一.消息队列场景简介 “消息”是在两台计算机间传送的数据单位.消息可以非常简单,例如只包含文本字符串:也可以更复杂,可能包含嵌入对象.消息被发送到队列中,“消息队列”是在消息的传输过程中保存消息的容器 ...

  10. Unity3D游戏开发初探—1.跨平台的游戏引擎让.NET程序员新生

    一.Unity3D平台简介 Unity是由Unity Technologies开发的一个让轻松创建诸如三维视频游戏.建筑可视化.实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的 ...

随机推荐

  1. android: View, SurfaceView, GLSurfaceView, TextureView 区别与联系

    区别与联系 View: 显示视图,内置画布,提供了图形绘制函数.触屏事件.按键事件函数等,必须在UI主线程内更新画面,速度较慢: SurfaceView: 基于view视图进行拓展的视图类,更适合2D ...

  2. XListView实现上拉加载下拉刷新

    package com.loaderman.androiddemo; import android.content.Context; import android.util.AttributeSet; ...

  3. SQL SERVER SELECT语句中加锁选项的详细说明

    共享锁(读锁)和排他锁(写锁)   共享锁(S锁):共享 (S) 用于不更改或不更新数据的操作(只读操作),如 SELECT 语句. 如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能 ...

  4. CentOS 7部署 Ceph分布式存储架构

    一.概述 随着OpenStack日渐成为开源云计算的标准软件栈,Ceph也已经成为OpenStack的首选后端存储.Ceph是一种为优秀的性能.可靠性和可扩展性而设计的统一的.分布式文件系统. cep ...

  5. 123457123456#0#-----com.twoapp.YiZhiPuzzle02--前拼后广--儿童日常拼图游戏jiemei

    com.twoapp.YiZhiPuzzle02--前拼后广--儿童日常拼图游戏jiemei

  6. 万能锁对象 EZ_BDCP2

    万能锁对象 EZ_BDCP2 *&---------------------------------------------------------------------* *& F ...

  7. es6 fetch方法请求接口

    fetch(url, { method: 'post', headers: { 'Content-type': 'application/x-www-form-urlencoded; charset= ...

  8. dozer工具类

    jar:commons-beanutils-1.9.3.jar.commons-lang-2.6.jar.dozer-5.3.2.jar.jcl-over-slf4j-1.7.25.jar.slf4j ...

  9. NVIDIA显卡电源不足

    NVIDIA显卡 Ubuntu16.04安装驱动后出现问题:Unable to determine the device handle for GPUXXX 安装NVIDIA驱动后输入:nvidia- ...

  10. spring boot 单选按钮

    jsp代码 性别: <form:radiobutton path="xb" value="男"/>男 <form:radiobutton pa ...