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")
}
test_goroutine 测试程序:

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):简介的更多相关文章

  1. Golang 并发简介

    并发概要 随着多核CPU的普及, 为了更快的处理任务, 出现了各种并发编程的模型, 主要有以下几种: 模型名称 优点 缺点 多进程 简单, 隔离性好, 进程间几乎无影响 开销最大 多线程 目前使用最多 ...

  2. Golang 特性简介

    by sheepbao 主要大概介绍go语言的历史和特性,简单的入门. 来历 很久以前,有一个IT公司,这公司有个传统,允许员工拥有20%自由时间来开发实验性项目.在2007的某一天,公司的几个大牛, ...

  3. GoLang基础数据类型--->数组(array)详解

    GoLang基础数据类型--->数组(array)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Golang数组简介 数组是Go语言编程中最常用的数据结构之一.顾名 ...

  4. golang 的几个入门资料

    =====================视频=====================无闻 老师的<Go 编程基础>视频https://github.com/Unknwon/go-fun ...

  5. 从小白到区块链工程师:第一阶段:Go语言环境的搭建(1)

    一,Golang语言简介 2009年由谷歌公司推出,由C语言之父Ken Thompson主导研发.Go(又称Golang)是Google开发的一种静态强类型.编译型.并发型,并具有垃圾回收功能的编程语 ...

  6. jwt的简单使用

    目录 简介 java版本 golang版本 简介 使用jwt对数据进行存储加密,分为java和golang版本. java版本 maven配置 <dependency> <group ...

  7. golang学习笔记5 用bee工具创建项目 bee工具简介

    golang学习笔记5 用bee工具创建项目 bee工具简介 Bee 工具的使用 - beego: 简约 & 强大并存的 Go 应用框架https://beego.me/docs/instal ...

  8. Golang包管理工具glide简介

    Golang包管理工具glide简介 前言 Golang是一个十分有趣,简洁而有力的开发语言,用来开发并发/并行程序是一件很愉快的事情.在这里我感受到了其中一些好处: 没有少了许多代码格式风格的争论, ...

  9. Golang : cobra 包简介

    Cobra 是一个 Golang 包,它提供了简单的接口来创建命令行程序.同时,Cobra 也是一个应用程序,用来生成应用框架,从而开发以 Cobra 为基础的应用.本文的演示环境为 ubuntu 1 ...

  10. Golang : pflag 包简介

    笔者在前文中介绍了 Golang 标准库中 flag 包的用法,事实上有一个第三方的命令行参数解析包 pflag 比 flag 包使用的更为广泛.pflag 包的设计目的就是替代标准库中的 flag ...

随机推荐

  1. 认识HTML语言(CodePen)

    认识HTML语言 1.一个网页的加载过程 2.Web技术全览 3.HTML语法 HTML语法(一):标签 HTML语法(四):网页结构 4.HTML常用元素 展示元素 (1)块级元素div (2)内联 ...

  2. STL -- heap结构及算法

    STL -- heap结构及算法 heap(隐式表述,implicit representation) 1. heap概述 : vector + heap算法 heap并不归属于STL容器组件,它是个 ...

  3. LC 687. Longest Univalue Path

    Given a binary tree, find the length of the longest path where each node in the path has the same va ...

  4. props的写法

    简写 props: ['demo-first', 'demo-second'] 带类型 props: { 'demo-first': Number, 'demo-second': Number } 带 ...

  5. linux性能分析之平均负载

    平均负载 1,执行 top 或者 uptime 命令 来了解系统负载 uptime 分析显示 当前时间,系统运行时间,正在登录用户数 平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程 ...

  6. Mongdb、Mysql、Redis、Memcache场景

    个人的一点理解,不确定一定准确,有不对处欢迎指出 全部数据使用mysql存储,确保安全.准确和持久 大数据.非安全性数据使用Mongodb 小数据.结构丰富.持久化(主从数据)使用redis 小数据. ...

  7. WPF使用cefsharp 下载地址

    源码下载: https://github.com/cefsharp/CefSharp dll类库包下载nuget: https://www.nuget.org/packages/CefSharp.Wp ...

  8. pyqt5-实时刷新页面(QApplication.processEvents())

    对于执行很耗时的程序来说,由于PyQt需要等待程序执行完毕才能进行下一步,这个过程表现在界面上就是卡顿,而如果需要执行这个耗时程序时不断的刷新界面.那么就可以使用QApplication.proces ...

  9. HTTP Status 500 – Internal Server Error

    明明硬盘中存在users.xml,但是提示:系统找不到指定的路径. 解决办法: 设置String的编码格式 realpath = URLDecoder.decode(realpath, "U ...

  10. MyEclipse 下'Publishing to Tomcat'has encountered a problem解决办法

    详情查看: MyEclipse 下'Publishing to Tomcat'has encountered a problem解决办法