go语言

go语言特点

纵然是瞬间 提交于 2020-02-26 03:08:10
简介 即达到了静态编译语言的安全和性能,又达到了动态语言开发维护的高效率 go = c+python 既有c静态语言的运行速度,又达到了Python动态语言的快速开发 诞生原因 计算机硬件更新频繁,性能提升很快,主流的编程语言明显低于硬件的发展, 不能合理利用多核CPU的优势提升系统性能 软件的复杂度日益越来越高,维护成本越来越高,目前缺乏一个简介高效的编程语言。 【现有的编程语言:1风格不统一 2计算能力不够 3处理大并发不够好】 企业运行维护很多C/C++项目,C/c++虽然运行速度很快, 但是编译速度很慢,同时还存在内存泄漏的一系列困扰需要解决 从C语言中继承了许多理念 指针 编译方式 基础数据类型等等 引入了包的概念 go语言的包都要归属于一个包,不能单独存在 垃圾回收机制,内存自动回收,不需要开发人员管理 天然并发 从语言层面支持并发,实现简单 goroutine ,轻量级线程,可实现大并发处理,高效利用多核 于CPS并发模型实现 吸收了管道通信机制,形成了C语言特有的管道channel,通过管道,可以实现不同goroute之间的互相通信 函数可以返回多个值 新的创新 切片 延时执行defer 来源: https://www.cnblogs.com/ygjzs/p/11779935.html

Go语言之读取yaml配置文件,转换成struct结构,json形式输出

浪尽此生 提交于 2020-02-26 02:44:54
1、例子1 1.1、yaml文件内容如下: host: localhost:3306 user: root pwd: 123456 dbname: test 1.2、代码如下: //将yaml文件,转换成对象,再转换成json格式输出 package main import ( "encoding/json" "fmt" "gopkg.in/yaml.v2" "io/ioutil" ) //定义conf类型 //类型里的属性,全是配置文件里的属性 type conf struct { Host string `yaml: "host"` User string `yaml:"user"` Pwd string `yaml:"pwd"` Dbname string `yaml:"dbname"` } func main() { var c conf //读取yaml配置文件 conf := c.getConf() fmt.Println(conf) //将对象,转换成json格式 data, err := json.Marshal(conf) if err != nil { fmt.Println("err:\t", err.Error()) return } //最终以json格式,输出 fmt.Println("data:\t", string(data)) } /

19.Go语言基础之并发

感情迁移 提交于 2020-02-25 15:32:04
1.1并发与并行 并发:同一时间段执行多个任务(使用微信和多个朋友聊天) 并行:同一时刻执行多个任务(windows中360在杀毒,同时你也在写代码) Go语言的并发通过goroutine实现。goroutine类似于线程,属于用户态的线程,我们可以根据需要创建成千上万个goroutine并发工作。 goroutine是由Go语言的运行时(runtime)调度完成,而线程是由操作系统调度完成。 Go语言还提供channel在多个goroutine间进行通信。goroutine和channel是Go语言秉承的CSP(Communication Sequential Process)并发模式的重要实现基础。 1.2goroutine 在java/Python中,我们实现并发编程的时候,通常需要自己维护一个线程池,并且需要自己去包装一个又一个的任务,同时需要自己去调度线程执行任务并维护上下文切换,这一切需要耗费很多。 Go语言中的goroutine,类似于线程,但goroutine是由Go的运行时(runtime)调度和管理的。Go程序能够只能的将goroutine中的任务合理的分配到每个CPU。Go语言被称为现代化语言的原因,就是因为Go在语言层面就已经内置了调度和上下文切换的机制。 在Go语言编程中,不需要自己写进程、线程、协程,你的技能只有一个,就是goroutine。 1.2

18.Go语言基础之反射

◇◆丶佛笑我妖孽 提交于 2020-02-25 15:25:33
1.变量的内在机制 Go语言中的变量是分为两部分的: 类型信息:预先定义好的元信息。 值信息:程序运行过程中可动态变化的。 2.反射介绍 在Python中,Java中,都有反射的概念。 反射是"指程序运行期对程序本身进行访问和修改的能力"。 程序在编译时,变量被转换为内存地址,变量名不会被编译器写入到可执行部分。在运行程序时,程序无法获取自身的信息。 支持反射的语言,可以再程序编译期将变量的反射信息,如字段名称、类型信息、结构体信息等正和岛可执行文件中,并给程序提供接口,访问反射信息,这样就可以在程序运行期获取类型的反射信息,并且有能力修改它们。 Go程序在运行期使用reflect包访问程序的反射信息。 上面我们介绍过空接口,空接口可以存储任意类型的变量,那我们怎样知道空接口保存的数据是什么呢?"反射就是在运行时动态的获取一个变量的类型信息和值信息。" 3.reflect包 在Go语言的反射机制中,任何接口都由"一个具体类型"和"具体类型的值"两部分组成。 在Go语言中反射的相关功能由内置的reflect包提供,任意接口值在反射中都可以理解为由reflect.Type和reflect.Value两部分组成,并且reflect包提供了reflect.TypeOf和reflect.ValueOf两个函数来获取任意对象的Value和Type。 3.1TypeOf 在Go语言中

Go语言开发实践规范汇总

半腔热情 提交于 2020-02-23 00:16:21
统一规范篇 合理规划目录 本篇主要描述了公司内部同事都必须遵守的一些开发规矩,如统一开发空间,既使用统一的开发工具来保证代码最后的格式的统一,开发中对文件和代码长度的控制,必须经过go语言自带的检测机制等。 【原则1.1】合理规划目录,一个目录中只包含一个包(实现一个模块的功能),如果模块功能复杂考虑拆分子模块,或者拆分目录。 GOPATH设置 【建议1.2】使用单一的 GOPATH import 规范 【规则1.3.1】在非测试文件(*_test.go)中,禁止使用 . 来简化导入包的对象调用。 【规则1.3.2】禁止使用相对路径导入(./subpackage),所有导入路径必须符合 go get 标准。 【建议1.3.3】建议使用goimports工具或者IDE工具来管理多行import 代码风格 【规则1.4.1】提交代码时,必须使用gofmt对代码进行格式化。 【规则1.4.2】提交代码时,必须使用golint对代码进行检查。 【建议1.4.3】提交代码前,必须使用go vet对代码进行检查。 大小约定 【建议1.5.1】单个文件长度不超过500行。 【建议1.5.2】单个函数长度不超过50行。 【规则1.5.3】单个函数圈复杂度最好不要超过10,禁止超过15。 【规则1.5.4】单行语句不能过长,如不能拆分需要分行写。一行最多120个字符。 【建议1.5.5

Go语言基础之变量和常量

旧街凉风 提交于 2020-02-22 21:20:31
1 为什么需要变量 联想到现实中,任何事物都是变化的,如果想用程序实现对一个事情的描述,那么久的用一些变化的量去描述这个事情中的一些变化的属性,比如说人类的身高、年龄等,这些量都是随着时间变化的,或者是不同的人用不同身高和年龄。所以说,要使用变量去对这些属性进行描述。 变量是程序的基本组成单位。我们都知道程序都是对数据进行处理,那么这些数据在程序运行的过程就是存储在变量中,在Golang语言中一个变量存储一种类型的数据,程序在每次运行时变量中可能存储的是不相同的数据。 2 Golang变量介绍 2.1 变量的概念 在数学概念中,变量(variable)表示没有固定值且可改变的数。从计算机视角来说,变量相当于内存中一段或多段数据存储空间的表示。可以把变量看做是一个房间的门牌号,通过门牌号我们可以找到房间,同样的道理,通过变量名可以访问到变量(值)。 作为静态类型语言,Go变量总是有固定的数据类型,类型决定了变量内存的长度和存储格式。我们只能修改变量值,无法改变类型。 2.2 变量的使用步骤 声明变量(定义变量) 变量赋值 使用变量 在Golang中,既支持先声明变量,后给变量赋值;又支持在声明变量时给变量赋值。 2.3 关键字var定义变量 用关键字var定义变量 var x int //自动初始化为0 var y = false //自动推断为bool类型 一次定义多个变量 var

go语言实现单链表

吃可爱长大的小学妹 提交于 2020-02-22 15:27:04
线性表 包含两种存储方法:顺序存储结构和链式存储结构,其中顺序表的缺点是不便插入与删除数据。 单链表 :每个结点包含两部分:数据域+指针域,上一个结点的指针指向下一结点,依次相连,形成链表。特别注意的是每个链表必须包含 头结点 (数据域一般无意义或者为空,有时用来存储链表长度等等) 下面的代码实现链表的 基本操作 和 辅助操作 ,基本操作指的是插入数据、删除数据、查找数据、求链表长度;而辅助操作指的是创建结点、创建(初始化 )链表、判断是否为空链表。和其他语言不同之处是 Go语言具有垃圾自动回收的特性 ,因此不需要释放指针或内存,后续没有用到的变量Go语言会自动回收。 // 单链表: package main import "fmt" // 创建节点结构/类型 type Node struct { Data interface{} Next *Node } // 创建链表结构 type LList struct { Head *Node Length int // 这里的链表长度不计入头节点 } // a.设计接口: type Method interface { Insert(i int, v interface{}) // 增 Delete(i int) // 删 GetLength() int // 获取长度 Search(v interface{}) int // 查

csv文件操作(go语言)

余生颓废 提交于 2020-02-22 15:25:41
go 语言自带的有 csv 文件读取模块,看起来好像不错,今天玩玩,也算是系统学习go语言的一部分……^_^ 一、写 csv 文件 函数: func NewWriter(w io.Writer) *Writer func (w *Writer) Flush() func (w *Writer) Write(record []string) (err os.Error) func (w *Writer) WriteAll(records [][]string) (err os.Error) 具体见官网: http://golang.org/pkg/csv/#NewWriter 其实写 csv 文件大可不必用这些函数,直接按照规则写入文件就行,不过这里有这些函数,还是写个 demo ,也方便我以后使用: package main import ( "csv" "os" "bytes" "fmt" ) func main(){ fileName := "2.csv" buf := new(bytes.Buffer) r2 := csv.NewWriter(buf) for i:=0;i<10;i++ { s := make([]string,3) s[0] = "user id" s[1] = "name" s[2] = "depart" r2.Write(s) r2.Flush() }

Go语言goroutine调度器初始化(12)

浪子不回头ぞ 提交于 2020-02-21 08:21:12
本文是《Go语言调度器源代码情景分析》系列的第12篇,也是第二章的第2小节。 本章将以下面这个简单的Hello World程序为例,通过跟踪其从启动到退出这一完整的运行流程来分析Go语言调度器的初始化、goroutine的创建与退出、工作线程的调度循环以及goroutine的切换等重要内容。 package main import "fmt" func main() { fmt.Println("Hello World!") } 首先我们从程序启动开始分析调度器的初始化。 在分析程序的启动过程之前,我们首先来看看程序在执行第一条指令之前其栈的初始状态。 任何一个由编译型语言(不管是C,C++,go还是汇编语言)所编写的程序在被操作系统加载起来运行时都会顺序经过如下几个阶段: 从磁盘上把可执行程序读入内存; 创建进程和主线程; 为主线程分配栈空间; 把由用户在命令行输入的参数拷贝到主线程的栈; 把主线程放入操作系统的运行队列等待被调度执起来运行。 在主线程第一次被调度起来执行第一条指令之前,主线程的函数栈如下图所示: 了解了程序的初始状态之后,下面我们正式开始。 程序入口 在Linux命令行用 go build 编译hello.go,得到可执行程序hello,然后使用gdb调试,在gdb中我们首先使用 info files 命令找到程序入口(Entry point

Go语言基础之map

狂风中的少年 提交于 2020-02-20 21:59:08
map概述 哈希表是一种巧妙并且使用的数据结构。它是一个无序的 key-value 对的集合,其中所有的key都是不同的,然后通过给定的key可以在常数时间复杂度内检索、更新或删除对应的value。 Golang中,一个map就是一个哈希表的引用,又称为字段或者关联数组。类似其他编程语言的集合,在编程中是经常使用到。 map的声明 基本语法 var map 变量名 map[keytype]valuetype key的类型 Golang中的map的key可以是很多种类型,比如bool,数字,string,指针,channel,还可以是接口,结构体,数组。key对应的类型必须支持 == 比较运算符的数据类型,所以map可以通过测试key是否相等来判断是否已经存在。 通常key为int、string。 注意:slice,map还有function不可以作为key,因为这几个没法用 == 来判断。 valuetype的类型 valuetype的类型没有任何的限制 通常为:数字(整数,浮点数),string,map,struct。 map声明举例 var a map[string]string var a map[string]int var a map[int]string var a map[string]map[string]string 注意:声明是不会分配内存的