加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959

简介

    Go是Google开发的一种 静态强类型、编译型,并发型,并具有垃圾回收功能的编程语言。为了方便搜索和识别,有时会将其称为Golang。

罗伯特·格瑞史莫,罗勃·派克(Rob Pike)及肯·汤普逊于2007年9月开始设计Go语言,稍后Ian Lance Taylor、Russ Cox加入项目。Go语言是基于Inferno操作系统所开发的。Go语言于2009年11月正式宣布推出,成为开放源代码项目,并在Linux及Mac OS X平台上进行了实现,后来追加了Windows系统下的实现。在2012年早些时候发布了Go 1稳定版本。

现在Go的开发已经是完全开放的,并且拥有一个活跃的社区。

Go语言的语法接近C语言,但对于变量的声明有所不同。Go语言支持垃圾回收功能。Go语言的并行模型是以东尼·霍尔的通信顺序进程(CSP)为基础,采取类似模型的其他语言包括Occam和Limbo,但它也具有Pi运算的特征,比如通道传输。在1.8版本中开放插件(Plugin)的支持,这意味着现在能从Go语言中动态加载部分函数。

与C++相比,Go语言并不包括如异常处理、继承、泛型、断言、虚函数等功能,但增加了 Slice 型、并发、管道、垃圾回收、接口(Interface)等特性的语言级支持。Google 目前仍正在讨论是否应该支持泛型,其态度还是很开放的,但在该语言的常见问题列表中,对于断言的存在,则持负面态度,同时也为自己不提供类型继承来辩护。

不同于Java,Go语言内嵌了关联数组(也称为哈希表(Hashes)或字典(Dictionaries)),就像字符串类型一样。

语言特性

1. 垃圾回收

  1. 内存自动回收,再也不需要开发人员管理内存
  2. 只需要new分配内存,不需要释放

2. 天然并发

  1. 从语言层面支持并发,非常简单
  2. Goroutine,轻量级线程,创建成千上万个Goroutine成为可能

  3. 基于CSP(Communicating Sequential Process)模型实现

3. channel

  1. 管道,类似unix/linux中的pipe
  2. 多个Goroutine之间通过channel进行通信

  3. 支持任何类型

  4. close 内置函数用来关闭 channel

4. Goroutine

Go语言的主要的功能在于令人简易使用的并行设计,这个方法叫做Goroutine,通过Goroutine能够让你的程序以异步的方式运行,而不需要担心一个函数导致程序中断,因此Go语言也非常地适合网络服务。

Goroutine是类似线程的概念(但Goroutine并不是线程)。线程属于系统层面,通常来说创建一个新的线程会消耗较多的资源且管理不易。而 Goroutine就像轻量级的线程,但我们称其为并发,一个Go程序可以运行超过数万个 Goroutine,并且这些性能都是原生级的,随时都能够关闭、结束。一个核心里面可以有多个Goroutine,通过GOMAXPROCS参数你能够限制Gorotuine可以占用几个系统线程来避免失控。

在内置的官方包中也不时能够看见Goroutine的应用,像是net/http中用来监听网络服务的函数实际上是创建一个不断运行循环的Goroutine。

编译器

当前有两个Go语言的编译器的分支。官方编译器gc和gccgo。官方编译器在初期使用C写成,后用go重写从而实现自举。Gccgo是一个使用标准GCC作为后端的Go编译器。

官方编译器支持跨平台编译(但不支持CGO),允许将源码编译为可在目标系统、架构上执行的二进制文件。

安装

下载地址:https://golang.org/dl/

设置环境变量:

  1. export GOROOT=$PATH:/path/to/go/
  2. export PATH=$PATH:$GOROOT/bin/
  3. export GOPATH=/home/user/project/go

终端测试:

  1. go version
  2. go env
  3. Gofmt -w *.go

IDE安装可参考:

  1. http://www.cnblogs.com/zsy/archive/2016/02/28/5223957.html

go 标准命令

go build

go build 命令用于编译我们指定的源码文件或代码包以及它们的依赖包

go build -o bin/tongbupan go_dev/tongbupan/main-o :指定编译后存放目录以及名称

go install

go install用于编译并安装指定的代码包及它们的依赖包。

go get

go get可以根据要求和实际情况从互联网上下载或更新指定的代码包及其依赖包,并对它们进行编译和安装。

go clean

go clean命令会删除掉执行其它命令时产生的一些文件和目录

go doc & godoc

go doc命令可以打印附于Go语言程序实体上的文档。我们可以通过把程序实体的标识符作为该命令的参数来达到查看其文档的目的。

godoc是一个很强大的工具,同样用于展示指定代码包的文档。

go run

go run命令可以编译并运行命令源码文件。

go run src/go_dev/hello.go

标记名称 标记描述
-a 强行对所有涉及到的代码包(包含标准库中的代码包)进行重新构建,即使它们已经是最新的了。
-n 打印编译期间所用到的其它命令,但是并不真正执行它们。
-p n 指定编译过程中执行各任务的并行数量(确切地说应该是并发数量)。在默认情况下,该数量等于CPU的逻辑核数。但是在darwin/arm平台(即iPhone和iPad所用的平台)下,该数量默认是1
-race 开启竞态条件的检测。不过此标记目前仅在linux/amd64freebsd/amd64darwin/amd64windows/amd64平台下受到支持。
-v 打印出那些被编译的代码包的名字。
-work 打印出编译时生成的临时工作目录的路径,并在编译结束时保留它。在默认情况下,编译结束时会删除该目录。
-x 打印编译期间所用到的其它命令。注意它与-n标记的区别。

go test

go test命令用于对Go语言编写的程序进行测试。这种测试是以代码包为单位的。

go list

go list命令的作用是列出指定的代码包的信息。

go fix与go tool fix

go fix会把指定代码包的所有Go语言源码文件中的旧版本代码修正为新版本的代码。

命令go fix其实是命令go tool fix的简单封装。

go vet与go tool vet

go vet是一个用于检查Go语言源码中静态错误的简单工具。

go vet命令是go tool vet命令的简单封装。

go tool pprof

go tool pprof命令来交互式的访问概要文件的内容。

go tool cgo

可以使我们创建能够调用C语言代码的Go语言源码文件。

go env

go env用于打印Go语言的环境信息。

名称 说明
CGO_ENABLED 指明cgo工具是否可用的标识。
GOARCH 程序构建环境的目标计算架构。
GOBIN 存放可执行文件的目录的绝对路径。
GOCHAR 程序构建环境的目标计算架构的单字符标识。
GOEXE 可执行文件的后缀。
GOHOSTARCH 程序运行环境的目标计算架构。
GOOS 程序构建环境的目标操作系统。
GOHOSTOS 程序运行环境的目标操作系统。
GOPATH 工作区目录的绝对路径。
GORACE 用于数据竞争检测的相关选项。
GOROOT Go语言的安装目录的绝对路径。
GOTOOLDIR Go工具目录的绝对路径。

Hello World

package mainimport "fmt"func main() {fmt.Println("Hello World")
}

程序基本语法

  1. 所有go源码以.go结尾;
  2. 注释不会被编译,单行注释是以 // 开头,多行注释以 /* 开头,以 */ 结尾;
  3. 标识符以字母或下划线开头,大小写敏感,_ 是特殊标识符,用来忽略结果;
  4. 保留关键字:
break default func interface select
case defer go map struct
chan else goto package switch
const fallthrough if range type
continue for import return var
append bool byte cap close complex complex64 complex128 uint16
copy false float32 float64 imag int int8 int16 uint32
int32 int64 iota len make new nil panic uint64
print println real recover string true uint uint8 uintptr

程序基本结构

1. 任何一个代码文件隶属于一个包

2. golang可执行程序,package main,并且有且只有一个main入口函数

3. 包中函数调用:

  1. 同一个包中函数,直接调用
  2. 不同包中函数,通过包名+点+函数名进行调用

4. 包访问控制规则:

  1. 大写意味着这个函数/变量是可导出的
  2. 小写意味着这个函数/变量是私有的,包外部不能访问

项目目录

$ tree project
project
├── bin
│   ├── example1
│   └── goroute_example
├── pkg
├── src
│   └── go_dev
│       └── day1
│           ├── example1
│           │   ├── debug
│           │   └── hello.go
│           └── goroute_example
│               ├── goroute
│               │   └── add.go
│               └── main
│                   └── main.go
└── venderSrc 源码文件
Bin 编译后二进制文件
vender  第三方
pkg 静态文件

简单栗子

$ tree project
project
├── bin
│   └── goroute_example
├── pkg
├── src
│   └── go_dev
│       └── test1
│           └── goroute_example
│               ├── goroute
│               │   └── add.go
│               └── main
│                   └── main.go
└── vender

[main.go]package mainimport ("fmt""go_dev/test1/goroute_example/goroute"
)func main() {pipe := make(chan int, 1)go goroute.Add(pipe, 10, 20)sum := <-pipefmt.Println(sum)
}

[add.go]package goroutefunc Add(pipe chan int, a int, b int) {pipe <- (a + b)
}

$ go build -o bin/goroute_example go_dev/test1/goroute_example/main
$ bin/goroute_example
30
$

Go语言学习笔记(一)Let's 干吧相关推荐

  1. 【Go语言 · 学习笔记】

    文章目录 Go语言 · 学习笔记 一.Go包管理 1. 什么是Go语言中的包 2. 包的命名 3. main包 4. 导入包 5. 远程包导入 6. 命名导入 7. 包的init函数 二.Go开发工具 ...

  2. C语言学习笔记10-指针(动态内存分配malloc/calloc、realloc、释放free,可变数组实现;Tips:返回指针的函数使用本地变量有风险!;最后:函数指针)

    C语言:指针 1. 指针:保存地址的变量 *p (pointer) ,这种变量的值是内存的地址.   取地址符& 只用于获取变量(有地址的东西)的地址:scanf函数-取地址符   地址的大小 ...

  3. 梓益C语言学习笔记之链表&动态内存&文件

    梓益C语言学习笔记之链表&动态内存&文件 一.定义: 链表是一种物理存储上非连续,通过指针链接次序,实现的一种线性存储结构. 二.特点: 链表由一系列节点(链表中每一个元素称为节点)组 ...

  4. 6.方法(go语言学习笔记)

    6.方法(go语言学习笔记) 目录 定义 匿名字段 方法集 表达式 1. 定义 方法是与对象实例绑定的特殊函数. 方法是面向对象编程的基本概念,用于维护和展示对象的自身状态.对象是内敛的,每个实例对象 ...

  5. 梓益C语言学习笔记之指针

    梓益C语言学习笔记之指针 一.32位平台下,地址是32位,所以指针变量占32位,共4个字节 二.内存单元的地址即为指针,存放指针的变量称为指针变量,故:"指针"是指地址,是常量,& ...

  6. c语言中void arrout,c语言学习笔记(数组、函数

    <c语言学习笔记(数组.函数>由会员分享,可在线阅读,更多相关<c语言学习笔记(数组.函数(53页珍藏版)>请在人人文库网上搜索. 1.数组2010-3-29 22:40一维数 ...

  7. c语言float二进制输出代码_C语言学习笔记——学前知识概述

    将我大一学习C语言时做的笔记拿来与大家分享,内容比较浅显,比较适合初学者,如有错误还请见谅,提出改正,谢谢! 前言:此C语言笔记是本人在自学时记录的一些重点或初学者常犯的错误,希望我的这本笔记能够对大 ...

  8. c语言学习笔记【结构体02】结构体指针变量与结构体变量的函数参数,C语言学习笔记结构体02结构体指针变量与结构体变量的函数参数.docx...

    C 语言学习笔记[结构体02]结构体指针变量与结构体变量 的函数参数 C 语言学习笔记之结构体指针变量一提指针,那可 是 C 语言的核心了,有多少学子曾拜倒在指针的脚下.单纯的说指针,其实并不难,但是 ...

  9. C语言学习笔记---001C语言的介绍,编译过程原理,工具等

    C语言学习笔记---001C语言的介绍,编译过程原理,工具等 创梦技术交流平台:资源下载,技术交流,网络赚钱: 交流qq群:1群:248318056 2群:251572072 技术交流平台:cre.i ...

  10. go get 拉取指定版本_go语言学习笔记-基础知识-3

    相关文档 go语言学习笔记-目录 1.简介 1.1 什么是GO Go 是一个开源的编程语言,它能让构造简单.可靠且高效的软件变得容易.Go是从2007年末由Robert Griesemer, Rob ...

最新文章

  1. 软件开发--深入理解程序的结构
  2. 利好不断 分布式光伏迎黄金时代
  3. 国家开放大学2021春1080工程数学(本)题目
  4. layui 子页面写弹出框覆盖父页面,以及给弹框中的表单赋值
  5. jlist放jbutton 按钮事件失效_电动高处作业吊篮操作如何面对一些突发事件
  6. beetl 页面标签_05.Beetl标签函数以及定界符、占位符介绍---《Beetl视频课程》
  7. GitBucket管理员添加人员
  8. springboot 优雅停机_SpringBoot 优雅停止服务的几种方法 第309篇
  9. matlab练习程序(径向模糊1)
  10. Linux内存是怎么工作的
  11. keras保存的h5、hdf5模型,加载时出现“AttributeError: ‘str‘ object has no attribute ‘decode‘ “
  12. IE FF css兼容
  13. miui tv android,MIUI for TV 3.0上线 应用远程安装 手机反控电视
  14. Visual Studio 基础 之 VS 查看/反编译 C# dll 脚本代码的简单方法
  15. java和vue的狱警管理系统监狱系统狱务管理系统
  16. 开源成语答题小程序红包设置教程
  17. 《机器人学导论》-《计算多体动力学》两本教材角速度传递的理解
  18. 计算机图像双曲线的代码,双曲线
  19. 修改视频属性中的'修改时间'
  20. java飞机订票系统课程设计_基于Java+SSH的飞机票订票售票系统

热门文章

  1. OkHttp源码分析
  2. 初始Java DVD项目
  3. IDEA Properties中文unicode转码问题
  4. apache日志设置方法:按时间、按大小记录
  5. 新浪微博登录接口实例
  6. 手机开发平台指南、教程和资料介绍
  7. ISE安装和FLASH烧录
  8. 简述数学建模的过程_数学建模研究过程指导:从高中数学体会数学概貌和数学建模...
  9. Python爬虫破解有道翻译
  10. Ubuntu下非常给力的下载工具–aira2