golang(1):简介
golang语言特性:
1. 垃圾回收
a. 内存自动回收,不需要开发人员管理内存,开发人员专注业务实现
b. 只需要new分配内存,不需要释放 2. 天然并发
a. 从语言层面支持并发,非常简单
b. goroute,轻量级线程,使创建成千上万个 goroute 成为可能
c. 基于CSP(Communicating Sequential Process)模型实现 3. channel (管道)
a. 管道,类似 unix/linux 中的 pipe
b. 多个 goroutine 之间通过 channel 进行通信
c. 支持任何类型 // 示例:
func main() {
pipe := make(chan int,3) # pipe := make(chan int,3) 做了两件事:1.声明一个管道变量pipe,pipe为int,2. 为管道pipe分配了一个新的内存空间;make 是一个关键字,表示分配一个内存空间;chan 也是一个关键字,说明该参数是个管道;3表示管道的容量,指定这个管道中最多只能放3个int
pipe <- 1 # 表示把 1 放到管道pipe中
pipe <- 2 # 表示把 2 放到管道pipe中
} 4. 多返回值
a. 一个函数 返回多个值 func calc(a int,b int) (int,int){ // 两个以上的返回值要放到 () 中
sum := a + b
avg := (a+b)/2
return sum,avg
}
第一个go程序: helloworld.go
package main
// go每一个文件都属于一个包;package 关键字说明这个文件是一个包;想让这个包成为一个可执行文件,包名必须为 main // 导入输出的包
import(
"fmt"
) // go 语言的代码被编译时,每行最后会自动加一个 “;” // 定义变量a 为整型,变量b为整型;规定返回值 也是 整型
func add(a int,b int) int {
var sum int // 定义一个变量 sum 为整型
sum = a + b
return sum
} // go 代码执行的时候会从 main 函数开始执行; main 是入口函数
func main(){
var c int
c = add(,) // 定义的变量 c 必须有被引用才能通过编译
fmt.Println("add(100,200)=", c) fmt.Println("hello world")
}
helloworld.go
package main import(
"time" // 导入时间函数
) func main() {
for i := ; i < ; i++ { // sum := a +b // sum := 这种定义变量的方式会根据 = 后面的变量 自动把 sum 定义成 int 整型
// 调用 test_goroutine 函数
go test_goroutine(i) // test_goroutine 函数和 main 函数 都在 main 这同一个包里面,此时包名可以省略
// go test_goroutine(i) 是并发运行的
} // 主函数运行在一个 goroute 里面,然后又起了100个test_goroutine;主线程这个 test_goroutine 要等待 那100个子线程执行完
time.Sleep(time.Second) // sleep 1 秒
}
test.go
package main
// test.go 文件也是在 main 这个包里面 import (
"fmt"
) func test_goroutine(a int) {
fmt.Println(a)
}
终端显示如图:

管道 channel 示例1:
main.go
package main
func main() {
test_pipe()
}
pipe.go
package main import (
"fmt"
) func test_pipe(){
pipe := make(chan int, )
pipe <-
pipe <-
pipe <- fmt.Println(len(pipe)) // len(pipe) ---> 管道的长度; 管道满了后,再往管道中放 值,管道会 pend住,直到管道中有值被取出,pend住的值才会放入到管道中 var t1 int
t1 =<- pipe // 从管道中取出一个值
fmt.Println(t1) }
管道 channel 示例2: 通过传参的方式,利用 管道进行 goroutine 之间的通讯
package main import (
"fmt"
"time"
) func add(a int,b int,c chan int) { // c chan int ---> 形参 c 是一个int 类型的管道
var sum int
sum = a + b time.Sleep(*time.Second) // sleep 3 秒
c <- sum // 把 sum 放到管道 c 中
} func main(){
var pipe chan int // 声明一个变量 pipe 为int 的管道
pipe = make(chan int,) // 为管道pipe分配一个新的内存空间; pipe 的容量大小为1 go add(,,pipe) // 开启一个新的 goroutine;把 pipe当作参数传入 add函数中 sum :=<- pipe // 从管道pipe 中取值,并赋值给类型为int的变量sum;通过这种方式主线程就能获取到 add 这个子线程中的值; 虽然 add 中 会 sleep 3 秒,但这行代码下面不需要再 sleep,因为当 add 没执行完的时候, 管道 pipe中没有值,此时程序会 pend在这行代码处
fmt.Println("sum=",sum) // time.Sleep(10*time.Second) // 此处不需要再 sleep 10 秒来等待子线程执行完毕
}
函数多返回值示例:
package main import (
"fmt"
) func calc(a int,b int) (int, int){
sum := a + b
avg := (a+b)/
return sum, avg
} func main(){
sum, avg := calc(,) // 取出返回值
// sum, _ := calc(100, 320) // 只取一个返回值的写法 fmt.Println("sum=",sum,"avg=",avg)
}
包的概念:
. 和 python 一样,把相同功能的代码放到一个目录,称之为包;包 和 文件夹 是对应的
. 包可以被其他包引用
. main 包是用来生成可执行文件,第个程序只有一个 main 包
. 包的主机用途是提高代码的可利用性 // go 语言中 所有的代码文件的都是以包的形式存在的,没有哪个代码文件不属于任何一个包
测试项目目录结构如下:
[root@NEO ~]# echo $GOPATH
/root/go/project // $GOPATH 的目录 [root@NEO project]# tree /root/go/project/
/root/go/project/
├── bin
├── example01
├── pkg
├── src
│ └── go_dev
│ └── day01
│ ├── example01
│ │ └── hello.go
│ └── package_example
│ ├── calc
│ │ ├── add.go
│ │ └── sub.go
│ └── main
│ └── main.go
└── vender directories, files
[root@NEO project]#
example01 包的代码如下:
package main import (
"fmt"
) func main(){
fmt.Println("hello world")
}
编译 go_dev/day01/example01/ 包的命令:
[root@NEO project]# go build go_dev/day01/example01
[root@NEO project]# ll
total
drwxr-xr-x root root Jul : bin
-rwxr-xr-x root root Jul : example01 // 编译后生成的可执行文件
drwxr-xr-x root root Jul : pkg
drwxr-xr-x root root Jul : src
drwxr-xr-x root root Jul : vender
[root@NEO project]# ./example01
hello world
[root@NEO project]#
包测试项目 package_example示例:
package_example/main/main.go 的代码如下:
package main import (
// 从 src 目录下开始导入包
"go_dev/day01/package_example/calc"
"fmt"
) // go build 的时候不用写 src 目录,因为 go 在编译的时候默认会从 src 目录下开始找 func main(){
sum := calc.Add(,)
sub := calc.Sub(,) fmt.Println("sum=",sum)
fmt.Println("sub=",sub)
} // go build 时,先在命令行切到 /project 目录; 同时从根目录到 /project 的路径要添加到 环境变量 GOPATH 中
// go build -o bin/main.exe go_dev/day01/package_example/main
// -o 参数表示编译包生成的位置; go_dev/day01/package_example/main 表示编译哪个包 (路径最前面不要加 /)
// 执行上面的命令后会在 bin 目录下生成 main.exe 可执行文件 // windowns 环境下的代码
package_example/calc/add.go 代码如下:
package calc // 可导出的函数,首字母必须大写
func Add(a int,b int) int {
return a +b
} // windows环境下的代码
package_example/calc/sub.go 代码如下:
package calc // 可导出的函数,首字母必须大写
func Add(a int,b int) int {
return a +b
} // windows 环境下的代码
在linux环境下编译该项目:
[root@NEO project]# go build -o bin/main go_dev/day01/package_example/main // 编译的命令
[root@NEO project]# ll bin/
total 1952
-rwxr-xr-x 1 root root 1997628 Jul 10 02:05 main
[root@NEO project]# ./bin/main
sum= 400
sub= -200
[root@NEO project]#
golang(1):简介的更多相关文章
- Golang 并发简介
并发概要 随着多核CPU的普及, 为了更快的处理任务, 出现了各种并发编程的模型, 主要有以下几种: 模型名称 优点 缺点 多进程 简单, 隔离性好, 进程间几乎无影响 开销最大 多线程 目前使用最多 ...
- Golang 特性简介
by sheepbao 主要大概介绍go语言的历史和特性,简单的入门. 来历 很久以前,有一个IT公司,这公司有个传统,允许员工拥有20%自由时间来开发实验性项目.在2007的某一天,公司的几个大牛, ...
- GoLang基础数据类型--->数组(array)详解
GoLang基础数据类型--->数组(array)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Golang数组简介 数组是Go语言编程中最常用的数据结构之一.顾名 ...
- golang 的几个入门资料
=====================视频=====================无闻 老师的<Go 编程基础>视频https://github.com/Unknwon/go-fun ...
- 从小白到区块链工程师:第一阶段:Go语言环境的搭建(1)
一,Golang语言简介 2009年由谷歌公司推出,由C语言之父Ken Thompson主导研发.Go(又称Golang)是Google开发的一种静态强类型.编译型.并发型,并具有垃圾回收功能的编程语 ...
- jwt的简单使用
目录 简介 java版本 golang版本 简介 使用jwt对数据进行存储加密,分为java和golang版本. java版本 maven配置 <dependency> <group ...
- golang学习笔记5 用bee工具创建项目 bee工具简介
golang学习笔记5 用bee工具创建项目 bee工具简介 Bee 工具的使用 - beego: 简约 & 强大并存的 Go 应用框架https://beego.me/docs/instal ...
- Golang包管理工具glide简介
Golang包管理工具glide简介 前言 Golang是一个十分有趣,简洁而有力的开发语言,用来开发并发/并行程序是一件很愉快的事情.在这里我感受到了其中一些好处: 没有少了许多代码格式风格的争论, ...
- Golang : cobra 包简介
Cobra 是一个 Golang 包,它提供了简单的接口来创建命令行程序.同时,Cobra 也是一个应用程序,用来生成应用框架,从而开发以 Cobra 为基础的应用.本文的演示环境为 ubuntu 1 ...
- Golang : pflag 包简介
笔者在前文中介绍了 Golang 标准库中 flag 包的用法,事实上有一个第三方的命令行参数解析包 pflag 比 flag 包使用的更为广泛.pflag 包的设计目的就是替代标准库中的 flag ...
随机推荐
- HighCharts 动态设置 series
var series = new Array(); var map = response.extend.map; $.each(map, function (key,values) { series. ...
- nginx目录及配置语法
一.Nginx安装目录 1.查看安装目录. 采用yum的方式安装,其实都是安装的一个一个的 pm 包,故可采用如下命令查看 rpm -ql nginx 遵循了 rpm 包管理规范. 2.安装目录详解 ...
- DP&图论 DAY 6 上午
DP&图论 DAY 6 上午 双连通分量 从u-->v不存在必经边,点 点双连通分量 边双连通分量 点/边双连通分量缩点之后变成一个树 找连通块的时候不越过割点或者桥 P3469 [ ...
- 读懂react源码
2019-11-06 1.最重要的两个目录,react,react-dom,(react-reconciler后续会很重要) 2.使用flow检查js的类型 3.react.createElement ...
- MVP模式入门案例
随着UI创建技术的功能日益增强,UI层也履行着越来越多的职责.为了更好地细分视图(View)与模型(Model)的功能,让View专注于处理数据的可视化以及与用户的交互,同时让Model只关系数据的处 ...
- 如何删除link-local(169.255.0.0) 路由表项
route -n 时你总能看到这样一条路由Destination Gateway Genmask Flags Metric Ref Use Iface169.254.0.0 0.0.0.0 255.2 ...
- Android adb.exe 开发模试安装
1.安装 adb . 让它直接能在cmd 窗口运行 下载:platform-tools 这个就行: Download SDK Platform-Tools for Windows 下载完成后直接解压 ...
- 使用Navicat为Oracle新增用户
步骤请参考帖子https://www.cnblogs.com/franson-2016/p/5925593.html 需要注意的是新增用户时不能使用小写,否则不能登录,之前新增一个小写的用户名,授予c ...
- k8s1.11.0安装、一个master、一个node、查看node名称是主机名、node是扩容进来的、带cadvisor监控服务
一个master.一个node.查看node节点是主机名 # 安装顺序:先在test1 上安装完必要组件后,就开始在 test2 上单独安装node组件,实现node功能,再返回来配置test1加入集 ...
- 使用robotframework做接口测试三——保持登录状态
调用登录接口登录了,其他的接口怎么保持登录状态呢? 首先来看一看,web端或者说客户端是怎么样用cookie/token等保持登录状态的.一般来说,cookie都会在登录接口由服务端返回,而且会是在 ...