go 简介与包
简介
安装配置
1 根据操作系统选择不同的安装包
下载地址 https://golang.org/dl/
2 安装
根据不同的安装包有不同的安装方法,具体参考官网
3 设置环境变量
需要设置go的环境变量
1)go 的执行文件路径(GOROOT)加到系统的PATH环境变量中
2)工作目录的路径,设置GOPATH环境变量
4 Hello world sample
- // test
- package main
- import (
- "fmt"
- )
- func add(a int, b int) int {
- var sum int
- sum = a + b
- return sum
- }
- func main() {
- var add_res int
- add_res = add(100, 200)
- fmt.Println("Hello World!", add_res)
- }
helloworld
golang 语言特性
1 垃圾回收
内存自动回收,不需要人为管理内存
只需要new 分配内存,不需要释放
2 天然并发(CPU多核)
从语言层面支持并发,简单
goroute,轻量级线程(个人感觉类似python中的协程),管理底层的无力线程
基于CSP(Communicating Sequential Process)实现,在go中主要是channel和goroute,简介如下
- Channel
- Golang中使用 CSP中 channel 这个概念。channel 是被单独创建并且可以在进程之间传递,它的通信模式类似于 boss-worker 模式的,一个实体通过将消息发送到channel 中,然后又监听这个 channel 的实体处理,两个实体之间是匿名的,这个就实现实体中间的解耦,其中 channel 是同步的一个消息被发送到 channel 中,最终是一定要被另外的实体消费掉的,在实现原理上其实是一个阻塞的消息队列。
- Goroutine
- Goroutine 是实际并发执行的实体,它底层是使用协程(coroutine)实现并发,coroutine是一种运行在用户态的用户线程,类似于 greenthread,go底层选择使用coroutine的出发点是因为,它具有以下特点:
- 用户空间 避免了内核态和用户态的切换导致的成本
- 可以由语言和框架层进行调度
- 更小的栈空间允许创建大量的实例
- 可以看到第二条 用户空间线程的调度不是由操作系统来完成的,像在java 1.3中使用的greenthread的是由JVM统一调度的(后java已经改为内核线程),还有在ruby中的fiber(半协程) 是需要在重新中自己进行调度的,而goroutine是在golang层面提供了调度器,并且对网络IO库进行了封装,屏蔽了复杂的细节,对外提供统一的语法关键字支持,简化了并发程序编写的成本。
channel&goroute
- // test
- package main
- import (
- "time"
- )
- func add(a int, b int) int {
- var sum int
- sum = a + b
- return sum
- }
- func main() {
- //var add_res int
- //add_res = add(100, 200)
- //go test_goroute(10, 20)
- //fmt.Println("Hello World!", add_res)
- for i := 0; i < 100; i++ {
- go test_print(i)
- }
- time.Sleep(5)
- }
go并发
3 channel
管道,类似unix/linux中的pipe
多个goroute之间通过channel进行通信
支持任何类型
- // pipe
- package main
- import (
- "fmt"
- )
- func test_pipe() {
- pipe := make(chan int, 3)
- pipe <- 1
- pipe <- 2
- pipe <- 3
- fmt.Println(len(pipe))
- }
pipe.go
4 goroute和pipe的sample
- // sub
- package calc
- func Sub(a int, b int, c chan int) {
- c <- (a - b)
- }
sub.go
- // add
- package calc
- func Add(a int, b int, c chan int) {
- c <- (a + b)
- }
add.go
- // calculator
- package main
- import (
- "day1/calc"
- "fmt"
- )
- func main() {
- var pipe chan int
- pipe = make(chan int, 1)
- go calc.Add(100, 200, pipe)
- go calc.Sub(100, 200, pipe)
- sum := <-pipe
- sub := <-pipe
- fmt.Println(sum, sub)
- }
calculator
包
1 和python一样,把相同功能的代码放到一个目录,称之为包
2 包可以被其他包引用
3 main包是用来生成可执行文件,每个程序只能有一个main包
4 包主要的用途是提高代码的可复用性
5 一般go项目路径说明
/project/src/ 源文件
bin/ 可执行文件
vendor/ 第三方文件
pkg/ 静态库
6 Go中如果函数名的首字母大写,表示该函数是公有的,可以被其他程序调用,如果首字母小写,该函数就是是私有的,因此我们只能调用其他包文件中的公有函数
7 包的别名
- import (
- f "fmt"
- )
- func main() {
- n := 10
- for i := 0; i <= n; i++ {
- f.Printf("%d+%d=%d\n", i, n-i, n)
- }
- }
8 每个源文件都可以包含一个init函数,这个init函数自动被go运行框架调用
- // main
- package main
- import (
- "fmt"
- )
- func init() {
- fmt.Println("----initiation----")
- }
9 只初始化包,并不引用
- // main
- package main
- import (
- _ "path/external_func"
- )
- func init() {
- fmt.Println("----initiation----")
- }
go 简介与包的更多相关文章
- Linux程序包管理.md
rpm 简介 RPM包管理员(简称RPM,全称为The RPM Package Manager)是在Linux下广泛使用的软件包管理器.RPM此名词可能是指.rpm的文件格式的软件包,也可能是指其本身 ...
- Python标准库02 时间与日期 (time, datetime包)
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python具有良好的时间和日期管理功能.实际上,计算机只会维护一个挂钟时间(wa ...
- Support Library官方教程(2)各支援包的特性详介(含表)*
快速阅读 包名 作用 位置 是否有资源 v4 提供了最多的api <sdk>/extras/android/support/v4/ y Multidex 把DEX文件生成apk < ...
- glide简介
golang包管理工具glide简介 golang包管理工具glide简介 前言 golang是一个十分有趣,简洁而有力的开发语言,用来开发并发/并行程序是一件很愉快的事情.在这里我感受到了其中一 ...
- [强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!)
原文:[强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!) [强烈推荐]ORACLE PL/SQL编程详解之七: 程序包的创建与应用(聪明在于学习,天 ...
- UML之包图
包图是UML中用类似于文件夹的符号表示的模型元素的组合,系统中的每个元素都只能为一个包所有,一个包可嵌套在另一个包中,使用包图可将相关元素归入一个系统,一个包中包含附属包.图表或单个元素.简单的来说, ...
- DAY16、模块和包
一.模块 1.模块的加载顺序:内存 =>内置 =>sys.path(一系列自定义模块) 2.sys.path:环境变量,存放文件路径的列表 重点:默认列表第一个元素就是当前被执行文件所在的 ...
- Linux学习之RPM包管理-rpm命令管理(十六)
Linux学习之RPM包管理-rpm命令管理 目录 简介 RPM包依赖性 包全名与包名 rpm软件包安装 rpm软件包卸载 升级降级rpm软件包 rpm软件包的查询 rpm软件包校验 简介 RPM是R ...
- 并发之java.util.concurrent.atomic原子操作类包
15.JDK1.8的Java.util.concurrent.atomic包小结 14.Java中Atomic包的原理和分析 13.java.util.concurrent.atomic原子操作类包 ...
随机推荐
- PAT_A1080#Graduate Admission
Source: PAT A1080 Graduate Admission (30 分) Description: It is said that in 2011, there are about 10 ...
- 实验报告&总结
Java实验报告 班级计科二班 学号 20188429 姓名 罗璇哲 完成时间 评分等级 实验三 String类的应用 一. 实验目的 (1) 掌握类String类的使用: (2) 学会使用JDK帮助 ...
- JUC源码分析-其它工具类(一)ThreadLocalRandom
JUC源码分析-其它工具类(一)ThreadLocalRandom ThreadLocalRandom 是 JDK7 在 JUC 包下新增的随机数生成器,它解决了 Random 在多线程下多个线程竞争 ...
- 调用API接口,查询手机号码归属地(2)
使用pymysql pip install pymysql 创建mysql测试表 CREATE TABLE `userinfo` ( `id` int(20) NOT NULL AUTO_INCREM ...
- USACO2012 Moo /// 模拟 oj21548
大致题意: 递归地描述序列:设S(0)为3个字符的序列“mo o”.然后在较长的序列小号(ķ)通过取序列的拷贝获得小号(ķ -1),则“摩... O”与ķ 2 O公司,然后该序列的另一个拷贝小号(ķ ...
- usb-host与外设通信(二)
本文是接着上一篇的的usb-host与外设通信(一)接着写的 3.枚举设备 当你的程序运行时,如果应用程序对当前连接的USB设备都感兴趣的,程序可以枚举所以当前的设备.使用getDeviceList( ...
- python_learn Ⅰ
基于 廖雪峰python3教程 学习. 目录: 01_输入输出.py 02_list.tuple.py 03_条件判断.py 04_循环.py 05_利用循环排序.py 06_自定义3元2次方程的根求 ...
- Vue引入日期格式插件moment.js
因为需求需要,接口传递过来的日期格式是一个时间戳,因此需要进行格式转换,老大给了插件地址,让我自己研究 插件地址:http://momentjs.cn/ 因为没有使用过,所有就开始各种百度,参考各位大 ...
- Redis 小调研
一. 概况: Redis是一款开源的.网络化的.基于内存的.可进行数据持久化的Key-Value存储系统.它的数据模型建立在外层,类似于其它结构化存储系统,是通过Key映射Value的方式来建立字典以 ...
- github合并分支到master
(1)切换到master分支 git checkout master (2) 将backup分支的代合并到master git merge backup (3) 查看状态 git status (4) ...