
Go
文章平均质量分 62
Kris_u
Life is short, life is wonderful。
展开
-
Go 语言内存分配学习笔记
Go语言运行时依靠细微的对象分割、极致的多级缓存、精准的位图管理实现了对内存的精细化管理。Go语言将内存分成了67个级别的span,其中,0级代表特殊的大对象,其大小是不固定的。当具体的对象需要分配内存时,并不是直接分配span,而是分配不同级别的span中的元素。span的级别是以span中元素大小为依据。三级管理结构:mcache、mcentral、mheap。Go采用TCMalloc的内存分配算法的思想,每个逻辑处理器P都有一个存储了本地span缓存,,乘坐mcache.协程需要i内存直接在mcach原创 2022-06-14 18:34:36 · 298 阅读 · 0 评论 -
力扣93:复原IP地址(golang)-字节跳动算法题
93. 复原 IP 地址 - 力扣(LeetCode) (leetcode-cn.com)有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔。例如:"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址,但是 "0.011.255.245"、"192.168.1.312" 和 "192.168@1.1" 是 无效 IP 地址。给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 I原创 2022-02-28 17:30:12 · 2184 阅读 · 0 评论 -
二叉树类高频算法题golang实现
1、二叉树的先序遍历、中序遍历、后序遍历先序遍历:根节点-->左子树--->右子树type TreeNode struct{ Value int Left,Right *TreeNode}func (node *TreeNode) traverse(){ if node ==nil{ return } fmt.Print(node.Value+" ") node.Left.traverse() node.Right.traverse()}中序遍原创 2022-02-26 12:07:21 · 383 阅读 · 0 评论 -
链表类算法题
1、反转链表leetcode 206:// ListNode Definition for singly-linked list.type ListNode struct { Val int Next *ListNode}func reverseList(head *ListNode) *ListNode { if head == nil || head.Next == nil { return head } var prev *Li原创 2022-02-19 13:45:53 · 684 阅读 · 0 评论 -
招商银行开发岗算法题golang实现
1、给出一个非空的字符串,判断这个字符串是否是由它的一个子串进行多次首尾拼接构成的。例如,"abcabcabc"满足条件,因为它是由"abc"首尾拼接而成的,而"abcab"则不满足条件。思路:分为若干份,从2等分开始, 子串的最大长度为字符串的1/2,把相同的子串用空字符串替换,若替换后的字符串为空,则该字符串满足:是由子串首位拼接而成的条件。func subString(s string) (flag bool) { flag = true for i := 1; i < len(s原创 2022-02-17 11:17:26 · 3267 阅读 · 0 评论 -
map[string]uint8 、map[string]bool 、map[string]struct{} 各自存100条数据,实际占用的存储空间对比
func memoryMapUint8() { memoUint8 := map[string]uint8{} for i := 0; i < 100; i++ { memoUint8[strconv.Itoa(i)] = uint8(i) }}func memoryMapBool() { memoBool := map[string]bool{} for i := 0; i < 100; i++ { memoBool[strconv.Itoa(i)] = true .原创 2021-12-10 14:37:08 · 1677 阅读 · 0 评论 -
GO调度模型:GMP
GO的调度模型: 可以抽象出三个实体:M(machine)、P(processor)、G(goroutine)。G:GO运行时对goroutine的描述,G中存放并发执行的代码入口地址、上下文、运行环境(关联的P和M)、运行栈等执行相关的信息。G的新建、休眠、恢复、停止都受到Go运行时的管理。 GO运行时的监控线程会监控G的调度,G不会长久地阻塞系统线程,运行时的调度器会自动切换到其他G上运行。G新建或恢复时会添加到运行队列,等待M取出并运行。M:OS内核线程,是操作系...原创 2021-03-25 15:28:49 · 4467 阅读 · 1 评论 -
Golang:struct结构体和interface接口
一、结构体 结构体:由不同类型的元素组合而成。 1、struct结构体中的类型可以是任意类型;2、struct的存储空间连续的,其字段是按照声明时的顺序存放。 struct有两种形式:struct类型字面量,type定义的struct类型struct{ FildName FiledType FildName FiledType FildName FiledType}自定义struct类型:struct{ .........原创 2021-03-05 10:16:28 · 2058 阅读 · 1 评论 -
Golang GC(垃圾回收机制)及内存逃逸
GO :垃圾回收机制(GC: Garbage Collection)阻塞状态是go调度的一个待唤醒的状态,是不能被gc的。go V1.3之前 采用的gc是标记回收法(mark&sweep):从根变量来时遍历所有被引用对象,标记之后进行清除操作,对未标记对象进行回收标记回收法的缺点是: 1、STW:stop the world; 让程序暂停,程序出现卡顿、 2、标记需要扫描整个堆heap 3、标记会产生he...原创 2021-02-05 11:52:11 · 2954 阅读 · 0 评论 -
面试题 01.07. 旋转矩阵:翻转矩阵法golang实现
力扣原题:面试题 01.07. 旋转矩阵给你一幅由N × N矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 90 度。不占用额外内存空间能否做到?根据官方解法三实现:解题思路:1、首先按找对角线翻转,即求矩阵的转置。2、继续对矩阵的转置进行水平翻转根据中心轴。复杂度分析:时间复杂度,空间复杂度//旋转矩阵90度func rotateMatrix(nums [][]int) [][]int { //按照对角线翻转,即求矩阵的转置。...原创 2021-01-26 19:18:58 · 577 阅读 · 0 评论 -
桶排序算法:topK元素golang实现
首先介绍一下桶思想: 在现实世界中,大部分的数据分布是均匀的,或者在设计的时候让它可以均匀分布,或者说可以转换为均匀的分布。数据均匀分布了,桶排序的效率就能发挥出来。(分库分表)误区: 1.如果数据分布不均匀,大量的数据集中在少数桶里,桶排序就没效果了。 2、桶排序要时间就省不了空间,要空间就省不了时间。结论是桶排序意义不大。桶排序或所谓的箱排序桶排序(Bucket sort)的原理:假如输入的数据服从均匀分布,将数据分到有限数量的桶里,...原创 2021-01-26 16:28:32 · 1008 阅读 · 0 评论 -
240. 搜索二维矩阵 II:双指针法 golang实现
LeetCode算法题:240. 搜索二维矩阵 II编写一个高效的算法来搜索mxn矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:每行的元素从左到右升序排列。每列的元素从上到下升序排列。思路:因为矩阵的行和列是排序的(分别从左到右和从上到下),所以在查看任何特定值时,我们可以修剪O(m)O(m)或O(n)O(n)元素。算法:首先,我们初始化一个指向矩阵左下角的 (row,col)指针。然后,直到找到目标并返回 true(或者指针指向矩阵维度之外的 (r...原创 2021-01-06 18:42:26 · 288 阅读 · 0 评论 -
LeetCode求众数:摩尔投票法golang实现
给定一个大小为n的整数数组,找出其中所有出现超过⌊ n/3 ⌋次的元素。进阶:尝试设计时间复杂度为 O(n)、空间复杂度为 O(1)的算法解决此问题。LeetCode原题链接:https://leetcode-cn.com/problems/majority-element-ii/solution/liang-fu-dong-hua-yan-shi-mo-er-tou-piao-fa-zui-zh/摩尔投票法,解决的问题是如何在任意多的候选人中,选出票数超过一半的那个人。注意,是超出...原创 2021-01-06 12:02:52 · 189 阅读 · 0 评论 -
微服务架构及gRPC协议:protocol buffers
protocol buffers 的官方定义:protocol buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。Protocol Buffers 是一种灵活,高效,自动化机制的结构数据序列化方法-可类比 XML,但是比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更为简单。扩展性好:你可以定义数据的结构,然后使用特殊生成的源代码轻松的在各种数据流中使用各种语言进行编写和读取结构数据。你甚至可以更新数据结构,而不破坏由旧原创 2020-12-31 17:32:41 · 690 阅读 · 0 评论 -
golang:删除数组中的重复元素,返回删除元素后数组长度,空间复杂度O(1)。
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。要求空间复杂度O(1)。func delRepeatElem(nums []int) int { fmt.Println(nums, &nums[0]) for i := 0; i < len(nums)-1; i++ { if nums[i]^nums[i+1] == 0 { //重复元素执行异或操作等于0. nums = append(nums[:i], nums[原创 2020-12-31 17:08:06 · 1428 阅读 · 4 评论 -
1046最后一块石头的重量golang:LeetCode
有一堆石头,每块石头的重量都是正整数。每一回合,从中选出两块 最重的 石头,然后将它们一起粉碎。假设石头的重量分别为x 和y,且x <= y。那么粉碎的可能结果如下:如果x == y,那么两块石头都会被完全粉碎;如果x != y,那么重量为x的石头将会完全粉碎,而重量为y的石头新重量为y-x。最后,最多只会剩下一块石头。返回此石头的重量。如果没有石头剩下,就返回 0。示例:输入:[2,7,4,1,8,1]输出:1解释:先选出 7 和 8,得到 1,所...原创 2020-12-30 18:02:59 · 107 阅读 · 0 评论 -
三数之和golang:LeetCode
给你一个包含 n 个整数的数组nums,判断nums中是否存在三个元素 a,b,c ,使得a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。注意:答案中不可以包含重复的三元组。示例:给定数组 nums = [-1, 0, 1, 2, -1, -4],满足要求的三元组集合为:[ [-1, 0, 1], [-1, -1, 2]]//先排序,再使用双指针遍历数组,找到三个数之和为0的数func treeSum(nums []int) [][]int ...原创 2020-12-30 17:58:18 · 533 阅读 · 0 评论 -
排序算法:golang实现
1、二分查找: 输入是一个有序的元素列表。如果要查找的元素包含在列表中,二分查找返回其位置;否则返回空。二分查找时间复杂度:对于包含n个元素的列表,用二分查找最多需要二分查找算法golang实现://二分查找算法func binary_search(list []int, item int) int { low := 0 high := len(list) - 1 //low,high用于跟踪要在其中查找的部分 for low <= high { ...原创 2020-12-21 11:37:23 · 564 阅读 · 0 评论 -
leetcode:算法题golang
1、在一个字符串里面找出最长的不重复子串2、数组中的重复数字第一种解法:先排序再扫描。从排好序的数组进行遍历,记录当前位置与其之前位置的数进行比较,若相等则输出该数。时间复杂度:O(nlogn);空间复杂度O(1)第二种解法:对数组进行遍历,每次判断哈希表中是否含有该元素,若有,输出此元素。若最后哈希表中的元素数量与数组中的相同,表面无重复数据。 时间复杂度:O(n);空间复杂度O(n)3、给定一个数组代表股票每天的价格,请问买卖多次的情况下,最大化利润是多少?(日期不重...原创 2020-11-29 13:46:52 · 946 阅读 · 0 评论 -
LeetCode算法题目:股票交易最大利润
假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?示例 1:输入: [7,1,5,3,6,4]输出: 5解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。 注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。示例 2:输入: [7,6,4,3,1]输出: 0解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。限制:0 <= ...原创 2020-12-17 19:30:48 · 1902 阅读 · 0 评论 -
GO基础知识总结
一:GO关键字25个引导程序整体结构8个关键字:package、import、const、var、func、defer、go、return。声明复合数据结构的4个关键字:struct、interface、map、chan。控制程序结构的13个关键字:if、else;for、 range、break、continue;switch、select、type、case、default、fallthrough;goto。内置数据类型标识符(20个):数值: 整型(12个......原创 2020-12-02 17:11:47 · 3265 阅读 · 0 评论 -
LeetCode:go算法题目实现
//两个栈实现一个队列type Stack struct { element []int}func NewStack(col int) *Stack { return &Stack{ element: make([]int, 0, col), }}func (s Stack) len() int { return len(s.element)}func (s *Stack) Push(elem int) { s.element = append(s.element,.原创 2020-12-19 15:11:57 · 596 阅读 · 0 评论 -
leetcode :最长回文子串 golang中心展开法
5、给定一个字符串 s,找到 s 中最长的回文子串。你可以假设s 的最大长度为 1000。示例 1:输入: "babad"输出: "bab"注意: "aba" 也是一个有效答案。示例 2:输入: "cbbd"输出: "bb"func main() { fmt.Println(longestPalindrome("baabd")) fmt.Println(longestPalindrome("babad")) fmt.Println(longestPalindrome("cb.原创 2020-11-29 14:53:19 · 239 阅读 · 0 评论 -
GO实现:leetcode之寻找两个正序数组的中位数
问题描述:给定两个大小为m和n的正序(从小到大)数组nums1和nums2。请你找出这两个正序数组的中位数,并且要求算法的时间度复杂度为O(log(m+n))你可以假设nums1和nums2不会同时为空。示例1:nums1 = [1,3]nums2 = [2]则中位数为2.0示例2:nums1 = [1,2]nums2 = [3,4]则中位数为(2+3)/2 = 2.5解法一:简单粗暴,将两个数组合并,两个有序数组的合并也是归并排序的一部分,然后根据奇数还是偶数,原创 2020-11-27 20:34:12 · 401 阅读 · 0 评论 -
Golang 开发高频面试题
一、Go内存分配机制总结GO语言内存管理子系统主要由两部分组成:内存分配器和垃圾回收器(gc)。内存分配器主要解决小对象的分配管理和多线程的内存分配问题。什么是小对象呢?小于等于32k的对象就是小对象,其它都是大对象。小对象的内存分配是通过一级一级的缓存来实现的,目的就是为了提升内存分配释放的速度以及避免内存碎片等问题。1、Cache:线程私有的,每个线程都有一个cache,用来存放小对象。由于每个线程都有cache,所以获取空闲内存是不用加锁的。cache层的主要目的就是提高小内存的频繁分配释放速原创 2021-01-27 13:51:03 · 732 阅读 · 0 评论 -
GO:zip、tar、tar.gz格式文件解压缩
func tarDecompress(tarfile, dest string) error { fr, err := os.Open(tarfile) defer fr.Close() if err != nil { log.Error("err", err) return err } tr := tar.NewReader(fr) for { h, err := tr.Next() if err == io.EOF { break } if err != ni.原创 2020-08-17 20:36:12 · 1924 阅读 · 1 评论 -
GO:exec.Command()执行进入docker容器的指令:docker exec containerId sh -c “指令 && 指令“
1、docker exec containerId sh -c "指令 && 指令"output := RunCommand("docker ps|grep nf-oam") //查询名称为nf-oam的容器containerId := strings.Split(output, " ")[0] //获取容器IDenterIdOutput := RunCommand("docker exec " + containerId + " sh -c \"cd /nfoam/etc/...原创 2020-08-06 19:17:14 · 3234 阅读 · 0 评论 -
GO:正则表达式
正则表达式为高级的文本模式匹配、抽取、与/或文本形式的搜索和替换功能提供了基础。简单地说,正则表达式(regex)是一些由字符和特殊符号组成的字符串,他们描述了模式的重复或者表述多个字符,于是正则表达式能按照某种模式匹配一些列有相似特征的字符串。常用的元字符元字符:.匹配除换行符以外的任意字符\w匹配字母或数字或下划线或汉字\s匹配任意的空白符\d匹配数字\b匹配单词的开始或结束^匹配字符串的开始$匹配字符串的结束字符转义:如果你想查找元...转载 2020-08-03 19:52:25 · 7086 阅读 · 0 评论 -
GO:Pipeline
Pipeline 是可以用来在系统中形成抽象的另一种工具。特别是当程序需要流式处理或批处理数据时,他是一个非常强大的工具。Pipeline只不过是一系列将数据输入,执行操作并将结果传回的系统。我们成这些操作是Pipeline的一个stage。Pipeline stage的属性是: A、一个输入的参数与返回值类型相同的stage B、一个stage...原创 2020-04-13 14:54:09 · 387 阅读 · 0 评论 -
GO : go test -v 测试错误:panic: test timed out after 10m0s 。。。exit status 2
go test -v 测试时可能会遇到的错误“:panic: test timed out after 10m0s这导致了:我在测试用例中使用websocket发收数据时遇到的新的问题:err write tcp IP1:9001->IP2:56240: write: broken pipeBroken pipe产生的原因通常是当管道读端没有在读,而管道的写端继续有线程在写,...原创 2020-04-10 15:25:00 · 7133 阅读 · 0 评论 -
go 通过HTTP请求传输大文件的读取
对于上百兆的文件读取,应采取分片读取的方式,代码如下://GO 发送http请求: resp,err := http.post(URL, "application/json", bytes.NewReader(buf)) if err!=nil{ fmt.Println("err",err) }//分片读取resp.Body中的大文件func ...原创 2020-04-02 20:16:54 · 3852 阅读 · 2 评论 -
gzip压缩及解压缩
func main() { var b bytes.Buffer gzipWriter := gzip.NewWriter(&b) defer gzipWriter.Close() //写入gizp writer数据时,它会依次压缩数据并写入到底层的文件中 gzipWriter.Write([]byte("Kris hello world!")) gzipWriter.Flu...原创 2020-02-10 23:35:31 · 745 阅读 · 0 评论 -
goroutine:内存泄露
1、goroutine代表肯或不肯相互平行运转的工作单位。goroutine有以下几种方式被终止:A、当它完成了他的工作B、因为不可回复的错误,它不能继续工作C、当它被告知需要终止工作2、main goroutine 具有完整的语境知识应该能够告诉其子goroutine终止。3、goroutine 很常见的会在一个长寿的程序的初始化的时候就被启动。...原创 2019-12-20 13:52:40 · 488 阅读 · 0 评论 -
Go语言并发之道
第一章:并发概述1、Amdahl定律:使用并行方式可以解决的问题,可以使用这种方法对其潜在的性能收益进行建模。简言之,它指出,收益的限制取决于有多少程序必须以顺序的方式编写。2、竞争条件:当两个或者多个操作必须按正确的顺兴执行,而程序并未保证这个顺序就会发生竞争条件。大多数情况下,这将在所谓的数据中出现,其中一个并发操作尝试读取一个变量,而在某个不确定的时间,另一个并发操作试图写...原创 2019-12-13 16:12:50 · 582 阅读 · 1 评论 -
iperf测试带宽
Iperf是一个网络性能测试工具,该工具可以测试网络最大带宽性能,以诊断网络情况。1、本机带宽测试:首先,下载Iperf.exe: https://iperf.fr/iperf-download.php#windows其次,打开cmd窗口,切换目录到Iperf.exe的路径,输入:iperf.exe -s,就说明将其设为服务端,服务器端开始监听。监听端口是默认的,也可以通过...原创 2019-12-13 16:09:24 · 1253 阅读 · 0 评论 -
GO:build常见错误
1、package ... :code in directory ... expects import "..."解决方案在GOPATH/src下新建"go.uber.org/zap"/"golang.org/x/net/websocket"文件夹,然后将代码拷贝过去。引用包也改为:import ( "go.uber.org/zap"''golang.org/x/net...原创 2019-12-13 16:05:42 · 4536 阅读 · 0 评论 -
GO:结构体初始化
GO编译指令 go build test.gotime ./test》》》./test 0.01s user 0.01s system 1% cpu 1.016 total1、结构体初始化数组初始化要加上数组类型msg_send2 := &msg{ Mode: 0, IsExist: 0, S: SInfo{ amId: 1, ...原创 2019-10-22 20:26:01 · 541 阅读 · 0 评论 -
Go: 并发 goroutine
1、goroutine 原理: 进程 - --> 一个线程 --->单线程程序 进程- --> 多个线程 --->多线程程序 并发:多线程程序在一个核的CPU上运行 并行:多线程程序在多个核的CPU上运行协程:独立的栈空间,共享堆空间,调度由自己控制, 本质上有点类...原创 2019-09-03 10:52:50 · 575 阅读 · 0 评论 -
Go: 数组、切片和映射
Go语言的三种数据结构:数组、切片和映射,其功能类似于Python中的列表、切片和字典。1、在GO语言里,数组是一个长度固定的数据类型,用于存储一段具有相同类型的元素的连续块。数组存储的结构可以是内置类型,如整型或者字符串,也可以是某种结构类型。数组的索引从零开始,即数组中第一个元素的索引为0。GO中的切片和Python中的切片功能一样,但是GO不支持负索引。切片的动态增长都是通过内置...原创 2019-09-02 13:28:26 · 321 阅读 · 0 评论 -
Go:接口 Interface
1、接口:Interface 类型可以定义一组方法,但是这些不需要实现,并且Interface不能包含任何变量。2、Interface类型默认是一个指针: type example interface{ Method1 (参数列表) 返回值列表 Method2(参数列表) 返回值列表、...原创 2019-09-02 13:26:43 · 173 阅读 · 0 评论