go语言

Go语言操作Redis

别等时光非礼了梦想. 提交于 2019-12-07 09:33:27
Go语言操作Redis Redis介绍 Redis是一个开源的内存数据库,Redis提供了多种不同类型的数据结构,很多业务场景下的问题都可以很自然地映射到这些数据结构上。除此之外,通过复制、持久化和客户端分片等特性,我们可以很方便地将Redis扩展成一个能够包含数百GB数据、每秒处理上百万次请求的系统。 Redis支持的数据结构 Redis 支持 诸如 字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)、带范围查询的排序集合(sorted sets)、位图(bitmaps)、hyperloglogs、带半径查询和流的地理空间索引等数据结构(geospatial indexes)。 Redis应用场景 缓存系统,减轻主数据库(MySQL)的压力。 计数场景,比如微博、抖音中的关注数和粉丝数。 热门排行榜,需要排序的场景特别适合使用ZSET。 利用LIST可以实现队列的功能。 Redis与Memcached比较 Memcached中的值只支持简单的字符串,Reids支持更丰富的5中数据结构类型。 Redis的性能比Memcached好很多 Redis支持RDB持久化和AOF持久化。 Redis支持master/slave模式。 Go操作Redis 安装 Go语言中使用第三方库 https://github.com/go-redis/redis

centos7中Fabric基本环境部署

主宰稳场 提交于 2019-12-07 08:32:55
centos7中Fabric基本环境部署 1、环境整理 1.1更新本地依赖 2、Docker安装 2.1、卸载旧版本 2.2、在线安装Docker CE 2.3、Docker启动及常见命令 3、Docker-Compose安装 3.1、在线安装Docker-Compose 4、Go语言环境安装 4.1、配置Go语言环境变量 小结 1、环境整理 Fabric的节点通过Docker容器来运行,启动Fabric网络中的节点需要先安装 Docker 、 Docker-Compose 和 Go 语言环境,然后拉取相关Docker镜像,在通过 配置Compose文件 来启动各个节点。 其中LInux内核在4.X以上,并更新本地依赖,以满足Docker运行。 1.1更新本地依赖 备份本地YUM源: sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak 设置阿里YUM源: sudo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 清理缓存并生成新的缓存: sudo yum clean all sudo yum makecache 更新YUM库(此步骤时间较长):

golang之旅--接口 (interface)

百般思念 提交于 2019-12-07 02:58:14
#golang接口简介 go语言不是传统的面向对象语言,因此没有类和继承的概念。 go语言中的接口跟java中的接口有点类似,接口可以有多个实现。 go语言的接口是go的一种类型,用来指定一组方法(方法集),go的接口归根结底就是一个方法集合。 go语言实现接口的方式不像java一样用implements关键字来实现,而是只要实现了接口中的所有方法就认为是实现了接口,这是一种规范或者叫约定(隐式实现)。 go语言中的接口往往都很短,不会存在太多方法,一般只有0到5个。 #golang接口声明(定义) type 接口名 interface { Method1(param_list) return_type Method2(param_list) return_type ... } #golang接口使用 在Java中我们通过implements可以实现接口,那么在golang中怎么实现接口呢。 在go语言中并没有关键字来标识xx类型实现了xx接口,只是存在一个约定,当xx类型实现了接口中的所有方法,那么就说明该类型实现了xx接口。 注:即使接口在类型之后才定义,二者处于不同的包中,被单独编译:只要类型实现了接口中的方法,它就实现了此接口。 #golang接口实战 定义一个接口 type IHttpProxy interface { GET() POST() } 实现一个接口 type

GO网络编程和Linux Socket API的关系

一笑奈何 提交于 2019-12-06 20:53:33
server.go package main import "net" import "fmt" import "bufio" import "strings" // only needed below for sample processing func main() { fmt.Println("Launching server...") // 监听端口8081 ln, _ := net.Listen("tcp", ":8081") // 接入 conn, _ := ln.Accept() for { message, _ := bufio.NewReader(conn).ReadString('\n') fmt.Print("Message Received:", string(message)) //处理一下收到的数据 newmessage := strings.ToUpper(message) //写回到客户端 conn.Write([]byte(newmessage + "\n")) } } client.c package main import "net" import "fmt" import "bufio" import "os" func main() { // 连接到服务器 conn, _ := net.Dial("tcp", "127.0.0.1:8081

Go语言基础之接口

非 Y 不嫁゛ 提交于 2019-12-06 20:28:27
接口(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函数中明显有重复的代码,如果我们后续再加上猪、青蛙等动物的话,我们的代码还会一直重复下去。那我们能不能把它们当成“能叫的动物”来处理呢? 像类似的例子在我们编程过程中会经常遇到:

Go语言基础之包

好久不见. 提交于 2019-12-06 20:27:41
在工程化的Go语言开发项目中,Go语言的源码复用是建立在包(package)基础之上的。 Go语言的包(package) 包介绍 包(package) 是多个Go源码的集合,是一种高级的代码复用方案,Go语言为我们提供了很多内置包,如 fmt 、 os 、 io 等。 定义包 我们还可以根据自己的需要创建自己的包。一个包可以简单理解为一个存放 .go 文件的文件夹。 该文件夹下面的所有go文件都要在代码的第一行添加如下代码,声明该文件归属的包。 package 包名 注意事项: 一个文件夹下面直接包含的文件只能归属一个 package ,同样一个 package 的文件不能在多个文件夹下。 包名可以不和文件夹的名字一样,包名不能包含 - 符号。 包名为 main 的包为应用程序的入口包,这种包编译后会得到一个可执行文件,而编译不包含 main 包的源代码则不会得到可执行文件。 可见性 如果想在一个包中引用另外一个包里的标识符(如变量、常量、类型、函数等)时,该标识符必须是对外可见的(public)。在Go语言中只需要将标识符的首字母大写就可以让标识符对外可见了。 举个例子, 我们定义一个包名为 pkg2 的包,代码如下: package pkg2 import "fmt" // 包变量可见性 var a = 100 // 首字母小写,外部包不可见,只能在当前包内使用 //

一起探讨Go 语言为什么能成功?

纵然是瞬间 提交于 2019-12-06 17:02:54
一起探讨Go 语言为什么能成功?一起探讨Go 语言为什么能成功? 常言道,历史不会重演,但总会惊人的相似。 如果您想创建一种编程语言,多向那些有经验的人士学习,他们有很多可取之处。在《Go Time》第100期节目中,两位Go语言的创造者Rob Pike和Robert Griesemer一起探讨了他们的经历。 以下是他们认为取得成功的5大原因。 正式的语言规范 在讲述这个项目的起源时,Rob说:“我们经过六个多月的头脑风暴和思想成形之后,我们做的第一件重要的事情,就是花了几个星期写了一份正式的语言规范,我认为这是项目成功的关键部分。” 该规范引起了其他工程师的兴趣,比如Ian Lance Taylor。 还有最重要的事情之一是Ian Taylor看到了规范,并决定为它编写一个编译器。有一天他走进我们的办公室说:“顺便说一下,我为你们的语言做了一个编译器。” 这是一个多么神奇的时刻。当然,他后来成为了团队的一员,现在他还在为Go工作。 杀手锏App Rob说当时并没有重点考虑为什么要引入Docker 的,大概是为了使Go语言对系统程序员有吸引力? 是的,Docker现在是我们的杀手锏App,因为它是用Go编写的,运行良好,它成为了现在所谓的云计算的核心……我们过去只称它为系统编程或服务器。事实上,只要有一项重要的技术是用Go语言写的,这就证明了它的用武之地

Go语言基础之结构体

半世苍凉 提交于 2019-12-06 15:03:08
类型别名和自定义类型 自定义类型 在Go语言中有一些基本的数据类型,如 string 、 整型 、 浮点型 、 布尔 等数据类型, Go语言中可以使用 type 关键字来定义自定义类型。 自定义类型是定义了一个全新的类型。我们可以基于内置的基本类型定义,也可以通过struct定义。例如: //将MyInt定义为int类型 type MyInt int 通过 Type 关键字的定义, MyInt 就是一种新的类型,它具有 int 的特性。 类型别名 类型别名是 Go1.9 版本添加的新功能。 类型别名规定:TypeAlias只是Type的别名,本质上TypeAlias与Type是同一个类型。就像一个孩子小时候有小名、乳名,上学后用学名,英语老师又会给他起英文名,但这些名字都指的是他本人。 type TypeAlias = Type 我们之前见过的 rune 和 byte 就是类型别名,他们的定义如下: type byte = uint8 type rune = int32 类型定义和类型别名的区别 类型别名与类型定义表面上看只有一个等号的差异,我们通过下面的这段代码来理解它们之间的区别。 //类型定义 type NewInt int //类型别名 type MyInt = int func main() { var a NewInt var b MyInt fmt.Printf(

Go语言基础二

帅比萌擦擦* 提交于 2019-12-06 13:46:26
Go语言中有丰富的数据类型,除了基本的整型、浮点型、布尔型、字符串外,还有数组、切片、结构体、函数、map、通道(channel)等。 Go 语言的基本类型和其他语言大同小异。 基本数据类型 整型 整型分为以下两个大类: 按长度分为:int8、int16、int32、int64 对应的无符号整型:uint8、uint16、uint32、uint64 其中, uint8 就是我们熟知的 byte 型, int16 对应C语言中的 short 型, int64 对应C语言中的 long 型。 类型 描述 uint8 无符号 8位整型 (0 到 255) uint16 无符号 16位整型 (0 到 65535) uint32 无符号 32位整型 (0 到 4294967295) uint64 无符号 64位整型 (0 到 18446744073709551615) int8 有符号 8位整型 (-128 到 127) int16 有符号 16位整型 (-32768 到 32767) int32 有符号 32位整型 (-2147483648 到 2147483647) int64 有符号 64位整型 (-9223372036854775808 到 9223372036854775807) 特殊整型 类型 描述 uint 32位操作系统上就是 uint32 ,64位操作系统上就是