要基于 net/http 库编写一个简单的 WebSocket 回显服务器,您需要:发起握手从客户端接收数据帧向客户端发送数据帧关闭握手首先,让我们创建一个带有 WebSocket 端点的 HTTP 处理程序:// HTTP server with WebSocket endpoint func Server() { http.HandleFunc("/", fun
介绍超文本传输协议(HTTP)客户端用于建立连接并向 HTTP 服务器请求数据。最常见的方法是 GET 和 POST 。在 Go 中,我们使用 http 包来创建 GET 和 POST 请求。该包提供 HTTP 客户端和服务器实现。http 包支持 RFC 2616 中定义的属性,如超时、重定向和 cookies。虽然这个包有更多的基本方法,比如http.Client.Get() 和 http.C
什么是封装封装,也就是所谓的信息隐藏,是面向对象编程的一个重要方面。封装被定义为将数据包裹在一个单一的单元下。它是将代码和它所操作的数据绑定在一起的机制。从另一个角度来说,封装是一个保护罩,防止数据被这个保护罩外的代码访问。在面向对象的语言中,一个类的变量或数据是隐藏的,不受任何其他类的影响,只能通过它们所声明的自己类的任何成员函数来访问。但是 Go 语言不支持类和对象。因此,在 Go 语言中,封
客户端/服务器假设你开发了一个使用 Go 语言编写的程序来管理你的照片库,这个程序可以在你的电脑上处理你的照片。你可能想与其他家庭成员分享这些照片,为此,你可以通过电子邮件发送包含所有照片的附件。但如果你拍了一万张照片,这种解决方案可能是不可行的。您可以将内容自动上传到您最喜爱的社交网络。如果您必须一次处理一张照片,该操作可能会变得非常耗时。另一种解决方案可能是将您的程序直接插入社交网络系统,以编
在 Golang 中 new() 函数是另外一种创建变量的方式,内建的 new(T) 函数为一个 T 类型的新项分配了 "零 "存储,并返回其地址,即 *T 类型的值。用 Go 的术语来说,它返回一个指向新分配的 T 类型的零值的指针。Golang new() 函数函数语法:func new(Type) *Typenew() 返回的内存是清零的。new() 只返回指向初始化内存的指针。new()
ZincSearch 全文索引的搜索引擎Zinc 是一个进行全文索引的搜索引擎,它是 Elasticsearch 的轻量级替代品,并且使用一小部分资源运行。它使用 bluge 作为底层索引库。与 Elasticsearch 相比,它操作起来很简单,Elasticsearch 需要几十个 knobs 来理解和调整,你可以在 2 分钟内启动并运行。开源地址:GitHub - zinclabs/zinc
简介Golang 中通常的 slice 语法是 a[low:high],您可能很熟悉。还有另一种切片语法,形式为 a[low:high:max],它采用三个索引而不是两个索引。第三索引 max 是做什么的?提示: 不是 Python 切片语法 a[low:high:step] 中的 step 步长索引。答: 第三个索引用于设置切片的容量!在 Golang 规范中称为 “全切片表达式”。了解 Gol
1 前言在上一篇文章——《Go 微服务实战之如何使用 go-micro 写微服务应用》中,我们介绍了微服务的相关概念和 go-micro 框架的特点。接下来,我们将以循序渐进的方式建立一个简易的提供加解密服务的 Go 微服务项目。首先为了创建微服务,需要前期设计几个实体:定义服务的 RPC 方法的 protocol buffer 文件具体方法实现的 handler 文件一个公开 RPC 方
什么是微服务?什么是微服务(microservice)?这是企业界正在向计算界提出的问题。一个产品的可持续性取决于它的可修改程度。大型产品如果不能正常维护,就需要在某个时间点停机维护。而微服务架构用细化的服务取代了传统的单体服务,这些服务定义了明确的 RPC 或消息驱动的 API 边界。微服务架构有别于更为传统的单体式方案,可将应用拆分成多个核心功能。每个功能都被称为一项服务,可以单独构建和部署,
1 队列的概念队列是有序集合,遵循 FIFO (First in first out,即先进先出)排队方法的容器。添加操作发生在队列的尾部,移除操作则发生在头部。新元素从尾部进入队列,然后一直向前移动到头部,直到下一个被移除的元素。在日常生活中,我们经常需要排队,这就是队列数据结构的生活例子。排队的概念可以通过在快递驿站取快递的队伍来解释:当我们进入排队时,我们站在队伍的末端,排在队伍最前面的人就
就像制作汽车一样,建造者模式的核心在于如何一步一步地构建一个包含多个组成部件的完整对象,使用相同的构建过程构建不同的产品。 在软件开发过程中,如果需要创建复杂对象,并希望系统具备很好的灵活性和可扩展性,可以考虑使用建造者模式。
从本文开始,我们来看一下如何从零搭建一个 Go 项目。回顾一下基础的 Go 项目运行过程首先,新建一个 sports 的文件,然后键入此文件目录下,选择在终端中打开,使用如下命令初始化项目:go mod init sports然后,我们创建一个 main.go 的文件,写入如下代码:package mainimport "fmt"func writeMessage() { fmt
在 Redis 官网上有很多 Go 语言的客户端包,提供对 Redis 的访问和操作。Go-Redis 是能够支持 Redis 集群的 Redis 客户端,是基于 Redigo 的 Redis 客户端的 Go 语言执行。Go-Redis 旨在通过集群更改自动存储和更新槽位信息。Redis 客户端旨在控制每个节点的连接池,从而提高效率并减少延迟。本教程将介绍如何将 Redis Go 客户端 Go-R
我的语言之局限,即我的世界之局限。 —— Ludwig Wittgenstein(1889-1951)设计模式的概念模式是在特定环境下人们解决某种重复出现问题的一套成功有效的解决方案。设计模式(Design Pattern)是软件设计中常见问题的典型解决方案。它们就像能根据需求进行调整的预制蓝图,可用于解决代码中反复出现的设计问题。设计模式是一套被反复使用的、多数人知晓的、经过分类编目的代码设计经
前言你去买车,你不会只买一个轮胎、一个发动机、一个方向盘,你买的是一辆包括轮胎、方向盘、发动机、底盘、电气系统和车身等多个部件组成的完整骑车。在设计模式中,建造者模式就是解决如何将这些部件组装成一辆完整的汽车并返回给用户的设计模式。建造者模式为客户端返回的不是一个简单的产品,而是一个由多个部件组成的复杂产品。思考如下问题假设让我们思考如何创建一个房屋对象。建造一栋简单的房屋,你需要建造地板和四面的
Golang 是一种相对较新的编程语言,很快就流行起来。 Stack Overflow 对开发人员进行了民意调查,发现 Golang 是学习 Go 编程语言的第三大热门。为了更好地理解为什么 Go 如此受欢迎,我们将看看它是如何使用的,为什么值得学习,以及它是否可以用作初学者的第一门编程语言。 Golang 的特性和标准库可用于开发清晰、高效和动态的程序,本文旨在帮助您开始使用 Go 编程语言。G
单例模式的概念单例模式很容易记住。就像名称一样,它只能提供对象的单一实例,保证一个类只有一个实例,并提供一个全局访问该实例的方法。在第一次调用该实例时被创建,然后在应用程序中需要使用该特定行为的所有部分之间重复使用。单例模式结构单例模式的使用场景你会在许多不同的情况下使用单例模式。比如:当你想使用同一个数据库连接来进行每次查询时当你打开一个安全 Shell(SSH)连接到一个服务器来做一些任务时。
本文将介绍 Go 中的错误处理,以及为什么我们需要错误处理。什么是错误处理异常处理是任何语言都不能绕不开的话题。Go 语言没有提供传统的 try...catch 语句来处理异常,而是通过使用 error 来处理错误,用 panic 和 recover 来处理异常。错误封装是将一个错误包裹到另一个错误的过程。假设我们有一个访问数据库的 Web 服务器,并试图从数据库中
Python 中的 reverse 函数Go 语言不像其他语言如 Python,有着内置的 reverse() 函数,先来看一下 Python 中对于列表的反转方法,然后我们再来学习如果在 Go 语言中实现相同的功能。>>> myList = [2022, 2021, 2008, 2012]>>> myList.reverse()>>>
什么是 Go 中的一等函数任何一门编程语言都离不开函数,无论是命令式语言 C、多范式编程语言 C++,还是面向对象编程语言 Java、Ruby,动态语言 Python、JavaScript,函数这一语法元素都是当仁不让的核心。Go 语言没有面向对象语言的语法,比如类 、继承、对象,但 Go 语言中最重要的部分就是支持一等函数。在 Go 语言中,函数式唯一一种基于特定输入、实现特定任务并可反馈任务执
前言时至今日,如果你想当一名程序员,入门学习编程。你有众多的开发语言可以选择,从 Tiobe 编程语言趋势版可以看到,比较流行的有:Python、C、C++、Java、C#、JavaScript、SQL、Swift...做选择从来不是容易的事情,所以你可能会问,我该学哪一门语言?在我们问自己该学哪一门语言之前,不如再往前追问一句:为啥会有这么多语言?其实,每一门语言被设计出来都是有原因的,都是为了
Go 现在都支持泛型了,我们该怎么利用泛型的特点。利用类型参数来写出真实世界的代码。泛型在实际中有什么用途呢?在没有泛型之前 Go 不能实现什么样的代码?Go 切片 Slice我们先来看一下切片,切片在 Go 中并不是简单的数组,而是一个结构体,其定义如下:type slice struct { array unsafe.Pointer // 指向存放数据的数组指针 len int // 长度
协程(coroutine)是 Go 语言最大的特色之一,goroutine 的实现其实是通过协程。协程的概念协程一词最早出现在 1963 年发表的论文中,该论文的作者为美国计算机科学家 Melvin E.Conway。著名的康威定律:“设计系统的架构受制于产生这些设计的组织的沟通结构。” 也是这个作者。协程是一种用户态的轻量级线程,可以想成一个线程里面可以有多个协程,而协程的调度完全由用户控制,协
Vigenere 加密算法该密码由意大利密码学家 Giovan Battista Bellaso 于 1553 年发明,但几个世纪以来一直归功于 16 世纪的法国密码学家 Blaise de Vigenère,他在 1586 年设计了类似的密码。Vigenere Cipher 是一种加密字母文本的方法。它使用一种简单的多字母表替换形式。多字母密码是基于替换的任何密码,使用多个替换字母表。原始文本的
哪个更好,Python 还是 Go?你今天应该学习哪种语言,为什么?两者在性能、易学习性、可扩展性和快速原型设计方面如何比较?让我们在 Python 和 Go 的这个友好且易于访问的概述中找出答案,该概述由For the Love of Go 系列丛书的作者撰写。Python 和 Go 都很棒首先,真的有必要说,Go 和 Python 都是绝对优秀的编程语言。它们设计精良,功能强大,现代,
前言哈希表是开发过程中最常使用的一种数据结构,该数据结构不是使用自定义的键来存储 map 中的值,而是对键执行散列函数,以返回数组中一个项目的确切索引。原理链接法开放定址法创建一个长度等于哈希表中键/值对的预期数量的数组。数组越大,发生碰撞的机会就越低创建一个散列函数,它将获取您要添加的键的值并将其转换为数字。此功能越好,碰撞的机会就越低取散列函数生成的数字并计算与数组长度的模数。(例如,如果散列
双链表双链表 (Doubly Linked List),每个节点持有一个指向列表前一个元素的指针,以及指向下一个元素的指针。双向链表的节点中包含 3 个字段:数据域Value一个Next 指针指向双链表中的下一个节点一个Prev 指针,指向双链表中的前一个节点结构体如下:type Node struct { Prev *Node Value int Ne
除非您正在对服务进行原型设计,否则您可能会关心应用程序的内存使用情况。内存占用更小,基础设施成本降低,扩展变得更容易/延迟。尽管 Go 以不消耗大量内存而闻名,但仍有一些方法可以进一步减少消耗。其中一些需要大量重构,但很多都很容易做到。预先分配切片数组是具有连续内存的相同类型的集合。数组类型定义指定长度和元素类型。数组的主要问题是它们的大小是固定的——它们不能调整大小,因为数组的长度是它们类型的一
前言Golang 作为一门还在快速成长的编程语言,想要与时俱进,还得多看看这几个开源项目。听说你想学习 Go 语言,那我就来总结一下:那些目前我所了解的优质 Golang 开源项目。Go 自己学习 Go 语言,可别忘记了 Go 本身是一门可以轻松构建简单,可靠和高效软件的开源编程语言。官网:https://go.dev/GitHub 地址:https://github.com/gola
Copyright © 2005-2024 51CTO.COM 版权所有 京ICP证060544号