Go
文章平均质量分 70
golang语言学习
童话ing
放弃不难,但坚持一定很酷。
展开
-
【LeetCode】LCR 124. 推理二叉树
思路:有前备知识我们很快能发现,先序主要作用是确定根,先序中的每个节点都会顺序的成为从上往下的子树的根节点;而通过先序中确定的根节点,在中序序列中,我们能够将二叉树进行初步划分左右子树,然后继续找先序中的根,继续划分左右子树,划分这个过程可以借助递归完成。这样,在找寻到一个根节点的时候,通过这个根节点所在中序中的位置确定下一次划分的区间。:某二叉树的先序遍历结果记录于整数数组 preorder,它的中序遍历结果记录于整数数组 inorder。原创 2024-06-16 17:14:45 · 283 阅读 · 1 评论 -
【源码阅读】Golang中的go-sql-driver库源码探究
在上篇文章中我们知道,database/sql只是提供了驱动相关的接口,并没有相关的具体实现,具体内容是由第三方实现的,如,本章中我们主要是探究这个驱动实现库的具体实现。以及它是如何与database/sql一起作用的。原创 2024-05-01 18:30:10 · 749 阅读 · 2 评论 -
【源码阅读】 Golang中的database/sql库源码探究
在golang中,我们比较熟悉的mysql相关的库就是database/sql,这是golang的内置库,该标准库没有具体实现,只列出第三方库需要实现的具体内容。也就是说,这个库只是定义了接口,并没有具体的实现。Go语言为开发数据库驱动定义了一些标准接口,使用标准接口开发的代码,在迁移数据库时,不需要做任何修改(当然双方数据库都遵守标准接口)。下面我将基于golang1.19的源码探究这个库的实现。原创 2024-04-28 21:48:01 · 1137 阅读 · 0 评论 -
【LeetCode】740. 删除并获得点数
题目链接:740. 删除并获得点数题目描述:给你一个整数数组 nums ,你可以对它进行一些操作。每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除 所有 等于 nums[i] - 1 和 nums[i] + 1 的元素。开始你拥有 0 个点数。返回你能通过这些操作获得的最大点数。样例:输入:nums = [3,4,2]输出:6解释:删除 4 获得 4 个点数,因此 3 也被删除。之后,删除 2 获得 2 个点数。总共获得 6 个点数。输原创 2021-05-12 22:37:04 · 108 阅读 · 0 评论 -
【LeetCode】3. 无重复字符的最长子串
思路:典型的 双指针+hash,定义两个指针left,right,用于维护一个没有重复字符的区间,这个区间内的字符都是没有重复的,初始时候left和right都指向同一个位置,right指针会在遍历字符串时候一直++,在right++的过程中会将每个字符添加到hash结构中,left++的条件是当right++遇到了重复字符的时候,开始进行区间去重(更新left的位置,使得[left,right]没有重复字符),跑到下一个使得当前区间[left,right]没有重复字符的位置。原创 2024-04-21 17:52:29 · 289 阅读 · 0 评论 -
【LeetCode】23. 合并 K 个升序链表
顺序合并的效率并不高,这样做就类似于阻塞操作,合并前面的链表的时候,无关的链表啥事儿都干不了,因此,我们可以考虑进行分治,先递归地划分区间两两合并,最后再将总的合并起来。顺序合并思路很简单,就是顺序地将这K个链表两两地进行合并。原创 2023-11-05 17:23:09 · 724 阅读 · 0 评论 -
【LeetCode】210. 课程表 II——拓扑排序
题解:从题目描述来看,很容易就知道是拓扑排序问题了,问题在于如何存图,如何解答,存图方式比较多,邻接表、邻接矩阵,解方面:遍历、搜索、以及队列都能完成该题的解答,实现方面很多时候还是会依赖一些语言特性,比如java、c++中有队列,可以将度为0的点放进队列中,每次出队一个去边,而在golang中数据结构支持相对匮乏,因此可以采用遍历或者搜索方式完成。可能会有多个正确的顺序,你只要返回 任意一种 就可以了。例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示:[0,1]。原创 2023-09-10 17:21:13 · 1415 阅读 · 1 评论 -
【Golang】golang中http请求的context传递到异步任务的坑
在golang中,context.Context可以用来用来设置截止日期、同步信号,传递请求相关值的结构体。与 goroutine 有比较密切的关系。原创 2023-06-02 20:54:06 · 1534 阅读 · 0 评论 -
【开发工具】适用于Windows的Linux子系统一一WSL安装使用教程
Windows Subsystem for Linux(简称WSL)是一个在Windows 10\11上能够运行原生Linux二进制可执行文件(ELF格式)的兼容层。它是由微软与Canonical公司合作开发,其目标是使纯正的Ubuntu、Debian等映像能下载和解压到用户的本地计算机,并且映像内的工具和实用工具能在此子系统上原生运行。优势:开发人员可以在 Windows 计算机上同时访问 Windows 和 Linux 的强大功能。原创 2023-03-24 20:56:12 · 5422 阅读 · 1 评论 -
【牛客网】JZ47 礼物的最大价值
比较常规的动态规划题目,练练手,这题目从左上角走到右下角,用一个二维dp数组表示从(0,0)走到(n,m)获得的最大值,状态转移很容易得出。,注意dp数组的初始化,最上面一行和最左边一列。原创 2023-03-18 17:17:00 · 105 阅读 · 0 评论 -
【牛客网】 JZ48 最长不含重复字符的子字符串
这个题是比较容易想到two pointer(双指针)的,再加上hash标记一下区间内存在的元素即可,右指针会一直往后走,在遇到相同的元素时候,才开始让左指针走,直到走到没有重复为止。原创 2023-03-18 17:41:37 · 133 阅读 · 0 评论 -
【LeetCode】124. 二叉树中的最大路径和
这类题目一般可以通过dfs方式完成,首先我们明白,想要获取这棵二叉树中的最大路径和,那么我们需要知道以每个节点为根的最大路径和,最后找最大的就可以得到答案。那么如何找一个节点的最大路径和呢,一个节点的最大路径和为它的左右两边节点的。,最终每个节点最多会被遍历一次,总的时间复杂度为O(n)。相加的结果,因此,在dfs时候我们需要获取的就是。原创 2023-03-05 18:02:58 · 119 阅读 · 0 评论 -
[LeetCode]1237. 找出给定方程的正整数解
这种方法关键在于直接利用函数单调递增的特性,一个答案从前往后找,另一个答案从后往前找,下一次寻找一定是基于上一次的结果,因此会少很多次遍历,x最多遍历1000次,y总的遍历次数也最多1000次,因此总的时间复杂度为O(x+y)。既然我们知道y每次都从头开始找比较慢,那么我们可以优化y的查找时间,利用二分查找即可将找y的复杂度降到log级别,因此总的时间复杂度为O(xlogy)。暴力枚举法每次都从开始找y,x最多枚举1000次,而y每次也会枚举1000次,因此,总的复杂度为O(x*y)。原创 2023-02-18 17:38:28 · 639 阅读 · 0 评论 -
【LeetCode】多数元素
给定一个大小为 n 的数组nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于⌊ n/2 ⌋的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。原创 2023-01-15 17:13:25 · 118 阅读 · 0 评论 -
【牛客网】JZ4 二维数组中的查找
传送门:JZ4 二维数组中的查找题目描述:思路:题目已经指出其中的数字按照行和列都是递增的,那么这题其实很容易想到对每行或者每列进行二分,这样的时间复杂度为O(N*logM),N和M就看二分的是行还是列了。题目要求的是线性时间的复杂度,显然这种方法不是最佳的,根据题目特性我们很容易想到进行线性扫描,我们可以从矩阵的右上角或者左下角进行扫描,因为在右上角时候我们能确定当前行的最大值,当前列的最小值;而在左下角时候我们能确定当前行的最小值,列的最大值,便于扫描的进行。整个线性扫描时间复杂度为O(M+N)..原创 2022-06-29 21:13:07 · 288 阅读 · 0 评论 -
【牛客网】链表区间反转
题目链接:BM2 链表内指定区间反转题目描述:思路:思路很简单,先定义一个指针,让它走m-1步到第m-1个的位置,然后反转 [m, n]区间内的链表,将其接到前半段中就可以了。代码·:package mainimport . "nc_tools"/* * type ListNode struct{ * Val int * Next *ListNode * } *//** * * @param head ListNode类 * @param m int整型原创 2022-05-21 21:50:35 · 423 阅读 · 1 评论 -
【gRPC】gRPC中拦截器的介绍及使用
文章目录前言一、服务端拦截器1、一元拦截器:UnaryInterceptor2、流式拦截器:StreamInterceptor3、实现服务端拦截器一、客户端拦截器1、一元拦截器:WithUnaryInterceptor2、流式拦截器:WithStreamInterceptor3、实现客户端拦截器前言本次主要介绍在gRPC中使用拦截器,包括一元拦截器和流式拦截器,在拦截器中添加JWT认证,客户端登录之后会获得token,请求特定的API时候需要带上token才能访问。由于代码中我们使用了grpc-gate原创 2022-05-07 21:59:31 · 2207 阅读 · 1 评论 -
【gRPC】批量操作、服务端、客户端、双向流介绍及使用案例
前言在之前的文章中,我们通常的做法都是客户端请求—服务端响应的模式,客户端收集好所有的请求信息,发送到服务端,服务端对信息进行业务处理之后再返回最终响应结果。在更多的场景中,我们传输的数据包非常大,比如,客户端需要查询大量用户的积分,然后再拿着这堆用户的积分做其他处理,如果按照之前的做法,传输的数据包会非常大,这会占用大量的带宽,并且服务端需要等待客户端全部发送之后,才能进行处理及响应。在本文中,我们将介绍gRPC的流模式,根据流传输的方向,可以分为客户端流、服务端流以及双向流,而这里所谓的 “流” 就是原创 2022-04-27 11:17:34 · 1460 阅读 · 0 评论 -
【gRPC】双向认证下grpc-gateway原理及简单使用
前言在上一篇文章自签CA、服务端和客户端双向认证中,我们了解了双向认证并进行了实践,本篇文章将基于双向认证,使用gRPC-Gateway提供http请求处理的api,这样便于提供gRPC和RESTful风格的API。官方地址:https://github.com/grpc-ecosystem/grpc-gatewaygrpc-gateway原理gRPC-Gateway是Protocol Buffers编译器协议的一个插件。它读取Protobuf服务定义并生成一个反向代理服务器,该服务器将RESTful原创 2022-04-24 16:31:13 · 2502 阅读 · 0 评论 -
【gRPC】自签CA、服务端和客户端双向认证
前言在上一篇文章Protobuf中间文件介绍、使用、Go新版本TLS证书认证问题中,我们简单使用了grpc的单项认证,客户端和服务端使用的证书都是由ca证书签发给服务端的,在本文中,我们进行双向的认证,利用ca证书给客户端和服务端都签发一份证书,服务端会验证客户端的证书,同时客户端也会验证服务端的证书。一、双向认证1.1 CA根证书生成在openssl的bin目录下新建一个配置文件ca.conf,文件内容如下:[ req ]default_bits = 2048distinguis原创 2022-04-22 22:19:33 · 1940 阅读 · 2 评论 -
【gRPC】Protobuf中间文件介绍、使用、Go新版本TLS证书认证问题
文章目录前言gRPC初体验前言初学gRPC,跟着B站go语言grpc框架实战Up主进行学习,其中视频中的坑还是比较多的,比如版本方法废弃,获取库地址废弃等,本文基于该视频整理了前三讲的实战内容。gRPC初体验gRPC是Google开发的高性能、通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf(Protocol Buffers)序列化协议开发,且支持众多开发语言。本身它不是分布式的,所以需要进一步的开发。gRPC支持Java、C++、G原创 2022-04-21 22:05:12 · 2286 阅读 · 0 评论 -
【Gin】Gin框架中间件
前言Gin中的中间件和我们通常所认识的中间件如缓存中间件(Redis)、消息中间件(Kafaka、MQ)等不一样,Go语言中的中间件更像Spring中的拦截器,根据作用范围又分为全局中间件和局部中间件,下面对中间件这部分进行介绍。一、中间件在Gin框架中,gin.Default()默认使用了Logger和Recovery中间件,其中Logger中间件将日志写入gin.DefaultWriter,即使配置了GIN_MODE=release。而Recovery中间件会recover任何panic。如果有p原创 2022-04-15 11:22:20 · 2985 阅读 · 0 评论 -
【GORM】GORM链式执行输出执行的SQL
在上篇文章GORM jinzhu版本和io版本连接MySQL数据库问题中我们讲解了两个版本的GORM数据库连接问题,在GROM使用链式操作过程中,我们想要知道最终执行的SQL是什么,本文讲解三种常见的SQL日志打印方法。一、全局打印所有的SQL在gorm.io版本中,我们可以在建立连接时指定打印info级别的sql。注意gorm版本的io版本import ( "time" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger原创 2022-04-11 22:14:25 · 7491 阅读 · 1 评论 -
【GORM】GORM jinzhu版本和io版本连接MySQL数据库问题
文章目录前言一、GORM jinzhu版二、GORM.IO版本三、两个版本个别方法对比前言众所周知,GORM是一款GO的ORM框架,承担数据持久化工作,在GORM连接数据库中有高低版本的差异,本文给出两个版本的数据库连接方法。一、GORM jinzhu版import "github.com/jinzhu/gorm"db, err := gorm.Open("mysql", "username:password@(localhost)/database?charset=utf8mb4&pa原创 2022-04-11 21:53:53 · 4207 阅读 · 0 评论 -
【Go基础】Go自定义导入包以及Go常用命令
前言在Go语言入门环境搭建中有两个重要的概念GOPATH和GOROOT,其中GOROOT是我们安装的go路径例如D:\Go,将这个路径设置到环境变量就配置好了GO目录的安装路径了。PATH环境变量就是%GOROOT%\bin路径,如D:\Go\bin路径。而GOPATH则是我们的工作目录,就是写代码的目录,在环境变量中配置之后,我们编译源代码等生成的文件都会放到这个目录下,这个目录下我们一般会新建三个文件夹:src、pkg、bin:src 目录存放的是我们的go源代码,不同工程项目的代码以包名区分。原创 2022-03-31 21:14:39 · 4109 阅读 · 0 评论 -
【Go基础】Go基础之Socket网络编程
前言socket通信比较好理解的,首先我们都知道socket=ip+port,由此两个不同的主机通过上的两个应用通信通过端口号进行标识。而在传输层通信的传输协议主要包含基于可靠连接的TCP协议和基于UDP无连接的不可靠协议,本文主要用GO实现TCP和UDP的socket通信。TCP的三次握手和四次挥手可参见:两张动图-彻底明白TCP的三次握手与四次挥手一、TCP1.1 服务端Server.go一个TCP服务端可以同时连接很多个客户端,Go语言中创建多个goroutine实现并发非常方便和高效,因此原创 2022-03-31 16:53:10 · 3406 阅读 · 0 评论 -
【Go基础】搞懂函数回调和闭包
前言在Go语言中,学习到函数时候日常开发中使用的最多的应该是匿名函数了,这是由于Go中函数不能嵌套命名函数,因此只能使用匿名函数。在函数高级部分,一般都会接触到一下两种情况:函数可以作为另一个函数的参数。函数可以返回另一个函数,即让另一个函数作为这个函数的返回值。在使用中,前者对应的正是回调函数,而后者则对应于闭包。一、匿名函数匿名函数,简单来说就是没有名字的函数,匿名函数因为没有函数名,所以没办法像普通函数那样调用,所以匿名函数需要保存到某个变量或者作为立即执行函数。Go中函数内部不允许嵌原创 2022-03-13 18:03:47 · 1203 阅读 · 0 评论 -
【Go基础】Go中数组传参的几种方式
初学Golang,数组传参问题就是把我整不会了,以前我们使用c语言进行数组传参时是这样传递的,直接传递数组的起始地址即可。而在go中数组传参我们以以下两种方式进行传递,这里我直接贴出go代码,文中有注释:package mainimport "fmt"func testArr01(arr []int) { //形参未指定大小 arr[0]++}func testArr02(arr [5]int) { //形参指定大小 arr[0]++}func testArr03(arr *[5]原创 2021-11-30 18:11:22 · 5329 阅读 · 0 评论 -
【go】goland安装格式化插件gofmt、goimports、gometalinter常见问题
前言先简单介绍一下这三个插件作用:gofmt、goimports、gometalintergo fmt:保存的时候自动 格式化go代码goimports:保存的时候自动导入处理包gometalinter:保存的时候自动检查go语法安装1、开启File Watchers2、在tools里面引入这三个包但是,goimports需要我们进行go get之后才能使用(一般去cmd中执行,我是直接在goland的Terminal中执行的):go get golang.org/x/tools/原创 2021-11-30 16:14:21 · 4678 阅读 · 0 评论