![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Golang
文章平均质量分 74
YouSec995
美腻的代码世界,i am coming...
展开
-
go内存分配原理
title: go内存分配原理category: Goroutinedate: 2021-07-25 22:06:18tags:GolangHeapStackMemory图文地址堆栈与逃逸分析堆栈定义Go 有两个地方可以分配内存:一个全局堆空间用来动态分配内存,另一个是每个 goroutine都有的自身栈空间。栈栈区的内存一般由编译器自动进行分配和释放,其中存储着函数的入参以及局部变量,这些参数会随着函数的创建而创建,函数的返回而销毁。(通过 CPU push & .原创 2021-08-10 01:08:26 · 521 阅读 · 0 评论 -
Goroutine原理
title: Goroutine原理category: Goroutinedate: 2021-07-25 22:19:29tags:GolangGMPAlgorithm有图文地址Goroutine定义“Goroutine 是一个与其他 goroutines 并行运行在同一地址空间的 Go 函数或方法。一个运行的程序由一个或更多个 goroutine 组成。它与线程、协程、进程等不同。它是一个 goroutine” —— Rob PikeGoroutines 在同一个用户地址空.原创 2021-08-10 01:07:45 · 356 阅读 · 0 评论 -
go-GC原理
title: go_GC原理category: Goroutinedate: 2021-07-25 22:23:06tags:GolangGC有图文的博客地址Mark & SweepCarbage Collection现代高级编程语言管理内存的方式分为两种:自动和手动,像 C、C++ 等编程语言使用手动管理内存的方式,工程师编写代码过程中需要主动申请或者释放内存;而 PHP、Java 和 Go 等语言使用自动的内存管理系统,有内存分配器和垃圾收集器来代为分配和回收内存,其中.原创 2021-08-10 01:06:51 · 320 阅读 · 0 评论 -
Go语言之context包
channelschannels 是一种类型安全的消息队列,充当两个 goroutine 之间的管道,将通过它同步的进行任意资源的交换。chan 控制 goroutines 交互的能力从而创建了 Go 同步机制。当创建的 chan 没有容量时,称为无缓冲通道。反过来,使用容量创建的 chan 称为缓冲通道。要了解通过 chan 交互的 goroutine 的同步行为是什么,我们需要知道通道的类型和状态。根据我们使用的是无缓冲通道还是缓冲通道,场景会有所不同,所以让我们单独讨论每个场景。Unbuffer原创 2021-04-30 10:56:53 · 680 阅读 · 0 评论 -
Go语言之sync包
Share Memory By Comunication传统的线程模型(通常在编写 Java、C++ 和Python 程序时使用)程序员在线程之间通信需要使用共享内存。通常,共享数据结构由锁保护,线程都将争用这些锁来访问数据。在某些情况下,通过使用线程安全的数据结构(如 Python 的Queue),这会变得更容易。Go 的并发原语 goroutines 和 channels 为构造并发软件提供了一种优雅而独特的方法。Go 没有显式地使用锁来协调对共享数据的访问,而是鼓励使用 chan 在 gorout原创 2021-04-29 00:21:32 · 460 阅读 · 0 评论 -
08Go内存模型Memory module
Memory modulehttps://golang.org/ref/mem如何保证在一个 goroutine 中看到在另一个 goroutine 修改的变量的值,如果程序中修改数据时有其他 goroutine 同时读取,那么必须将读取串行化。为了串行化访问,请使用 channel 或其他同步原语,例如 sync 和 sync/atomic 来保护数据。Happen-Before在一个 goroutine 中,读和写一定是按照程序中的顺序执行的。即编译器和处理器只有在不会改变这个 goroutin原创 2021-04-27 21:13:52 · 295 阅读 · 0 评论 -
07并发编程Goroutine
Processes and Threads操作系统会为该应用程序创建一个进程。作为一个应用程序,它像一个为所有资源而运行的容器。这些资源包括内存地址空间、文件句柄、设备和线程。线程是操作系统调度的一种执行路径,用于在处理器执行我们在函数中编写的代码。一个进程从一个线程开始,即主线程,当该线程终止时,进程终止,这是因为主线程是应用程序的原点。然后主线程可以依次启动更多的线程,而这些线程可以启动更多的线程。无论线程属于哪个进程,操作系统都会安排线程在可用处理器上运行,每个操作操作系统都有自己的算法来作出这原创 2021-04-27 15:48:00 · 205 阅读 · 1 评论 -
06 Errors For Go1.13
Errors before For 1.13最简单的错误检查:if err != nil { // sth went wrong}有事我们需要对sentinel error进行检查:var ErrNotFound = errors.New(" not found")if err != ErrNotFound { // sth wasn‘t found}实现了error interface的自定义error struct,进行断言使用获取更丰富的上下文:type No原创 2021-04-24 15:33:13 · 121 阅读 · 0 评论 -
05 Go处理错误--Handing Error
Indented flow is for erroes无错误正常流程代码,将成为一条直线,而不是缩进代码:package main// 建议stylef, err := os.Open(path)if err != nil { // handle error 将错误的代码在这里提前处理掉}// do stuff 做一些事情// 不建议的stylef, err := os.Open(path)if err == nil { // do stuff}// handle err原创 2021-04-23 22:57:56 · 244 阅读 · 2 评论 -
05Golang之Error Type
Sentinel Error预定义的特定错误,我们称之为sentinel error,这个名字来源于计算机编程中使用一个特定值来表示不可能进行进一步处理的做法。所以对于Go,我们使用特定的值来表示错误。if err == ErrSomething{...}类似的io.EOF,更底层的syscall.ENOENT。使用sentinel值是最不灵活的错误处理策略,因为调用方必须使用 == 讲结果于预先声明的值进行比较。当使用者想要提供更多的是上下文时,就会出现一个问题:返回一个不同的错误讲破坏相等性检查原创 2021-04-21 23:34:47 · 498 阅读 · 0 评论 -
04Golang的Error vs Exception
ErrorGo error就是一个普通的接口,普通的值。http://golang.org/pkg/builtin/#errortype error interface { Error() string}我们常用一个errors.New()来返回一个error对象。http://golang.org/src/pkg/errors/errors.gotype errorString struct { s string}http://golang.org/src/pk原创 2021-04-21 21:56:29 · 223 阅读 · 0 评论 -
leetcode寻找峰值&寻找旋转数组中最小值
寻找峰值题目峰值元素是指其值大于左右相邻值的元素。给你一个输入数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。你可以假设 nums[-1] = nums[n] = -∞ 。Codefunc findPeakElement(nums []int) int { n := len(nums) for i:=0;i<n;i++ { if i -1 == -1 || nums[i-1] < nums原创 2021-04-20 23:34:11 · 97 阅读 · 0 评论 -
02微服务设计
API Gateway在进行了SOA服务化架构演进后,将局势架构按照功能进行了垂直拆分,直接对外暴露一批微服务接口,但是却因为缺乏统一的出口面临一些困难:客户端到微服务直接进行通信,导致强耦合出现—导致随着时间的推移,历史的API需要保留,需要维护历史的API接口一个功能/页面需要多次请求,客户端聚合数据,工作量变得巨大、延迟变高。多服务可能由多部门进行提供,部门之间的接口规范存在差异、协议不利于统一,需要端来兼容。若每一个微服务都直接对外,意味着每一个微服务都需要考虑面向不同的移动端、web端原创 2021-04-17 17:36:54 · 135 阅读 · 0 评论 -
01微服务概览
微服务起源早期有一种面向服务的架构模式,也就是SOA–可以将微服务理解成轻量级SOA的一种最佳实践。从单一的“全家桶”架构,其拥有单一的数据库,需要考虑非常清晰的模块划分以及依赖等等。通过化繁为简、分而治之,将原来“全家桶”架构演进到分布式的一个微服务的模型。不同的服务存在很强的隔离性和独立部署性。特点:小即是美:小的服务代码量少,bug也会少,易于测试,也更容易不断迭代完善进而趋近完美。单一职责:一个服务也只需要做好一件事情,专注才能做得更好。----借鉴《代码整洁之道》尽可能早的原创 2021-04-16 00:13:52 · 135 阅读 · 0 评论 -
LeetCode接雨水和动物收容所
接雨水题目给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。COde// 接雨水func trap(height []int) int { n := len(height) if 0 == n { return 0 } leftMax := make([]int, n) leftMax[0] = height[0] for i:=1;i<n;i++ { leftM原创 2021-04-12 23:06:15 · 90 阅读 · 0 评论 -
LeetCode滑动窗口最大值&队列最大值
队列的最大值题目请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。若队列为空,pop_front 和 max_value 需要返回 -1Code// 队列最大值type MaxQueue struct { doubleQue []int maxQue []int}func Constructor() MaxQueue { return MaxQue原创 2021-03-29 21:08:19 · 97 阅读 · 0 评论 -
leetcode计算器和每日温度
计算器题目给定一个包含正整数、加(+)、减(-)、乘()、除(/)的算数表达式(括号除外),计算其结果。表达式仅包含非负整数,+, - ,,/ 四种运算符和空格 。 整数除法仅保留整数部分。Code// 计算器// 讲字符串中空格去掉后,讲字符串中的数字存入栈中,有*/的将结果计算出来存入栈中// 之后将栈累加求和func calculate(s string) int { s = "+" + s // 第一位的符号 // 去掉字符串s中空格 for i:原创 2021-03-23 23:58:43 · 254 阅读 · 0 评论 -
两数相加与反转链表
文章目录题目1 两数链表相加代码1题目2 反转单向链表代码2题目1 两数链表相加给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。代码1/** * Definition for singly-linked list. * type ListNode struct { * Val int * Ne原创 2021-03-18 22:24:43 · 135 阅读 · 0 评论 -
Go语言之函数
前言:文本首先介绍在Go中函数的定义、调用、参数、返回值,之后将对函数的应用进行说明,最后简单介绍下内置函数函数在Go中,支持函数、匿名函数和闭包。函数的定义Go语言中,定义函数需要用到关键字func,其格式如下:func 函数名(参数列表)(返回值列表){ 函数体}函数名:由字母、下划线、数字组成,规定开头第一个字母不能是数字,同时在同一个包内函数名不能重名。参数列表:参数由参数变量 参数类型格式组成,多个参数之间用逗号,隔开。返回值列表:返回值由返回值变量 返回值类型组成,规定可原创 2020-08-29 17:42:51 · 184 阅读 · 1 评论 -
Go语言之map
前言:本文主要介绍了map的定义、判断键值存在与否、map遍历、删除键值对。map的定义Go语言中映射关系容器为map,其内部使用散列表实现map是一种无序的基于键值key-value的数据结构,其跟切片一样是引用类型,必须要经过初始化才能使用在Go中map的定义如下:map[keyType]ValueTypekeyType:表示键的类型Valuetype:表示键对应的值的类型map类型的变量的初始值为nil,需要使用make函数来分配内存,其语法如下:make(map[keyTyp原创 2020-08-18 22:58:14 · 123 阅读 · 0 评论 -
Go语言之切片
前言:本文主要记录了切片的定义、切片的比较、切片的拷贝、遍历,以及如何给切片追加元素。切片的定义由于数组长度固定、类型局限性大、无法追加元素等缺陷存在,在Go中引入了切片(slice)。切片的底层是数组,它是一个拥有相同类型元素的可变长度的序列,支持新元素的添加,可用于快速的操作一块数据的集合。切片是引用类型,改变切片会改变底层数组,其包含了地址、长度、容量属性。切片的基本语法如下所示:// var 关键字//name 变量名//T 数据类型var name []T//声明示例fun原创 2020-08-17 22:35:03 · 303 阅读 · 0 评论 -
Go语言之数组
前言本文主要记录了数组的定义、初始化、遍历以及二维数组做简单介绍。数组的定义数组是同一类的数据类型元素的集合。在Go语言中,数组在声明时大小就确定了,并且不可改变,只能修改其数组的元素。其基本语法如下:var 数组变量名 [元素数量]T//示例,其中数组的元素数量必须为常量,并且不可省略,一旦定义其大小不可改变。var array [5]int注意:在Go中,数组元素数量(也叫长度)为数组类型的一部分,也就是说长度不同的两个数组一定不是同一类型。比如[5]int与[6]int是不同的类型,原创 2020-08-12 22:50:58 · 585 阅读 · 0 评论 -
Go语言之流程控制
在Go语言中,总结后的流程控制语句主要有if、for、switch、goto。其中常用的为if、for。接下来讲依次记录这几种流程控制,并以代码进行说明。if流程控制if条件语句的一般格式如示例所示:/*当第一个表达式为true时,执行第一个逻辑块,否则判断第二个表达式;第二个表达式为true时执行第二个逻辑块,否则执行第三个逻辑块。*/if 表达式 { 逻辑块} else if 表达式 { 逻辑块} else { 逻辑块}注意:在Go中关于if有个硬性规定,与if匹配的{必原创 2020-08-11 23:49:04 · 100 阅读 · 0 评论 -
Go语言之运算符总结
在Go语言中内置的运算符有5种,分别为算术运算符、关系运算符、逻辑运算符、位运算符和赋值运算符。接下来会依次记录,并以表格形式列出来进行说明。算术运算符需要注意的是:在Go中自增++和自减--是单独的语句,并不是运算符。运算符说明+相加-相减*相乘/相除%求余关系运算符运算符说明==检查两个值是否相等,如果相等则返回True,否则返回False!=检查两个值是否不相等,如果不相等则返回True,否则返回Fal原创 2020-08-10 22:48:40 · 348 阅读 · 0 评论 -
Go语言之变量
YouSec前言标识符关键字变量变量的声明变量标准声明批量声明初始化变量短变量声明匿名变量欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入前言在了解变量之前,应该对标识符和关键字有一定的了解原创 2020-08-09 14:38:42 · 146 阅读 · 0 评论 -
win10下搭建Go语言及开发环境
ps:Go是编译型语言 + Go为并发而生Golang包安装go语言在cmd中可以用命令”go version”查看自己安装的版本,我安装的版本如图:接下来我会记录自己如何一步一步的搭建go语言开发版本。下载golang下载地址可以去官网下载,也可以下载其镜像,我自己下载的是镜像,其地址分别如下:Go官网下载地址:https://goalng.org/dl/Go官方镜像网站: https://goalng.google.cn/dl/下面是Go官方镜像网站,可以看到有win、mac、l原创 2020-08-02 23:18:06 · 1570 阅读 · 0 评论