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 ...
随机推荐
- 分享如何在github上为代码创建一个链接
从自学前端到现在差不多一个月了,在此期间,一直有一种困惑,如何将自己电脑中编写的代码生成一个链接,以便可以发布呢?今天有幸被高人指点一二,现将其分享. 第一步,网上注册一个github账号 第二步,新 ...
- nginx环境准备
一.环境调试确认 1.四项确认 确认公网已连通. 确认yum源可用. 确认iptables已经关闭. 确认selinux已经关闭. a.确认是否连通公网. ping www.baidu.com b.确 ...
- 1.1 从零搭建Go语言开发环境
一.下载 下载地址: Go官网下载地址:https://golang.org/dl/ Go官方镜像站(推荐):https://golang.google.cn/dl/ 版本的选择 Windows平台和 ...
- 修改Android EditText光标颜色和底线颜色
1.修改光标颜色 EditText有一个属性:android:textCursorDrawable,这个属性是用来控制光标颜色的android:textCursorDrawable="@nu ...
- Java编写能完成复数运算的程序
Java编写能完成复数运算的程序 题目简介: 整体分析: 界面分析: 实验代码: package complex; import java.awt.EventQueue; import javax.s ...
- gitlab仓库的使用
一.gitlab简介 gitlab是一个用于仓库管理系统的开源项目,使用git作为代码管理工具,并在此基础上搭建web服务. [管理命令] gitlab-ctl stop gitlab- ...
- WEB框架初识
HTTP介绍 Hyper Text Transfer Protocol,超文本传输书协议,是万维网数据通信的基础,规定了请求和响应标准. HTTP工作原理 HTTP 请求以及响应的步骤 客户端连接到W ...
- CNN卷积汇总
1,卷积作用:减少参数(卷积核参数共享),卷积过程中不断对上一个输出进行抽象,由局部特征归纳为全局特征(不同卷积层可视化可以观察到这点) 2,卷积核 早期卷积核由人工总结,如图像处理中有: 深度神经网 ...
- IE11兼容IE8的设置
我们在使用ie11浏览器的时候,有些网站的兼容性不是太好,这个时候就要设置下ie11的兼容性了.那么ie11浏览器怎么设置兼容IE8呢?下面就让小编给大家介绍一下吧. 首先我们打开电脑里面的ie11浏 ...
- python利用smtp发送邮件
#!/usr/bin/env python # -*- encoding: utf-8 -*- # author:IversOn5 import requests import json import ...