Go基础篇:接口
前言✨ 前段时间忙着春招面试,现在也算告一段落,找到一家比较心仪的公司实习,开始慢慢回归状态,这后面几章我会学习go1.19版本的语言特性或者机制:类型系统、接口、断言以及反射的内容,也算是补上之前没有深入底层的内容。 一、什么是接口?Go语言中的接口(interface)是一种类型,它定义了一组方法的集合,但没有具体的实现。接口可以被任何类型实现,只要该类型实现了接口中定义的所有方法。这种设计方式使得Go语言具有很高的灵活性和可扩展性。 1234567891011121314151617181920212223// 定义一个接口,包含一个String方法type Stringer interface { String() string}// 定义一个结构体,实现Stringer接口type Person struct { Name string Age int}func (p Person) String() string { return fmt.Sprintf("%s (%d)", p.Name, p...
Go基础篇:类型系统
前言✨ 前段时间忙着春招面试,现在也算告一段落,找到一家比较心仪的公司实习,开始慢慢回归状态,这后面几章我会学习go1.19版本的语言特性或者机制:类型系统、接口、断言以及反射的内容,也算是补上之前没有深入底层的内容。 一、什么是类型?类型的概念在不同的编程语言之间是不同的,可以用许多不同的方式来表达,但都有一些相同点。 类型是用来定义变量、常量、函数参数、函数返回值等值的属性; 在定义的变量上可以执行一组操作,例如:int 类型可以执行 + 和 - 等运算,而对于 string 类型,可以执行连接、空检查等操作; 在Go语言中,类型是用来描述变量、常量、函数参数、函数返回值等值的属性。它定义了变量或表达式可以存储的数据类型,以及可以对其执行的操作。 Go语言中的类型可以分为基本数据类型和引用类型两种。基本数据类型包括整型、浮点型、布尔型、字符串型等,而引用类型包括数组、切片、结构体、接口、channel等。 类型 说明 例子 布尔型 表示真或假的值 true, false 整型 表示整数的值,有不同的位数和符号 int, int8, int16, int3...
Go基础:数据结构(定义和go语言实现)
前言 最近在刷leetcode的每日一题的,总会碰到一些问题,因为竞赛时用惯了c++的STL库,有数据结构的实现,可以直接使用,到现在用go总会遇到头疼的事情就是用到数据结构的时候需要自己定义结构并且实现方法,刚好这几天笔试里面也有关于数据结构的题目,所以这一篇主要来讲一下数据结构 一、数组 (Array)数组是一种线性数据结构,它由相同类型的元素组成,每个元素可以通过下标访问。在Go语言中,数组是一种值类型,声明数组时必须指定长度,长度不能被修改。 12345// 定义一个长度为5的整型数组var a [5]int// 访问数组元素,下标从0开始a[0] = 1 1、优缺点 优点: 数组的访问速度很快,因为它们是在内存中连续存储的 数组是一种简单、清晰的数据结构,易于理解和实现 缺点: 数组的长度是固定的,无法动态增加或缩小 插入或删除元素时需要移动数组中的其他元素,效率较低 2、适用场景和不适用场景 适用场景: 当需要在一个集合中存储相同类型的元素时,可以使用数组,例如存储身份证号、学号等 当需要快速访问数组中的元素时,可以使用数组 不适用场景: 当需要动态地...
Go底层原理:一起来唠唠GMP调度(一)
前言 春招开始了,作为23届的科班咸鱼学习记录一下八股文和go底层原理(GC、GMP调度、goroutine等)本文介绍 Go 语言运行时调度器的实现原理,其中包含调度器的设计与实现原理、演变过程以及与运行时调度相关的数据结构。参考几篇不错的文章:mingguangtu《深入分析Go1.18 GMP调度器底层原理》刘丹冰Aceld《Golang 调度器 GMP 原理与调度全分析》 一、进程、线程、Goroutine1、进程与线程在了解Go的调度器的时候,都离不开操作系统、进程与线程这些概念。 进程 线程 操作系统资源调度和分配的基本单位 CPU调度和分派的基本单位 一个进程可以有多个线程 一个线程只能属于一个进程 有独立的地址空间 同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器 创建销毁开销大,进程切换时,耗费资源较大 创建销毁开销小,线程切换时,耗费资源小 实现操作系统的并发 实现进程内部的并发 进程在执行过程中拥有独立的内存单元,而多个线程共享进程的内存。资源分配给进程,同一进程的所有线程共享该进程的所有资源。同一进程中的多...
Go基础入门:sort包
前言 切片是Go语言中引入的用于在大多数场合替代数组的语法元素。切片是长度可变的同类型元素序列,它不支持存储不同类型的元素。有序列的地方就有排序的需求。在各种排序算法都已经成熟的今天,我们完全可以针对特定元素类型的切片手写排序函数/方法,但多数情况下不推荐这么做,因为Go标准库内置了sort包可以很好地帮助我们实现原生类型元素切片以及自定义类型元素切片的排序任务。 一、sort包简介Go的sort包用来排序,二分查找等操作。 二、sort包内排序原理实现123456789101112131415161718type Interface interface { // Len是集合中元素的个数。 Len() int // Less是排序条件(索引i与j的元素对比排序) Less(i, j int) bool // Swap交换索引i和j的元素。 Swap(i, j int)}// Sort按Less方法确定的升序对数据进行排序。func Sort(data Interface) { n := data.Len() if n <= 1 &...
Hello World
Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub. Quick StartCreate a new post1$ hexo new "My New Post" More info: Writing Run server1$ hexo server More info: Server Generate static files1$ hexo generate More info: Generating Deploy to remote sites1$ hexo deploy More info: Deployment
gRPC(八)生态 grpc-gateway 应用:同一个服务端支持Rpc和Restful Api
前言 示例代码已经上传到github:点击跳转gRPC官方文档:点击跳转grpc-gateway官方文档:点击跳转源自 coreos 的一篇博客,转载到了 gRPC 官方博客 gRPC with REST and Open APIs。 一、gRPC-Gateway概述1、简述 取自官方概述:grpc-gateway is a plugin of protoc. It reads gRPC service definition, and generates a reverse-proxy server which translates a RESTful JSON API into gRPC. This server is generated according to custom options in your gRPC definition. gRPC-Gateway 是 protoc 的插件。它读取gRPC服务定义并生成反向代理服务器,将 RESTful JSON API 转换为 gRPC。该服务器是根据服务定义中的 google.api.http 注释生成的。 2、出现...
gRPC(七)进阶:自定义身份验证
前言 示例代码已经上传到github:点击跳转gRPC官方文档:点击跳转在前面的章节中,我们介绍了两种可全局认证的方法: 基于 CA 的 TLS 证书认证 拦截器 interceptor 而在实际需求中,常常会对某些模块的 RPC 方法做特殊认证或校验,而gRPC也专门提供了这类特殊认证的接口。 一、概述gRPC为每个gRPC方法调用提供了Token认证支持,可以基于用户传入的Token判断用户是否登陆、以及权限等,实现Token认证的前提是,需要定义一个结构体,并实现credentials.PerRPCCredentials接口。 1、credentials.PerRPCCredentials 接口类型定义: 123456type PerRPCCredentials interface { // 返回需要认证的必要信息 GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) // 是否使用安全链接(TLS) RequireTransportSecurity...
gRPC(六)进阶:拦截器 interceptor
前言 示例代码已经上传到github:点击跳转gRPC官方文档:点击跳转 一、拦截器概述1、什么是拦截器?在常规的 HTTP 服务器中,我们可以设置有一个中间件将我们的处理程序包装在服务器上。此中间件可用于在实际提供正确内容之前执行服务器想要执行的任何操作,它可以是身份验证或日志记录或任何东西。 中间件:中间件供系统软件和应用软件之间连接、便于软件各部件之间的沟通的计算机软件,相当于不同技术、工具和数据库之间的桥梁,例如他可以记录响应时长、记录请求和响应数据日志,身份验证等。中间件可以在拦截到发送给 handler 的请求,且可以拦截 handler 返回给客户端的响应 gRPC 不同,它允许在服务器和客户端都使用拦截器。 服务器端拦截器是 gRPC 服务器在到达实际 RPC 方法之前调用的函数。它可以用于多种用途,例如日志记录、跟踪、速率限制、身份验证和授权。 同样,客户端拦截器是 gRPC 客户端在调用实际 RPC 之前调用的函数。 2、gRPC 拦截器核心概念 一元是我们大多数人使用的。就是发送一个请求并获得一个响应。 流是当您发送或接收 protobuf 消...
gRPC(五)进阶:通过TLS建立安全连接
前言 示例代码已经上传到github:点击跳转gRPC官方文档:点击跳转 一、明文传输先前的例子中 gRPC Client/Server 都是明文传输的,在明文通讯的情况下,你的请求就是裸奔的,有可能被第三方恶意篡改或者伪造为“非法”的数据。 我们抓个包查看一下:是明文传输,后面我们开始gRPC通过 TLS 证书建立安全连接,让数据能够加密处理,包括证书制作和CA签名校验等。 二、TLS概述传输层安全 (TLS) 对通过 Internet 发送的数据进行加密,以确保窃听者和黑客无法看到您传输的内容,这对于密码、信用卡号和个人通信等私人和敏感信息特别有用。 1、什么是TLS?传输层安全 (TLS) 是一种 Internet 工程任务组 ( IETF ) 标准协议,可在两个通信计算机应用程序之间提供身份验证、隐私和数据完整性。它是当今使用最广泛部署的安全协议,最适合需要通过网络安全交换数据的 Web 浏览器和其他应用程序。这包括 Web 浏览会话、文件传输、虚拟专用网络 (VPN) 连接、远程桌面会话和 IP 语音 (VoIP)。最近,TLS 被集成到包括 5G 在内的现...


