简介

Go语言是一种新的语言,一种并发的、带垃圾回收的、快速编译的语言。它具有以下特点:
1.它可以在一台计算机上用几秒钟的时间编译一个大型的Go程序。
2.Go语言为软件构造提供了一种模型,它使依赖分析更加容易,且避免了大部分C风格include文件与库的开头。
3.Go语言是静态类型的语言,它的类型系统没有层级。因此用户不需要在定义类型之间的关系上花费时间,这样感觉起来比典型的面向对象语言更轻量级。
4.Go语言完全是垃圾回收型的语言,并为并发执行与通信提供了基本的支持。
按照其设计,Go打算为多核机器上系统软件的构造提供一种方法。
Go语言是一种编译型语言,它结合了解释型语言的游刃有余,动态类型语言的开发效率,以及静态类型的安全性。它也打算成为现代的,支持网络与多核计算的语言。要满足这些目标,需要解决一些语言上的问题:一个富有表达能力但轻量级的类型系统,并发与垃圾回收机制,严格的依赖规范等等。这些无法通过库或工具解决好,因此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 简介与包的更多相关文章

  1. Linux程序包管理.md

    rpm 简介 RPM包管理员(简称RPM,全称为The RPM Package Manager)是在Linux下广泛使用的软件包管理器.RPM此名词可能是指.rpm的文件格式的软件包,也可能是指其本身 ...

  2. Python标准库02 时间与日期 (time, datetime包)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python具有良好的时间和日期管理功能.实际上,计算机只会维护一个挂钟时间(wa ...

  3. Support Library官方教程(2)各支援包的特性详介(含表)*

    快速阅读 包名  作用  位置 是否有资源 v4 提供了最多的api <sdk>/extras/android/support/v4/ y Multidex 把DEX文件生成apk < ...

  4. glide简介

    golang包管理工具glide简介   golang包管理工具glide简介 前言 golang是一个十分有趣,简洁而有力的开发语言,用来开发并发/并行程序是一件很愉快的事情.在这里我感受到了其中一 ...

  5. [强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!)

    原文:[强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!) [强烈推荐]ORACLE PL/SQL编程详解之七: 程序包的创建与应用(聪明在于学习,天 ...

  6. UML之包图

    包图是UML中用类似于文件夹的符号表示的模型元素的组合,系统中的每个元素都只能为一个包所有,一个包可嵌套在另一个包中,使用包图可将相关元素归入一个系统,一个包中包含附属包.图表或单个元素.简单的来说, ...

  7. DAY16、模块和包

    一.模块 1.模块的加载顺序:内存 =>内置 =>sys.path(一系列自定义模块) 2.sys.path:环境变量,存放文件路径的列表 重点:默认列表第一个元素就是当前被执行文件所在的 ...

  8. Linux学习之RPM包管理-rpm命令管理(十六)

    Linux学习之RPM包管理-rpm命令管理 目录 简介 RPM包依赖性 包全名与包名 rpm软件包安装 rpm软件包卸载 升级降级rpm软件包 rpm软件包的查询 rpm软件包校验 简介 RPM是R ...

  9. 并发之java.util.concurrent.atomic原子操作类包

    15.JDK1.8的Java.util.concurrent.atomic包小结 14.Java中Atomic包的原理和分析 13.java.util.concurrent.atomic原子操作类包 ...

随机推荐

  1. Codeforces 1119E Pavel and Triangles (贪心)

    Codeforces Global Round 2 题目链接: E. Pavel and Triangles Pavel has several sticks with lengths equal t ...

  2. pta作业1

    7-1 打印沙漏 (20 分) 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个“*”,要求按下列格式打印 ***** *** * *** ***** 所谓“沙漏形状”,是指每行输出奇数 ...

  3. 去除字符串中的HTML标签

    背景:Kindeditor内容保存在数据库中的类型是text,包含文字和HTML标签. 需求:显示内容的前50个字(纯文字内容) 方法:将字段查出去除标签,截取前50 import java.util ...

  4. leetcode.字符串.14最长公共前缀-Java

    1. 具体题目 编写一个函数来查找字符串数组中的最长公共前缀.如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower","fl ...

  5. Linux特殊位SUID、SGID、SBIT

    Linux特殊位SUID.SGID.SBIT 前言 Linux中的文件权限一般有x.w.r,在某个情况下有需要用到s.t,即特殊位. 进程运行时能够访问哪些资源或文件,不取决于进程文件的属主属组,而是 ...

  6. tomcat之redis

    Nginx服务器:[root@nginx ~]# vim /usr/local/nginx/conf/nginx.confupstream tomcat_pool { server 192.168.2 ...

  7. python中while与else的联姻

    循环使用 else 语句在 python 中,for … else 表示这样的意思,for 中的语句和普通的没有区别,else 中的语句会在循环正常执行完(即 for 不是通过 break 跳出而中断 ...

  8. redis安装到本地服务的方法

    要安装Redis,首先要获取安装包. Windows的Redis安装包需要到以下GitHub链接找到. 链接:https://github.com/MSOpenTech/redis 打开网站后,找到R ...

  9. Excel如何快速渲染百万级别的数据

    Excel主要经历1.查询2.渲染的方式 关于查询: 不同技术水平的人有不同的解决方案,目前我采用的是 1:多线程查询 2:一个异步后台线程每次查询100条便渲染,采用的“懒加载方式”,这样可以做到实 ...

  10. Web响应的提高

    想象一下,如果用户在页面上触发一个点击事件,结果反应延迟比较明显,这将是一个令人沮丧的事情.而造成这个问题的原因就是响应延迟. 浏览器UI 线程 大家都知道浏览器的UI线程,大多数浏览器都是一个独立的 ...