go语言

Go语言基础之网络编程

♀尐吖头ヾ 提交于 2019-12-20 12:46:23
现在我们几乎每天都在使用互联网,我们前面已经学习了如何编写Go语言程序,但是如何才能让我们的程序通过网络互相通信呢?本章我们就一起来学习下Go语言中的网络编程。 关于网络编程其实是一个很庞大的领域,本文只是简单的演示了如何使用net包进行TCP和UDP通信。如需了解更详细的网络编程请自行检索和阅读专业资料。 互联网协议介绍 互联网的核心是一系列协议,总称为”互联网协议”(Internet Protocol Suite),正是这一些协议规定了电脑如何连接和组网。我们理解了这些协议,就理解了互联网的原理。由于这些协议太过庞大和复杂,没有办法在这里一概而全,只能介绍一下我们日常开发中接触较多的几个协议。 互联网分层模型 互联网的逻辑实现被分为好几层。每一层都有自己的功能,就像建筑物一样,每一层都靠下一层支持。用户接触到的只是最上面的那一层,根本不会感觉到下面的几层。要理解互联网就需要自下而上理解每一层的实现的功能。[osi七层模型] 如上图所示,互联网按照不同的模型划分会有不用的分层,但是不论按照什么模型去划分,越往上的层越靠近用户,越往下的层越靠近硬件。在软件开发中我们使用最多的是上图中将互联网划分为五个分层的模型。 接下来我们一层一层的自底向上介绍一下每一层。 物理层 我们的电脑要与外界互联网通信,需要先把电脑连接网络,我们可以用双绞线、光纤、无线电波等方式。这就叫做”实物理层”

go语言事件响应系统简述

眉间皱痕 提交于 2019-12-19 15:22:40
事件响应系统是一个提供了事件注册,事件调用与一体的系统,能让上层应用和底层业务实现解耦,实现分层部署。上层应用通过注册自己感兴趣的事件(一般传递事件名字),在适时的使用调用事件函数获取返回的信息。而底层实现就是事件注册系统,则提供了如何注册事件响应函数,如何调用的实现细节。 package main import "fmt" //创建一个事件响应map映射,事件名-事件函数切片 //每个事件函数传递2个int64变量,返回bool和错误值 var evmap=map[string][]func(a,b int64)(bool,error){} //注册事件,传递事件名,以及1个事件函数 func RegEv(name string,newf func(a,b int64)(bool,error)) { funclist:=evmap[name]//从map里获取事件函数切片 funclist=append(funclist,newf) //向切片里添加新的事件函数 evmap[name]=funclist //保存到map } //删除事件,传递事件名即可 func DelEv(name string)(bool,error){ delete(evmap,name)//从map里删除一个事件 return true,nil } //调用事件,传递事件名

Go语言特性介绍

谁说胖子不能爱 提交于 2019-12-19 15:18:02
采用goroutine的方式使多线程编写更加容易、代码可读性更好,可以简单理解为订阅者发布者模式,设计类似于unix管道通信模式, 对于消息队列编程有了解的话很容易理解goroutine的处理模式。 能直接编译成二进制文件没有第三方依赖,因为go是静态编译,包含自己runtime,相对于c会大一些, 但相对java 这种依赖虚拟器的语言编译后的文件小的多。对于docker环境更小的镜像意味着更快的启动速度。 语言简洁高效,相对于python ruby编码负担没有增加多少,运行效率却有大幅度的提升。 golang对新人友好,学习负担小,语法简单,没有多余的语法糖,学习速度快。 c语言易学难用,go易学相对好用,学习和使用达到一个不错的价值平衡。学习和收益比很高,是一个性价比很好的语言。 go难做坏事,即使新手的代码也不至于对代码体系结构造成大的危害,相对对于java这类依赖于框架的语言,如果对框架和复杂语言特性没有深入理解,很容易写出破坏性代码。 golang内置gc,gc也是为了对程序员友好,减少考虑销毁对象的编码负担,保证内存安全。 golang支持跨平台,可以跨平台编译,跨平台运行,支持各种主流软硬件环境。 golang的编译速度飞快,编译不等待,甚至可以替代python等脚本语言,做运维脚本使用。 对系统资源要求非常低,节省服务器,用户可以使用廉价的树莓派作为服务器。

go语言字符串的处理与json转换

隐身守侯 提交于 2019-12-19 12:58:28
1 字符串的处理 可以通过Go标准库中的strings和strconv两个包中的函数进行相应的操作 1 字符串的操作 1 func Contains(s, substr string) bool 2 字符串s中是否包含substr,返回bool值 package main import ( "fmt" "strings" ) //1 func Contains(s, substr string) bool //字符串s中是否包含substr,返回bool值 func main() { fmt.Println(strings.Contains("hello","llo")) } //2 func Join(a []string, sep string) string //字符串链接,把slice a通过sep链接起来 func main() { s := []string{"abc", "456", "999"} fmt.Println(strings.Join(s, "** ")) } //3 func Index(s, sep string) int //在字符串s中查找sep所在的位置,返回位置值,找不到返回-1 func main() { fmt.Println(strings.Index("chicken", "ken")) } //4 func Repeat(s

GO语言学习:代码拆分(包级私有和公共)

老子叫甜甜 提交于 2019-12-19 12:54:43
1.把一个文件拆分为多个(同级目录)   为了便于理解,在此处用例子说明:   在工作区下新建一个文件夹q0,在此文件夹中,   使用命令vim demo0.go,写入以下代码     package main     import "flag"     var name string     var name1 string     func init(){       flag.StringVar(&name,"name","everyone","The greeting object.")       flag.StringVar(&name1,"name1","everyone","The greeting object.")     }     func main(){       flag.Parse()       hello(name)       showMsg(name1)     }   保存。   使用命令 vim demo0_lib.go,输入以下代码     package main     import "fmt"     func hello(name string){       fmt.Printf("Hello,%s!\n",name)     }     func showMsg(name string){       fmt.Printf(

进程、线程、轻量级进程、协程和go中的Goroutine 那些事儿

橙三吉。 提交于 2019-12-19 05:07:48
电话面试被问到go的协程,曾经的军伟也问到过我协程。虽然用python时候在Eurasia和eventlet里了解过协程,但自己对协程的概念也就是轻量级线程,还有一个很通俗的红绿灯说法:线程要守规则,协程看到红灯但是没有车仍可以通行。现在总结各个资料,从个人理解上说明下 进程 线程 轻量级进程 协程 go中的goroutine 那些事儿。 一、进程 操作系统中最核心的概念是进程,分布式系统中最重要的问题是进程间通信。 进程 是“程序执行的一个实例” ,担当分配系统资源的实体。进程创建必须分配一个完整的独立地址空间。 进程切换 只发生在内核态,两步:1 切换页全局目录以安装一个新的地址空间 2 切换内核态堆栈和硬件上下文。 另一种说法类似:1 保存CPU环境(寄存器值、程序计数器、堆栈指针)2修改内存管理单元MMU的寄存器 3 转换后备缓冲器TLB中的地址转换缓存内容标记为无效。 二、线程 书中的定义:线程是进程的一个执行流,独立执行它自己的程序代码。 维基百科: 线程 ( 英语 : thread )是 操作系统 能够进行运算 调度 的最小单位。 线程上下文一般只包含CPU上下文及其他的线程管理信息。线程创建的开销主要取决于为线程堆栈的建立而分配内存的开销,这些开销并不大。线程上下文切换发生在两个线程需要同步的时候,比如进入共享数据段。切换只CPU寄存器值需要存储

go语言浅析二叉树

自作多情 提交于 2019-12-19 04:47:26
Hello,各位小伙伴大家好,我是小栈君,今天给大家带来的分享是关于关于二叉树相关的知识点,并用go语言实现一个二叉树和对二叉树进行遍历。 我们主要针对二叉树的概念,go实战实现二叉树的前序遍历、中序遍历、后序遍历。 二叉树概念 在计算机科学领域内,二叉树代表的是具有两个节点的树形结构,通常子树被称作为“左子树”,右边的被称作为“右子树”。二叉树通常的应用于实现二叉查找树和二叉堆。 例如上述图片中,我们就制定了一个二叉树,其中d、e、f称作a树的叶子节点。 [叶子结点是离散数学中的概念。一棵树当中没有子结点(即度为0)的结点称为叶子结点,简称“叶子”。 叶子是指出度为0的结点,又称为终端结点] b和c 作为树a的孩子结点,b和a因为作为一个根a的孩子,所以他们的称呼为兄弟结点。其实总结一点就是关于二叉树各个结点的称呼其实和我们在家庭中,对于各个亲戚长辈的称呼类似。 在百度百科中也归纳除了关于二叉树的分类 一棵深度为k,且有2^k-1个结点的二叉树,称为满二叉树。这种树的特点是每一层上的结点数都是最大结点数。而在一棵二叉树中,除最后一层外,若其余层都是满的,并且或者最后一层是满的,或者是在右边缺少连续若干结点,则此二叉树为完全二叉树。 具有n个结点的完全二叉树的深度为floor(log2n) 1。深度为k的完全二叉树,至少有2k-1个叶子结点,至多有2k-1个结点。

Go编程基础(介绍和安装)

十年热恋 提交于 2019-12-19 03:03:15
Michaelhbjian 2018.10.07 19:41 字数 892 阅读 317 评论 0 喜欢 0 Go (又称 Golang [ 3] )是 Google 开发的一种 静态 强类型 、 编译型 、 并发型 ,并具有 垃圾回收功能 的 编程语言 。来自维基百科 1.什么是Go语言? image.png Go是一门并发支持、垃圾回收和编译型系统编译语言,旨在创造一个门具有在静态编译语言的高性能和动态语言的高效开发之间拥有良好平衡点的一门编程语言。 Go语言是Rob Pike以及Ken Thompson于2007年9月开始设计的,Go是基于 Inferno 操作系统所开发的。[ 4] Go于2009年11月正式宣布推出,成为开放源代码项目,并在 Linux 及 Mac OS X 平台上进行了实现,后来追加了Windows系统下的实现。(这个类似土拨鼠的logo是由Rob Pike 的妻子 Renee French 绘制的) 2. Go语言的优点 Go语言的价值: Go在谷歌:以软件工程为目的的语言设计 Go的主要特点有如下几点: 1、类型安全和内存安全 2、以非常直观和极低代价的方案实现高并发 3、高效的垃圾回收机制 4、快速编译(同时解决了C语言中头文件太多的问题) 5、为多核计算机提供性能提升的方案 3.Go语言的项目架构 Go语言的工作目录如下表,根据约定,

Go语言基础之接口

懵懂的女人 提交于 2019-12-18 22:56:31
接口(interface)定义了一个对象的行为规范,只定义规范不实现,由具体的对象来实现规范的细节。 接口 接口类型 在Go语言中接口(interface)是一种类型,一种抽象的类型。 interface 是一组 method 的集合,是 duck-type programming 的一种体现。接口做的事情就像是定义一个协议(规则),只要一台机器有洗衣服和甩干的功能,我就称它为洗衣机。不关心属性(数据),只关心行为(方法)。 为了保护你的Go语言职业生涯,请牢记接口(interface)是一种类型。 为什么要使用接口 type Cat struct{} func (c Cat) Say() string { return "喵喵喵" } type Dog struct{} func (d Dog) Say() string { return "汪汪汪" } func main() { c := Cat{} fmt.Println("猫:", c.Say()) d := Dog{} fmt.Println("狗:", d.Say()) } 上面的代码中定义了猫和狗,然后它们都会叫,你会发现main函数中明显有重复的代码,如果我们后续再加上猪、青蛙等动物的话,我们的代码还会一直重复下去。那我们能不能把它们当成“能叫的动物”来处理呢? 像类似的例子在我们编程过程中会经常遇到:

第2章 Go语言编程基础

不打扰是莪最后的温柔 提交于 2019-12-18 21:49:24
第2章 Go语言编程基础 2.1 数据类型 2.1.1 基础数据类型 Go语言的数据类型可以用于参数和变量声明,可以分为如下五类: 布尔类型:只可以是常量true或者false。 数字类型:整型int和浮点型float32,float64。 字符串类型:字符串类型是一串固定长度的字符连接起来的字符序列。 复合(派生)类型:包括指针类型(pointer)、数组类型(array)、结构类型(struct)、通道类型(channel)、函数类型(function)、切片类型(slice)、接口类型(interface)和字典类型(map)。 错误类型(error):error类型是Go语言预定义类型。 2.1.2 复合数据类型 Go语言中含有多种复合数据类型,将会在下面的章节中逐个进行讲解。 2.2 变量 2.2.1 变量以及声明 Go语言中由四类标记:标识符(identifiers)、关键字(keywords)、运算符(operators)标点符号(punctuation)以及字面量(literals)。 Go语言的变量标识符由字母、数字、下划线组成,其中首字符不能为数字,变量区分大小写。 变量声明形式 有三种: 1)单独声明 var year int 2)联合声明 var ( year int month int day int hour , minute , second int