一 go语言特性

1.1 开发环境搭建

实际上就是安装go环境与GoLand IDE工具。
go语言环境:go语言环境下载地址。
这个下载时需要注意:首先使用下面命令查看对应的win系统架构,在选择对应的版本,否则在vscode下载插件时,dlv与dlv-map会无法下载。

echo %PROCESSOR_ARCHITECTURE%
#或者echo %PROCESSOR_IDENTIFIER% 、systeminfo。这里我用第一个直接看出是AMD64架构

所以在选择windows的软件包时,就要选择带有amd字眼的情况,并且选择msi后缀的,这样代表可以直接安装,不需要其他步骤。

GoLand IDE工具:GoLand IDE工具下载地址。不过这个想要破解版需要一个压缩包。

在debug前,最好先执行下面命令,防止影响到没有mod的项目。

go env -w GO111MODULE=off

在vscode进行debug,在安装完所有的插件后,我想进行debug,但是vscode一直报错,错误如下:

unable to locate "go" binary in GOROOT () or PATH(xxx)

大概意思是没有找到对应的go.exe二进制文件,但我直接在cmd上面go env是能运行的,而且我明明看到环境变量的系统Path看到GOROOT的路径。当时我以为是GOPATH下的src不能单独存在xxx.go文件,但是我弄好后,单独放是没问题的。所以这个问题应该是:要么是vscoe的问题,要么是go自己的路径问题。

我当初是这样解决的:在桌面新建go_src目录,里面再建一个子目录src。src添加test.go文件,然后将 "桌面\go_src"的路径添加到GOPATH环境变量中。使用vscode重新debug,然后就能成功debug了。

然后继续想复现上面的问题,但是同样的目录架构和debug方式,结果没问题,所以这个错误是猜测要么是vscoe的问题,要么是go自己的路径问题。

go在vscode的debug比C++简单,直接点击运行,然后会失败,因为你第一次没创建launch.json文件,直接点创建不需要改内容就能debug了。

1.2.1 Go语言特性-垃圾回收

  • a. 内存自动回收,再也不需要开发人员管理内存。
  • b. 开发人员专注业务实现,降低了心智负担。
  • c. 只需要new分配内存,不需要释放。
  • d. gc 垃圾回收 4ms。

1.2.2 Go语言特性-天然并发

  • a. 从语言层面支持并发,非常简单。
  • b. goroute,轻量级线程,创建成千上万个goroute成为可能。
  • c. 基于CSP(Communicating Sequential Process)模型实现。
    测试代码:
// goroute.go
// 1. 一个文件属于一个包,这样表明这个文件属于main这个包,一个包可以有多个文件。
package main// 2. 导入其它的程序库。若没有使用到该包,go会报错,语法严谨。
import ("fmt"
)// 3. 该包的函数
func test_goroute(a int) {fmt.Println(a)
}
// main.go
// 4. 注意需要在main函数的上一层的上一层目录执行即E:\go_study\go_code\1-src\src\1:go run .\1-1-goroute\
// 否则会失败
package mainimport ("time"
)func main() {// 5. 开启一百个协程。go关键字代表开启协程。// go中的协程是:一个线程中开辟,当开辟多个协程时,各自互不干扰,均是异步执行。所以打印可以看到顺序是无序的。for i := 0; i < 100; i++ {go test_goroute(i)}// 睡眠1秒time.Sleep(time.Second)
}

1.2.3 Go语言特性-channel

  • a. 管道,类似unix/linux中的pipe,先进先出,一端是读那么另一端就是写,channel是协程安全的,内部会有锁。 与之前的C语言协程对比,一个线程可以运行多个协程,但是不存在竞态关系,1:n的关系,多个协程访问全局变量是安全的,可以认为是一个线程轮询多个线程。而go的线程与协程之间是m:n关系,存在竞态关系。
  • b. 多个goroute之间通过channel进行通信。
  • c. 支持任何类型。

代码测试:

package mainimport "fmt"func test_pipe() {pipe := make(chan int, 3)pipe <- 1pipe <- 2pipe <- 3var t1 intt1 = <-pipefmt.Println("t1: ", t1)}func sum(s []int, c chan int) {//test_pipe()sum := 0for _, v := range s {sum += v}fmt.Println("sum:", sum)c <- sum // send sum to c
}func main() {// 1. 定义切片ss := []int{7, 2, 8, -9, 4, 0}// 2. 创建通道cc := make(chan int)// 3. 将切片的前半部分元素及通道传入协程,协程进行累积和,然后push到通道。go sum(s[:len(s)/2], c) // 7+2+8 = 17, -9 + 4+0 = -5// 4. 同理,将切片的后半部分元素及通道传入协程,协程进行累积和,然后push到通道。go sum(s[len(s)/2:], c)// 5. 此时通道应该有两个协程统计后的值。下面进行获取,按照通道的先进先出规则。// x, y := <-c, <-c // receive from cx := <-cy := <-cfmt.Println(x, y, x+y)
}

结果:

1.2.4 Go语言特性-多返回值

go的一个函数返回多个值,类似lua。

测试代码:
我的目录结构是这样的,使用到四个go文件。add.go、calc.go、sub.go、main.go。

// add.go
package calcfunc Add(a int, b int) int {return a + b
}
// calc.go
package calcfunc Calc(a int, b int)(int,int) {sum := a + bavg := (a+b)/2return sum, avg
}
// sub.go
package calcfunc Sub(a int, b int) int {return a - b
}
// main.go
package main// 因为我在GOPATH设置了E:\go_study\go_code\1-src为环境变量,而go会自动查找该路径下的src目录,
// 所以下面import calc包时,其路径为:"1/1-3-package/calc"。
// 不过注意有时候添加完环境变量后,并不能马上生效,可能需要等一下。
import ("1/1-3-package/calc""fmt"
)func main() {sum := calc.Add(100, 300)sub := calc.Sub(100, 300)fmt.Println("sum=", sum)fmt.Println("sub=", sub)sum, avg := calc.Calc(100, 300)fmt.Println("sum=", sum)fmt.Println("avg=", avg)
}

结果:

1.3 第一个golang程序

就是打印hello woeld,这里就不显示了。

1.4.1包的概念

  1. 和python一样,把相同功能的代码放到一个目录,称之为包。
  2. 包可以被其他包引用。
  3. main包是用来生成可执行文件,每个程序只有一个main包。
  4. 包的主要用途是提高代码的可复用性。

1.4.2 包的实战

即如何引用自己的包,具体看回上面1.2.4 Go语言特性-多返回值的例子即可。

二 总结

  • 1)本节主要是先大概了解一下go如何安装环境和相关的语法,如何编译运行,和相关概念等等。

go语言基础-----01-----go语言特性相关推荐

  1. Java 基础-01 Java语言入门

    文章目录 Java 基础-01 Java语言入门 1.计算机基本概念 1.1 计算机概述 1.2 计算机组成 1.3 CPU.内存与硬盘 2.软件基本概念 2.1 软件概述 2.2 人机交互方式 2. ...

  2. 我的全栈之路-C语言基础之C语言概述与开发环境搭建

    我的全栈之路-C语言基础之C语言概述与开发环境搭建 我的全栈之路 1.1 信息技术发展趋势 1.2 浅谈计算机系统架构 1.2.1 计算机系统架构概述 1.2.2 计算机硬件系统 1.2.2 计算机软 ...

  3. 计算机编程c 语言实型数据,C语言-基础教程-C语言实型数据

    C语言-基础教程-C语言实型数据 分类:计算机等级 | 更新时间:2016-07-08| 来源:转载 2.4.1 实型常量 实型常量又称浮点常量,是一个十进制表示的符号实数.符号实数的值包括整数部分. ...

  4. c语言教程变量,C语言-基础教程-C语言常量与变量

    考试大计算机等级站整理: 2.2.1 标识符命名 在C语言中,标识符是对变量.函数标号和其它各种用户定义对象的命名.标识符的长度可以是一个或多个字符.绝大多数情况下,标识符的第一个字符必须是字母或下划 ...

  5. 01_Go语言基础学习_Golang语言特性、环境搭建、第一个Go程序、包

    1. Golang语言特性: 垃圾回收: 1.内存自动回收,再也不需要开发人员管理内存: 2.开发人员专注业务实现,降低了心智负担 : 3.只需要new分配内存,不需要释放 天然并发: 1.从语言层面 ...

  6. C语言基础01——初识C语言

    目录 什么是C语言 第一个C语言程序:HelloWorld 初识数据类型 初识常量.变量 初始字符串.转义字符.注释 初识选择语句.循环语句 初识函数.数组 初识关键字 定义常量和宏 格式化输入输出 ...

  7. OC语言基础 - 01

    OC语言源自于C语言,但是在C语言的基础上增加了不少OC特有的东西.因此有C语言和面向对象语言基础的同学还是可以很快掌握OC语言的. 在OC语言中,使用#import来代替C语言中的#include. ...

  8. C语言基础之C语言程序和函数及system函数的运用

    文章目录 一.C语言基础 (1)c语言程序 1.内容 2.简单c语言程序 (2)函数 1.内容 2.种类 3.函数类型 4.有无返回值类型函数 **"对于无返回类型的"** **& ...

  9. c++语言基础知识,c++语言基础知识汇总.ppt

    <c++语言基础知识汇总.ppt>由会员分享,可在线阅读,更多相关<c++语言基础知识汇总.ppt(68页珍藏版)>请在人人文库网上搜索. 1.1,第二章 C+语言初步,本章主 ...

  10. 学单片机需要多少C语言基础,C语言单片机编程教程

    很多学员和朋友经常找我给他们推荐C语言的书,他们可能想和我当年一样,闷头大干一场,学个几个月的C语言,把C语言吃透,再开始单片机程序开发! 别!别!别! 大家千万别这么干,我当年自学了3个月的C语言, ...

最新文章

  1. android百度api配置,Android Studio 配置使用百度api (附带简单样例)(示例代码)
  2. bootstraptable获取所有数据_一键获取oracle用户下所有表的表名与其数据量
  3. 大数据技术 学习之旅_如何开始您的数据科学之旅?
  4. 动态创建php 类函数或函数
  5. UDP聊天工具的实现
  6. java不重复的随机数_Javascript获取不重复的随机数值
  7. Script error.全面解析
  8. mysql 查询和修改组合_MySql语句大全:创建、授权、查询、修改等
  9. steam遇到错误代码解决方案
  10. 经典算法题1:找出数组中只出现一次的数字,其它数字都出现了两次
  11. 数字证书和证书颁发机构的基础知识
  12. 2015年计算机二级office,2015年计算机二级MSoffice考试资料汇总.doc
  13. OSChina 娱乐弹弹弹——问世间情为何物,直教人生死相许
  14. HTML页面上传图片直接预览
  15. Java 实现顺序表的基本操作
  16. XPE启动蓝屏或FBA反复重启的问题
  17. 区块链之联盟链---认识Fabric
  18. 探店达人专业版盈利模式达人探店盈利模式优势利润在哪里?
  19. 二维码扫描自定义规则思路
  20. 【Leetcode】Number of Islands

热门文章

  1. SQL Server2005安装材料及教程编制
  2. php按序倒放,抖音时光倒流声音不倒放怎么弄?将视频画面倒放而不改变声音
  3. Prepar3d.cfg
  4. Google重返中国?并不是你想要的那个
  5. html让表格不填充,HTML表格不会删除填充
  6. openlayers 地图使用geom空间数据范围内裁剪地图vue项目
  7. python-KNN算法运用练习之分类
  8. jQuery和原生js全选,全不选组件
  9. HFSS谐振腔体分析
  10. 帧率ffmepg 摄像头_ffmpeg4从笔记本摄像头推流rtmp