go语言

浅尝Go语言GC

巧了我就是萌 提交于 2020-04-06 06:45:15
大家好,我是小栈君,因为个人和工作的缘故,所以拖更了一点时间,但是关于拖更的内容小栈君会在后续的时间中补回来,还希望大家继续支持和关注小栈君。当然,在国内疫情稍微减缓的情况下,小栈君在这里也多说两句,在非常时刻,我们应当保持警惕,清洗手,多通风,避免人群聚集,希望大家平安健康, 闲话不多说,我们直接进入正题,今天给大家分享的事关于Go语言中的GC,本期的分享并没有多少代码可言,都是一些理论知识,希望大家耐心且看完,因为能力有限,所以这边小栈君会尽量用大白话来进行叙述,如有错误之处,还请多多谅解。 GC含义: 对于编程有经验的同学应该都知道GC,他的英文全称是garbage collector ,也就是我们通常所说的垃圾收集器。其实Go语言的垃圾收集器是相对于C++语言有十分重要的改进,针对于开发过C++的同学或是大学的时候学习的C++知识而言的话,我们应该知道在C++语言中创建对象分配空间后需要手动释放,针对于手动释放的情况下,有时候我们很难去进行判断什么时候需要,在编程的难度方面无疑是大大增加了难度。 GO语言GC的发展: Go语言的GC问题,其实经历过多个版本的迭代,并非一蹴而就,就像我们做编程的一样并非一生下来就会。他也是经历过一定时间的发展史。在1.1版本的时候Go语言采用的STW也就是stop the word,也就是我们常说的标记清扫的方式

go语言系统-从文件操作到单元测试

十年热恋 提交于 2020-04-05 20:16:39
目录 文件操作 输入流和输出流 打开文件和关闭文件 使用的函数和方法 案例演示 读文件操作应用案例 写文件操作应用案例 判断文件是否存在 文件编程应用实例 拷贝文件 统计英文、数字、空格和其它字符数量 命令行参数 举例说明 flag包用来解析命令行参数 Json Json基本介绍 应用场景 Json数据格式说明 Jsnon数据在线解析 Json的序列化 应用案例 Json的反序列化 应用案例 单元测试 先看一个需求 传统的方法 传统方法的缺点分析 单元测试 基本介绍 快速入门 单元测试快速入门总结 综合案例 单元测试综合案例要求: 代码区 文件操作 文件是数据源(保存数据的地方)的一种,比如经常使用的word文档,txt文档,excel文件...都是文件。文件最主要的作用就是保存数据,它即可以保存一张图片,也可以保持视频,声音... 输入流和输出流 文件在程序中是以流的形式来操作的 流:数据在数据源(文件)和程序(内存)之间经历的路径 输入流:数据从数据源(文件)到程序(内存)的路径 输出流:数据从程序(内存)到数据源(文件)的路径 os.File封装所有文件相关操作,File是一个结构体 ​ 后面操作文件,会经常使用到os.File结构体 打开文件和关闭文件 使用的函数和方法 案例演示 import ( "fmt" "os" ) func main() { //打开文件 /

Go语言中的fmt.Scan使用说明

ⅰ亾dé卋堺 提交于 2020-04-05 16:32:28
在go语言中如果想获取用户输入,会用到Scan方法。scan在go语言中有很多中,今天介绍一下他们的使用方法和不同点。 和print类似,scan也分为三大类: Scan、Scanf和Scanln: 从标准输入os.Stdin读取文本(从终端获取数据) Fscan、Fscanf、Fscanln: 从指定的io.Reader接口读取文本(通用) Sscan、Sscanf、Sscanln: 从一个参数字符串读取文本(从字符串string获取数据) Scan: 语法: func Scan(a ...interface{}) (n int, err error) 例: func main() { var str string fmt.Printf("请输入内容:") fmt.Scan(&str) fmt.Printf("str: %s",str) } /* scan将碰到第一个空格或换行符之前的内容赋值给变量。如果 scan中有多个变量,变量值用空格或换行符分割。所以换行和空 格是不能存储到变量内的。 */ Scanf: 语法:func Scanf(format string, a ...interface{}) (n int, err error) 例: func main() { var ( name string age int ) fmt.Printf("请输入内容:") fmt

Go_认识golang

徘徊边缘 提交于 2020-04-04 18:52:08
官方地址:https://golang.org/ 什么是Go?   支持并发、垃圾回收的编译型 系统编程语言 Go语言有哪些特点?   1. 类型安全 和 内存安全   2. 以非常直观和极低代价的方案实现高并发   3. 高效的垃圾回收机制   4. 快速编译   5. 为多核计算机提供性能提升的方案   6. UTF-8编码支持 Go存在价值是什么?   以软件工程为目的的语言设计 Go重要环境变量设置有哪些?    3 个   GOROOT      // go语言解释器所在路径   GOPATH      // go项目的入口目录,也称go工作目录   GOBIN       // go install编译存放路径 推荐使用IDE:   https://www.jetbrains.com/go/,大大减少GO语言环境配置文件,节省大量细枝末节的配置时间 项目目录下需要建立哪些目录?   -- bin    //存放编译后生成的可执行文件   -- src     // 存放编译后生成的包文件   -- pkg    // 存放项目源码 在Go项目中,有哪些需要具备的基础点?   //   在Go中, 用双斜线作为注释   /**/  多行注释,注释 和 html、css一样    关键字:     分支循环  if, else, for, goto, break,

go语言学习之路三:切片

柔情痞子 提交于 2020-04-03 18:41:44
  前面讲了变量的有关知识,这里对于其他的数据类型就不多作介绍,(和C差不多),因此重点来讨论下切片。 一、切片是引用类型,这里要稍微介绍两个概念:值类型,构造类型和引用类型   1、值类型:是一种由类型的实际值表示的数据类型。如果向一个变量分配值类型,则该变量被附以全新的值的副本,go语言的值类型包括布尔型,整型,浮点型,复数型。   2、构造类型:和c中差不多,包括数组,结构体和字符串   3、引用类型:由类型的实际值引用表示的数据类型。如果为某个变量分配一个引用类型,则该变量将应用原始值,不创建任何副本。go语言引用类型包括切片、字典和通道。   切片通常用来实现变长数组,原型定义如下: struct Slice {   byte *array;   unit32 len;   unit32 cap; }; 它抽象为以下三个部分:   指向被引用的底层数组的指针;切片中元素的个数;切片分配的存储空间。 二、切片的创建和声明   1、基于底层数组创建切片   var array1=[10]int{1,2,3,4,5,6,7,8,9,10}   var slice[]int   slice1=array1[:5]   slice2=array1[5:]   slice3=array1[:]   slice4=array1   slice5=array1[0:len(array1)

你知道GO语言的关键特性吗?

久未见 提交于 2020-04-01 13:56:07
小编今天就给大家讲一下go语言的关键特性,GO语言之所以厉害,是因为它在服务端的开发中,总能抓住程序员的痛点,以最直接、简单、高效、稳定的方式来解决问题。这里我们并不会深入讨论GO语言的具体语法,只会将语言中关键的、对简化编程具有重要意义的方面介绍给大家,跟随大师们的脚步,体验GO的设计哲学。想要 学习go语言 和 go语言入门 的小伙伴就要好好看看了。 GO语言的关键特性主要包括以下几方面: 并发与协程 基于消息传递的通信方式 丰富实用的内置数据类型 函数多返回值 defer机制 反射(reflect) 高性能HTTP Server 工程管理 编程规范 在当今这个多核时代,并发编程的意义不言而喻。当然,很多语言都支持多线程、多进程编程,但遗憾的是,实现和控制起来并不是那么令人感觉轻松和愉悦。Golang不同的是,语言级别支持协程(goroutine)并发(协程又称微线程,比线程更轻量、开销更小,性能更高),操作起来非常简单,语言级别提供关键字(go)用于启动协程,并且在同一台机器上可以启动成千上万个协程。 对比JAVA的多线程和GO的协程实现,明显更直接、简单。这就是GO的魅力所在,以简单、高效的方式解决问题,关键字go,或许就是GO语言最重要的标志。 基于消息传递的通信方式 在异步的并发编程过程中,只能方便、快速的启动协程还不够。协程之间的消息通信,也是非常重要的一环,否则

Go语言入门(八)线程安全&锁

寵の児 提交于 2020-04-01 11:50:37
线程安全&锁 定时器&一次性定时器 定时器 func main() { ticker := time.NewTicker(time.Second) //ticker.C是一个只读的chan,所以直接可以使用for range读取 for v := range ticker.C { fmt.Printf("hello %v\n",v) //按秒输出 } } 一次性定时器 func main() { select { case <- time.After(time.Second): fmt.Printf("after\n") } } 超时控制 func queryDb(ch chan int) { //模拟DB查询 time.Sleep(time.Second) //模拟查询1秒 ch <- 100 } func main() { ch := make(chan int) go queryDb(ch) //异步查询 t := time.NewTicker(time.Second*3) //定时3秒 select { case v:= <- ch: fmt.Printf("result:%v\n",v) // case <- t.C: fmt.Printf("timeout\n") } } 异常处理: 记录异常,不至于进程被panic等问题 func main() { go func()

go语言学习(基本数据类型)

感情迁移 提交于 2020-04-01 04:32:03
值类型: int/uint :根据系统确定是32还是64位。此外还有int8/uint8、int16/uint16、int32/uint32、int64/uint64 byte:字节型,相当于uint8。 float:go语言中没有double型,因为已经有了float32/float64,分别精确到小数点后面7、15位。 uintptr:保存32bit或64bit指针,应该是保存指针的地址 数组array: 数组是有类型的,比如var a [10]int= [10]int{1},a的类型为[10]int。 数组之间可以比较相等==或者不相等(!=),前提是类型相同。如果数组间类型相同且内容依次都一致,那么两个数组相等;如果两个数组类型相同,内容不一致,那么数组不相等。 数组间赋值是值拷贝,会拷贝整个数组的所有元素给另一个数组,而不是引用拷贝,这点和C很不一样!!! string 有地方说string是不可变的。这里要从string的内部结构说起: 1 type StringHeader struct { 2 Data uintptr 3 Len int 4 } string内部是一个指向某块内存的指针,加上内存块的长度。这里说的string不可变指的是uintptr指向的内存块的内容不可变,但是其指向可以变,用C语言描述一下就是: const T *uintptr; struct

Go语言之模板语法

放肆的年华 提交于 2020-03-31 11:12:49
1 package main 2 3 import ( 4 "html/template" 5 "math/rand" 6 "net/http" 7 "time" 8 ) 9 10 func process(w http.ResponseWriter, r *http.Request) { 11 t := template.Must(template.ParseFiles("tmpl.html")) //解析制定文件 生成模板对象 12 /* 13 rand.Intn () 函数是个伪随机函数,不管运行多少次都只会返回同样的随机数,因为它默认的资源就是单一值, 14 所以必须调用 rand.Seed (), 并且传入一个变化的值作为参数,如 time.Now().UnixNano() , 就是可以生成时刻变化的值. 15 */ 16 rand.Seed(time.Now().Unix()) 17 t.Execute(w, rand.Intn(10) > 5) //返回为bool值 18 19 //t.Execute(w,"hello world") //利用数据进行渲染 写入w 20 //如果是模板集合则调用下面的方法对指定模板进行渲染 21 //t.ExecuteTemplate(w,"tmpl.html","helloworld") 22 } 23 24 //迭代 25

Go语言入门(七)goroutine和channel

你离开我真会死。 提交于 2020-03-30 20:46:20
goroutine和channel goroutine 多线程 func hello() { //fmt.Printf("Hello Goroutine!!\n") for i:=0;i<100;i++ { fmt.Printf("hello:%d\n",i) time.Sleep(time.Millisecond) } } func main() { go hello() //启动了一个独立的线程,使其与下面的代码交替执行,使之成为一个多线程 //fmt.Printf("main function\n") for i:=0;i<100;i++ { fmt.Printf("main:%d\n",i) time.Sleep(time.Millisecond) } time.Sleep(time.Second) //修复代码,使得主线程退出的时候子线程能执行 } 多个goroutine func nunmers() { for i :=0;i<=5;i++ { time.Sleep(time.Millisecond*250) fmt.Printf("%d\n",i) } } func chars() { for i:='a';i<='e';i++ { time.Sleep(time.Millisecond*400) fmt.Printf("%c\n",i) } } func main(