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原子操作类包 ... 
随机推荐
- jmter 二次开发 IDEA 项目5.1
			jmter 二次开发 IDEA 项目5.1 IDEA 编译 Jmeter 5.0(二次开发) 1. Java环境配置 1.1 步骤1 1.2 步骤2 1.3 步骤3 1.4 ... 
- 浏览器获取自定义响应头response-headers
			原创作品版权归属本人所有,违者必究 https://blog.csdn.net/qq_37025445/article/details/82888731想在浏览器获取响应头里面自定义的响应头:file ... 
- Day 18 :面向对象[基础,继承,组合]类的增删改查
			有的人说,编程有3种范式: 1.面向过程:就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了. 2.面向函数:面向函数是面向过程的升级版,也就是把每个 ... 
- C# 设计模式 (一)
			学习来自<大话设计模式>有兴趣可以研究一下 一.简单工厂模式 原理 子类对象可以赋值给父类对象.同一个父类对象的子类,通过switch语句new出来(当然用if也可以但那样判断就多了起来) ... 
- 3-Windows-CMD启动mysql服务-连接本地mysql服务-连接远程mysql服务
			转自: https://jingyan.baidu.com/article/84b4f565b77a5660f6da32d4.html 备注: 如果在连接远程mysql服务,无法连接时,可能是远程my ... 
- Linux编程获取本机IP地址
			使用函数getifaddrs来枚举网卡IP,当中使用到的结构体例如以下所看到的: struct ifaddrs { struct ifaddrs *ifa_next; /* Next item in ... 
- 判断字符串是否为JSON
			function isJSON(str) { if (typeof str == 'string') { try { var obj=JSON.parse(str); if(typeof obj == ... 
- C预处理之宏定义
			#include <stdio.h> //定义不带参数的宏 #define PI 3.14 /*********************************************** ... 
- String.join() --Java8中String类新增方法
			序言 在看别人的代码时发现一个方法String.join(),因为之前没有见过所以比较好奇. 跟踪源码发现源码很给力,居然有用法示例,以下是源码: /** * Returns a new String ... 
- 2018-2-13-win10-uwp-如何拖动一个TextBlock的文字到另一个TextBlock-
			title author date CreateTime categories win10 uwp 如何拖动一个TextBlock的文字到另一个TextBlock lindexi 2018-2-13 ... 
