go基础
勤径苦舟
书山有路勤为径,学海无涯苦作舟。只技术分享,非商业行为,我很少看消息,所以你们给我发的消息回的很少。
邮件:920786312@qq.com
微信:zhou920786312
展开
-
go语法--基础42--并发编程--线程模型
Go并发编程-线程模型一、前言:3种线程模型线程的并发执行是有操作系统来进行调度的,操作系统一般都在内核提供对线程的支持。我们在使用高级语言编写程序时候创建的线程是用户线程,根据用户线程与内核线程关系,可以划分为3种线程模型二、3线程模型—1对1模型用户线程与内核线程是1对1当从程序入口点(比如main函数)启动后,操作系统就创建了一个内核进程和用户线程2.1、优点在多处理器上,多个线程可以真正实现并行运行当一个线程由于网络IO等原因被阻塞时候,其他的线程不受影响。2.2、缺原创 2021-07-26 09:27:11 · 280 阅读 · 0 评论 -
go语法--基础40--并发编程--案例3
一、生成器类似于提供了一个服务只是适用于调用不是很频繁的情况1.1、代码package mainimport ( "fmt" "math/rand")//创建随机数的服务func create_rand_server() chan int { out := make(chan int) go func() { for { num := rand.Int() fmt.Println("create_rand_server--->生成随机数num:", num)原创 2021-07-26 09:26:51 · 259 阅读 · 1 评论 -
go语法--基础39--并发编程--案例2
一、并发和并行Go语言为并发编程而内置的上层API基于CSP模型。communicating sequential processes:顺序通信模型Go语言通过安全的通道发送和接受数据以实现同步。一般情况下,一个普通的计算机跑十几二十个线程就有点负载过大了,但是同样这台机器却可以轻松地让成百上千甚至上万个goroutine进行资源竞争。二、goroutinegoroutine是Go并发设计的核心。Goroutine说到底其实就是协程,但是他比线程更小,十几个goroutine可能体现在底层就原创 2021-07-26 09:26:42 · 230 阅读 · 0 评论 -
go语法--基础38--并发编程--案例1
并发案例一、无缓冲:生成者消费者1.1、案例package mainimport ( "fmt" "time")func Producer(p chan<- int) { for i := 0; i < 10; i++ { p <- i fmt.Println("生产者-->商品:", i) }}func Consumer(c <-chan int) { for i := 0; i < 10; i++ { v := <-c原创 2021-07-26 09:26:31 · 137 阅读 · 0 评论 -
go语法--基础37--并发编程--Select
一、介绍每个case 都必须是一个通信所有channel表达式都会被求值如果没有default语句,select将阻塞,直到某个通信可以运行如果多个case都可以运行,select会随机选择一个执行二、 测试2.1、如果多个case都可以运行,select会随机选择一个执行package mainimport ( "fmt")func main() { ch := make(chan int, 1) ch <- 1 select { case <-ch:原创 2021-07-26 09:26:20 · 211 阅读 · 0 评论 -
go语法--基础36--并发编程--sync包
一、WaitGroup用于等待多个goroutine完成后,才能执行下一个动作的业务Add(n)方法把计数器设置为nDone()会将计数器每次减1Wait()函数会阻塞代码运行,直到计数器为0。1.1、使用注意点:计数器不能为负值WaitGroup对象不是引用类型1.2、案例// +build ignorepackage mainimport ( "fmt" "sync" "time")// 这是我们将在每个goroutine中运行的函数。// 注意,等待组必原创 2021-07-26 09:26:04 · 155 阅读 · 0 评论 -
go语法--基础35--并发编程--channel
一、介绍通道(channel)是用来传递数据的一个数据结构。通道可用于两个 goroutine 之间通过传递一个 指定类型 的值来同步运行和通讯。是一种类型安全的管道操作符 <- 用于指定通道的方向,发送或接收。如果未指定方向,则为双向通道。二、读写2.1、 只读管道从通道中读数据 // 从通道中读数据// 从 ch 接收数据,并把值赋给 vv := <-ch 创建只读channelread := make(<-chan int) 创建只原创 2021-07-26 09:25:49 · 163 阅读 · 0 评论 -
go语法--基础41--并发编程--案例4
Go并发编程实践一、控制时间的高并发模型可以测试接口在持续高并发情况下是否有句柄泄露1.1、代码package mainimport ( "runtime" "sync/atomic" "time")//5秒超时var timeout2 = time.Now().Add(time.Second * 5)//cpu数量var cpuNum = runtime.NumCPU()//无缓存var waitForAll = make(chan struct{})//无缓存原创 2021-07-26 09:27:00 · 107 阅读 · 0 评论 -
go语法--基础34--并发编程--Goroutines
一、并发概念Go 语言支持并发,我们只需要通过 go 关键字来开启 goroutine 即可。goroutine 是轻量级线程,goroutine 的调度是由 Golang 运行时进行管理的。类似java的多线程1.1、并发与并行并发:两队人排队接咖啡,两队切换。并行:两个咖啡机,两队人同时接咖啡。二、协程GoroutinesGo 允许使用 go 语句开启一个新的运行期线程, 即 goroutine,以一个不同的、新创建的 goroutine 来执行原创 2021-07-26 09:25:37 · 180 阅读 · 0 评论 -
go语法--基础33--并发概念
一、并发概念Go 语言支持并发,我们只需要通过 go 关键字来开启 goroutine 即可。goroutine 是轻量级线程,goroutine 的调度是由 Golang 运行时进行管理的。类似java的多线程goroutine 语法格式go 函数名( 参数列表 )举例go f(x, y, z)开启一个新的 goroutine:f(x, y, z)Go 允许使用 go 语句开启一个新的运行期线程, 即 goroutine,以一个不同的、新创建的 goroutine原创 2021-07-24 19:36:56 · 111 阅读 · 0 评论 -
go语法--基础32--文档
一、生成文档命令查看文档命令go doc生成文档命令godoc -http :6060帮助命令go help doc 二、生成示例代码1. 示例文件名必须以_test结尾 1. 如:stack_test2. 示例函数必须以Example开头 1. 如:ExampleStack_Pop 1. 表示Stack的Pop函数的示例3. 示例输入必须使用: 1. // Output:4. 可以使用go test命令执行示例文件三、错误处理3.1、‘godoc’ 不是内部或外原创 2021-07-24 19:36:18 · 122 阅读 · 1 评论 -
go语法--基础31--graphviz安装
一、介绍图形呈现辅助,用于绘制DOT语言脚本描述的图形。它也提供了供其它软件使用的函式库。需要图形化呈现PProf的分析结果,就需要安装Graphviz工具包。二 、下载安装包并安装https://graphviz.gitlab.io/_pages/Download/Download_windows.html三 、配置环境变量将graphviz安装目录下的bin文件夹添加到Path环境变量中:D:\Program Files\Graphviz\bin验证dot -ver原创 2021-07-24 19:33:43 · 1301 阅读 · 0 评论 -
go语法--基础30--PProf
一、是什么pprof 是用于可视化和分析性能分析数据的工具pprof 以 profile.proto 读取分析样本的集合,并生成报告并帮助分析数据二、支持什么使用模式Report generation:报告生成Interactive terminal use:交互式终端使用Web interface:Web 界面三、可以做什么3.1、CPU ProfilingCPU 分析,按照一定的频率采集所监听的应用程序 CPU(含寄存器)的使用情况,可确定应用程序在主动消耗 CPU 周期原创 2021-07-24 19:32:33 · 175 阅读 · 1 评论 -
go语法--基础29--测试
一、debug 调试idea 要使用2021版,我最初的2018版就不能调试二、测试通过testing包来进行测试测试范围1. 功能测试2. 压力测试3. 测试代码覆盖率的测试(你写的测试用例覆盖了多少代码)。2.1、Golang的测试规矩关键点说明导入需要的包import testing执行命令go test file_test.go测试文件命名必须以_test.go结尾功能测试的用例函数必须以Test开头 且 后头跟着的函数名不能以小原创 2021-07-24 19:29:39 · 257 阅读 · 0 评论 -
go语法--基础28--面向对象--结构
一、结构1.1、结构的创建案例package mainimport "fmt"//定义结构type treeNode struct { value int left, right *treeNode}func main() { var root treeNode // 构建 value=3,2,1的节点 root = treeNode{value: 3} root.left = &treeNode{value: 2} root.left.left原创 2021-07-24 19:27:06 · 106 阅读 · 1 评论 -
go语法--基础27--面向对象--扩展已有的类型
一、扩展已有的类型1.1、使用组合举例:别人的包只有打印最左边的节点,而我们的需求是要打印最右边的节点别人的代码package treeimport "fmt"//定义结构type TreeNode struct { Value int Left, Right *TreeNode}//打印左边的节点func PrintFirstNode(node TreeNode) { leftNode := node.Left if (leftNode != nil) {原创 2021-07-24 19:25:31 · 252 阅读 · 1 评论 -
go语法--基础26--面向对象--封装和包
一、封装和包1.1、封装1.2、包main函数必须在main包中1.3、案例原创 2021-07-24 19:23:41 · 101 阅读 · 0 评论 -
go语法--基础25--go mod的使用
go mod的使用一、介绍是一种依赖版本管理方式估计 go 之后的版本都是用 go mod 来管理了,gopath 模式会被淘汰二、常用命令2.1、go mod help查看帮助2.2、go mod init<项目模块名称>初始化模块,会在项目根目录下生成 go.mod 文件。这里为了测试,我们先删掉go.mod 文件go mod init test2.3、go get增加(下载)依赖切换依赖版本2.3.1、 增加(下载)依赖go原创 2021-07-24 19:22:30 · 401 阅读 · 1 评论 -
go语法--基础24--字符和字符串
一、字符和字符串package mainimport ( "fmt" "unicode/utf8")func main() { var str = "hello世界" println("str:", str) fmt.Println("--------转字节---------") var arrB = []byte(str) for _, v := range arrB { fmt.Printf("%X ", v) } fmt.Println() fmt.Prin原创 2021-07-24 19:19:34 · 84 阅读 · 0 评论 -
go语法--基础23--查看接口变量
一、切片扩展案例package mainimport "fmt"func main() { // 创建切片 arr := []int{0, 1, 2, 3, 4, 5, 6, 7} s1 := arr[2:6]; s2 := arr[3:6]; fmt.Println("arr:", arr) fmt.Println("s1:", s1) fmt.Println("s2:", s2) fmt.Println("-------------切片是对数组的引用-----------原创 2021-05-06 14:09:17 · 153 阅读 · 0 评论 -
go语法--基础21--接口组合
一、语言的基础组成有以下几个部分包声明引入包函数变量语句 & 表达式注释二、案例说明package mainimport "fmt"func main() { /* 这是我的第一个简单的程序 */ fmt.Println("Hello, World!")}2.1、让我们来看下以上程序的各个部分001、package main定义包名。你必须在源文件中非注释的第一行指明这个文件属于哪个包,如:package main。package main表示原创 2021-04-25 20:14:09 · 234 阅读 · 0 评论 -
go语法--基础20--错误处理
一、Go 标记关键字标识符常量字符串符号案例fmt.Println("Hello, World!")6 个标记是(每行一个):1. fmt2. .3. Println4. (5. "Hello, World!"6. )二、行分隔符在 Go 程序中,一行代表一个语句结束。每个语句不需要像 C 家族中的其它语言一样以分号 ; 结尾,因为这些工作都将由 Go 编译器自动完成。如果你打算将多个语句写在同一行,它们则必须使用 ; 人为区分,但在实际开发中我们并不鼓励这原创 2021-04-25 20:14:01 · 104 阅读 · 1 评论 -
go语法--基础19--接口
一、数据类型用于声明函数和变量。数据类型的出现是为了把数据分成所需内存大小不同的数据,编程的时候需要用大数据的时候才需要申请大内存,就可以充分利用内存。二、数据类型–布尔型布尔型的值只可以是常量 true 或者 false。一个简单的例子:var b bool = true。三、数据类型–数字类型整型int浮点型float32float64支持复数位的运算采用补码3.1、整型3.1.1、uint8无符号 8 位整型 (0 到 255)3.1原创 2021-04-25 20:13:53 · 142 阅读 · 1 评论 -
go语法--基础22--常用接口
一、并发概念Go 语言支持并发,我们只需要通过 go 关键字来开启 goroutine 即可。goroutine 是轻量级线程,goroutine 的调度是由 Golang 运行时进行管理的。类似java的多线程goroutine 语法格式go 函数名( 参数列表 )举例go f(x, y, z)开启一个新的 goroutine:f(x, y, z)Go 允许使用 go 语句开启一个新的运行期线程, 即 goroutine,以一个不同的、新创建的 goroutine原创 2021-04-25 20:14:22 · 153 阅读 · 0 评论 -
go语法--基础18--类型转换
一、错误处理Go 语言通过内置的错误接口提供了非常简单的错误处理机制。error类型是一个接口类型,定义如下type error interface { Error() string}我们可以在编码中通过实现 error 接口类型来生成错误信息。函数通常在最后的返回值中返回错误信息。使用errors.New 可返回一个错误信息:func Sqrt(f float64) (float64, error) { if f < 0 { return 0, e原创 2021-04-22 21:17:52 · 107 阅读 · 1 评论 -
go语法--基础17--递归函数
一、介绍Go 语言提供了另外一种数据类型即接口接口把所有的具有共性的方法定义在一起,任何其他类型只要实现了这些方法就是实现了这个接口定义/* 定义接口 */type interface_name interface { method_name1 [return_type] method_name2 [return_type] method_name3 [return_type] ... method_namen [return_type]}/* 定义结构体原创 2021-04-22 21:17:28 · 122 阅读 · 0 评论 -
go语法--基础16--结构体
一、类型转换将一种数据类型的变量转换为另外一种类型的变量语法type_name(expression)type_name:类型expression:表达式。举例package mainimport "fmt"func main() { var sum int = 17 var count int = 5 var v1 float32 fmt.Println("---------转换前---------") fmt.Printf("sum 的值为: %f\n", sum原创 2021-04-22 21:16:50 · 97 阅读 · 0 评论 -
go语法--基础15--Map(集合)
一、语法格式func recursion() { recursion() /* 函数调用自身 */}func main() { recursion()}运行的过程中调用自己阶乘package mainimport "fmt"//阶乘方法func jc(n int) (result int) { if (n > 0) { result = n * jc(n-1) return result } return 1}func main() { v原创 2021-04-22 21:16:13 · 108 阅读 · 0 评论 -
go语法--基础14--Range
一、介绍是一种无序的键值对的集合。Map 是一种集合,可以像迭代数组和切片那样迭代它。Map 是无序的,我们无法决定它的返回顺序定义 Map可以使用内建函数 make 也可以使用 map 关键字来定义 Map:二、定义 Map使用make使用map// 声明变量,默认 map 是 nilvar map_variable map[key_data_type]value_data_type// 使用 make 函数map_variable := make(map[原创 2021-04-22 21:15:43 · 150 阅读 · 0 评论 -
go语法--基础13--切片
范围(Range)一、介绍range 关键字用于 for 循环中迭代数组(array)、切片(slice)、通道(channel)或集合(map)的元素。在数组和切片中它返回元素的索引和索引对应的值,在集合中返回 key-value 对。和java的迭代器很像案例package mainimport "fmt"func main() { //这是我们使用range去求一个slice的和。使用数组跟这个很类似 nums := []int{2, 3, 4} sum := 0 fmt原创 2021-04-22 21:12:56 · 163 阅读 · 0 评论 -
go语法--基础12--指针--12
一、切片(Slice)切片是对数组的抽象。Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go 中提供了一种灵活,功能强悍的内置类型切片(“动态数组”),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。类似java的list二、定义切片var identifier []type切片不需要说明长度。或使用 make() 函数来创建切片var slice1 []type = make([]type, len)也可以简写为slice1 := m原创 2021-04-21 22:59:15 · 110 阅读 · 0 评论 -
go语法--基础11--数组
一、结构体介绍(java中的类)结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。二、定义结构体结构体的格式type struct_variable_type struct { member definition member definition ... member definition}结构体类型用于变量声明,语法格式如下variable_name := structure_variable_type {value1, value2...valuen}原创 2021-04-21 14:53:30 · 182 阅读 · 0 评论 -
go语法--基础10--函数
一、指针一个指针变量指向了一个值的内存地址。指针声明var var_name *var-typevar-type:指针类型var_name:指针变量名* 号用于指定变量是作为一个指针举例var ip *int /* 指向整型*/var fp *float32 /* 指向浮点型 */二、指针使用流程定义指针变量。为指针变量赋值。访问指针变量中指向地址的值在指针类型前面加上 * 号(前缀)来获取指针所指向的内容举例package maini原创 2021-04-20 22:15:17 · 144 阅读 · 0 评论 -
go语法--基础09--循环语句
一、 数组数组是具有相同唯一类型的一组已编号且长度固定的数据项序列类型可以是任意的原始类型,举例如下整型字符串自定义类型数组元素可以通过索引(位置)来读取(或者修改索引从 0 开始二、声明数组语法var variable_name [SIZE] variable_type举例–定义数组 balance 长度为 10 类型为 float32:var balance [10] float32三、初始化数组以下演示了数组初始化:var balance = [5]flo原创 2021-04-20 22:14:47 · 244 阅读 · 0 评论 -
go语法--基础08--条件语句
一、变量作用域作用域为已声明标识符所表示的常量、类型、变量、函数或包在源代码中的作用范围。变量可以在三个地方声明:局部变量:函数内定义的变量全局变量:函数外定义形式参数:函数定义中的变量全局变量与局部变量名称可以相同,但是函数内的局部变量会被优先考虑。二、局部变量函数内定义的变量作用域只在函数体内参数和返回值变量也是局部变量。案例package mainimport "fmt"func main() { //声明局部变量 var a, b in原创 2021-04-20 22:13:55 · 110 阅读 · 0 评论 -
go语法--基础07--运算符
一、介绍函数是基本的代码块,用于执行一个任务。Go 语言最少有个 main() 函数。可以通过函数来划分不同功能,逻辑上每个函数执行的是指定的任务。函数声明告诉了编译器函数的名称,返回类型,和参数。二、定义格式如下:func function_name( [parameter list] ) [return_types] { 函数体}格式解析:func:函数由 func 开始声明function_name:函数名称函数名和参数列表一起构成了函数签名。p原创 2021-04-20 11:23:24 · 95 阅读 · 0 评论 -
go语法--基础06--常量
一、 for 循环语法Go 语言的 For 循环有 3 种形式for init; condition; post { } // for ; i <= 10; {}for condition { }//for(;条件;) for { }语法说明init: 一般为赋值表达式,给控制变量赋初值;参数是可选condition: 关系表达式或逻辑表达式,循环控制条件;post: 一般为赋值表达式,给控制变量增量或减量。参数是可选for语句执行过程如下:先原创 2021-04-20 11:22:07 · 91 阅读 · 0 评论 -
go语法--基础05--变量
一、介绍下图展示了程序语言中条件语句的结构注意:Go 没有三目运算符,所以不支持 ?: 形式的条件判断。Go 语言提供了以下几种条件判断语句二、 if,else语句单ifif 布尔表达式 { // 在布尔表达式为 true 时执行 }if…elseif 布尔表达式 { // 在布尔表达式为 true 时执行 } else { // 在布尔表达式为 false 时执行 }if 语句嵌套if 布尔表达式 1 { // 在布尔表达式 1 为 true 时执行原创 2021-04-20 11:20:49 · 151 阅读 · 0 评论 -
go语法--基础04--数据类型
一、运算符算术运算符关系运算符逻辑运算符位运算符赋值运算符其他运算符二、算术运算符案例1package mainimport ( "fmt")func main() { var a int = 10 var b int = 20 var c int c = a + b fmt.Printf("第一行 c 的值为 %d\n", c ) c = a - b fmt.Printf("第二行 c 的值为 %d\n", c ) c = a * b fmt.Pr原创 2021-04-20 11:19:32 · 84 阅读 · 0 评论 -
go语法--基础03--语言结构
一、介绍在程序运行时,不会被修改的量。常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型。常量的定义格式:const identifier [type] = value你可以省略类型说明符 [type],因为编译器可以根据变量的值来推断其类型。显式类型定义: const b string = "abc"隐式类型定义: const b = "abc"多个相同类型的声明可以简写为const c_name1, c_name2 = value1, value2案例原创 2021-04-20 11:17:28 · 109 阅读 · 0 评论