
Golang开发
文章平均质量分 66
Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态强类型、编译型语言。Go 语言语法与 C 相近,但功能上有:内存安全,GC(垃圾回收),结构形态及 CSP-style 并发计算。
灬倪先森_
区块链相关开发经验2年多的程序猿,区块链技术是一样信仰,我坚信终有一天它会变大,变强.
展开
-
Golang与设计模式-Abstract Factory抽象工厂模式
Abstract Factory抽象工厂模式是一种创建型设计模式。抽象工厂模式和 Factory工厂方法模式一样,都符合开闭原则。但是不同的是,工厂方法模式在增加一个具体产品的时候,都要增加对应的工厂。但是抽象工厂模式只有在新增一个类型的具体产品时才需要新增工厂。场景本文将以电子工厂生产电子产品为例来演示抽象工厂模式。我们会定义两种类型的产品手机Phone 和平板电脑 Pad,以及两个不同品牌的生产厂商苹果和华为。基本类型和接口首先定义手机接口Phone,以及一个打电话的方法Call()原创 2021-08-18 23:17:33 · 319 阅读 · 0 评论 -
Golang与设计模式-Builder建造者模式
Builder建造者模式也是一种创建型设计模式,建造者模式就是把一个复杂的对象分成多个简单的对象,然后对这些简单的对象一步步进行构建,从而组成了一个复杂的对象。建造者模式种有三个角色:建造者(Builder)负责定义生成实例的接口 具体建造者(ConcreteBuilder)实现了Builder接口,定义生成实例时被调用的方法 指挥者(Director)负责使用Builder接口生成实例。它不依赖ConcreteBuilder场景本文内容我们就拿组装电脑为例,因为电脑就是由多个组件组成,且原创 2021-08-18 00:14:44 · 1049 阅读 · 0 评论 -
Golang与设计模式-Prototype原型模式
原型模式其实就是根据实例的原型生成新的实例的一种创建性设计模式。使你能够复制对象,甚至是复杂对象,而又无需使代码依赖它们所属的类。典型的应用就是依赖注入,做过.Net 和 Java开发的小伙伴应该对此很熟悉。go也有依赖注入框架场景本期场景就很简单了,我们实现了一个简单的依赖注入模型。基础类型和接口这是原型接口,需要实现依赖注入的实例必须实现这个接口// 产品接口(原型接口)type Product interface { // 用于演示的方法 Use() // 克隆方..原创 2021-08-11 23:16:01 · 359 阅读 · 0 评论 -
Golang与设计模式-Singleton单例模式
单例模式是我们工作中最长用到的设计模式之一,单例模式也是创建型设计模式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。通过单例模式可以保证系统中一个类只有一个实例且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。单例模式一般分为两种实现方式:懒汉模式和饿汉模式饿汉模式表示程序在初始化阶段或使用前已创建出了一个实例,在程序后面的生命生命周期内将不再创建// 声明原创 2021-08-10 21:02:02 · 464 阅读 · 0 评论 -
Golang与设计模式-Factory工厂模式
工厂模式是创建型设计模式,在工厂模式中,父类决定实例的生成方式,但并不决定所生成的具体的类,具体的处理全部交给子类负责。工厂模式是使用Template模版模式来构建生成实例的工厂。这也是为什么我们要先学习模版模式的原因,而不像其他博主按照设计模式的类型划分后一类一类的学习。场景本期我们以一个制作身份证(IDCard)的程序来演示工厂模式。基础类型和接口老规矩,先定义基础类型和抽象接口。首先我们先定义一个工厂接口Factory,并定义了3个方法,分别是对外公开生成实例的Create()原创 2021-08-09 23:23:22 · 594 阅读 · 0 评论 -
Golang与设计模式-Template Mode模版模式
模版模式的核心思想就是在弗雷中定义处理流程的框架,在子类种实现具体处理。了解了设计模式的核心思想,那么我们就可以按照这个想法去实现一个事例来演示一下模版模式的使用场景跟方法。场景我们可以模拟一个完成的手机操作流程,从解锁 -> 打开微信发起转账给老婆 -> 支付验证,我们可以对这一系列操作合并在一起叫 微信转账。而IPhone7跟IPhone12的操作是有差别的,我们知道IPhone7是可以用TouchID解锁手机和微信支付验证的,而IPhone12用的是FaceID来完成解锁手机跟原创 2021-08-08 21:22:46 · 407 阅读 · 0 评论 -
Golang与设计模式-Adapter适配器模式
适配器模式是我们在工作中会经常使用到的模式。比如对接口升级的同时,又要保证对旧借口的兼容。场景生活中我们会遇到这种情况,我们常用的插线板三插孔(10A)与空调插头(16A)的大小不一样,虽然都是三插孔。当我们买了空调,安装时发现空调插头并不能插入我们原有(10A)的插孔时,我们可以买一个插头转换器,如下图。我们可以把10A的反面插头插入我们正常的10A三插孔,再将空调的插头插入正面的16A三插孔即可。这里,我们的插头转换器扮演的就是 适配器(Adapter)的角色。接下来我会以这个插头.原创 2021-08-08 01:31:04 · 542 阅读 · 0 评论 -
Golang与设计模式-Iterator迭代器模式
迭代器模式在Java和C#中常用到的设计模式,这种模式主要用于对于集合(Aggregate)的有序访问。一般情况下Golang的开发中是不需要使用到的,像Slice跟Array都可以通过for...range...来完成遍历。但不是说一定就用不上哦。接口首先,我们知道迭代器模式主要适用于数据集合,那么我们就可以定义一个集合(Aggregate)接口,这个接口只有一个方法,就是返回给我们一个迭代器(Iterator)。// 集合接口type Aggregate interface { /原创 2021-08-07 13:44:36 · 1199 阅读 · 0 评论 -
Golang的GC垃圾回收机制
Go version1.3,标记清除法(Mark And Sweep)步骤:进行STW(stop the world,暂停程序的业务逻辑),找出不可达的对象和可达的对象 开始标记,程序找出可达内存占用并做标记 清楚未标记的对象,因为未标记的都是不可达的对象 结束STW,程序的业务逻辑继续运行。 整个程序的生命周期内循环执行上述步骤优化:互换第3步与第4步执行顺序,缩小STW影响范围(缩短程序逻辑暂停时间),清楚垃圾动作与程序逻辑并发执行缺点:1. STW(stop the wo原创 2021-08-06 18:54:37 · 195 阅读 · 0 评论 -
Golang与设计模式-简单工厂模式
我们在实例化对象的时候通常用的是New关键字,但是有了工厂(方法/函数),我们在声明对象的时候就可以用工厂了,用new导致代码不够灵活,用工厂来实例化对象很灵活。定义:简单工厂模式的核心思想就是根据输入不同的参数,返回不同的实例。多种参数多种返回值。事例:比如我们有一个生产IPhone的工厂(工厂构造函数),那么我们告诉工厂我们想要的IPhone的型号(iPhone的版本号以函数参数的形式传入),让其为我们生产(返回实例)。type IPhone interface { Logi.原创 2021-08-05 22:15:44 · 279 阅读 · 0 评论 -
Golang二叉树的4种遍历方式(先序,中序,后序,层序)
本文只涉及使用Golang实现的(普通)二叉树的先序、中序、后序和层序的递归遍历方式。二叉树树的任意节点至多包含两棵子树。二叉树的遍历二叉树的遍历是指从二叉树的根结点出发,按照某种次序依次访问二叉树中的所有结点,使得每个结点被访问一次,且仅被访问一次。题目数据我们以上面的这个二叉树图为基础数据编写代码Code基础结构二叉树需要存储自身节点数据,以及最多两个子节点的索引type BinaryTree struct { Value int原创 2021-07-28 12:04:15 · 3448 阅读 · 0 评论 -
Golang程序的优雅退出
我们知道,在使用Linux操作系统运行程序时,我们经常会使用 “Kill -9” 和 “Ctrl + C” 的形式退出程序。所以,我们可以在程序中监听来自系统的退出信号,当主函数接收到退出信号时,再退出程序。像这样:func main() { //接收退出信号的chanel sig := make(chan os.Signal) //指定哪些信号可以转发到chanel,如果没有列出,会将所有信号传递到chanel signal.Notify(sig, syscall.SIGINT, sys原创 2021-07-13 16:57:09 · 1732 阅读 · 0 评论 -
Golang小菜-interface的坑
Golang小菜-interface的坑先看题package mainimport ( "fmt" "reflect")func main() { var data *byte var in interface{} fmt.Println(data, data == nil) fmt.Println(in, in == nil) in = data fmt.Println(in, in == nil)}小伙伴们先猜猜这段代码的输出是什么吧,我们先分析,再看答案!原创 2021-05-07 11:14:17 · 318 阅读 · 1 评论 -
Golang好文分享-GPM调度模型
第一章 Golang调度器的由来第二章 Goroutine调度器的GMP模型及设计思想第三章 Goroutine调度场景过程全图文解析一、Golang“调度器”的由来?(1) 单进程时代不需要调度器我们知道,一切的软件都是跑在操作系统上,真正用来干活(计算)的是CPU。早期的操作系统每个程序就是一个进程,知道一个程序运行完,才能进行下一个进程,就是“单进程时代”一切的程序只能串行发生。5-单进程操作系统.png早期的单进程操作系统,面临2个问题:1.单一的执行流程.转载 2021-04-09 23:56:40 · 446 阅读 · 0 评论 -
Golang小菜-for range
Golang小菜-for rangefor range 是golang特有的循环遍历语法,类似于C#里的foreach。for range 也是我们日常开发使用到最多的遍历方式。// 遍历 数组/切片for index,value := range array{ ...}// 遍历 mapfor key,value := range maps{ ...}// 变量channelfor value := range channel{ ...}接下原创 2021-04-09 13:12:05 · 1017 阅读 · 0 评论 -
Golang小菜-defer
defer 关键字在我们日常开发中是出现频率极高的。defer语句用于延迟调用指定的函数,比如释放资源等。如下,database操作完成后断开链接(随手写的代码)。func process() { cli,err := db.connect("url") if err != nil{ log.Fatal(err) } defer cli.disconnect() cli.insert(.....)}但是defer也是一个有个性的关原创 2021-04-08 01:41:16 · 204 阅读 · 0 评论 -
Ubuntu Golang项目编译报错 cgo: exec gcc: exec: “gcc“: executable file not found in $PATH
Ubuntu Golang项目编译报错 cgo: exec gcc: exec: "gcc": executable file not found in $PATH这个问题原因是项目内有引用c的库.golang在使用cgo调用c的库. 所以是cgo报的错.解决方法:安装gcc就行sudo apt install gcc...原创 2021-03-26 11:43:29 · 8290 阅读 · 0 评论 -
Docker部署Golang项目及镜像优化实战
Docker部署Golang项目及镜像优化实战今天在部署公司的项目时, 了解到目标服务器有Docker环境,于是就想着基于Docker来部署项目这篇文章记录了一次完整的构建镜像到优化的完整过程.基础环境DockerWindows10 (我的工作环境,其他平台操作一样)编辑Dockerfile文件,构建docker镜像基于简单,快速构建部署的原则,我选择在构建docker镜像时编译程序.即 上传项目源代码,通过Dockerfile命令声明完成编译,再运行二进制文件.先展示我的文件目原创 2021-03-24 16:52:20 · 644 阅读 · 0 评论 -
Golang编码习惯-项目代码目录结构和脚本文件、目录命名规则
项目代码目录结构纯属个人习惯总结/cmd *项目列表,这个目录下面,每个文件在编译之后都会生成一个可执行的文件。目录下无多余代码/cmd/webapi/main.go/cmd/sync/main.go/api常用来存放RESTful接口文件/api/swagger.json/api/swagger.yml/api/api.go/configs *配置相关,这个目录下存放初始化配置脚本,配置文件,(如果有)配置映射脚本。/configs/we..原创 2021-03-11 14:46:02 · 1035 阅读 · 1 评论 -
Linux搭建Golang开发环境
Linux搭建Golang环境文章基于Ubuntu环境演示,但适用于所有linux系统1.下载可执行文件考虑到国内的网络环境,所以不推荐搭建从google那边下载,这边用的是go语音中文网提供的资源wget https://studygolang.com/dl/golang/go1.14.13.linux-amd64.tar.gz2.解压到指定文件夹 /usr/localtar -C /usr/local -zxvf go1.14.13.linux-amd64.tar.gz.原创 2021-01-06 11:07:57 · 1263 阅读 · 0 评论 -
Windows环境golang程序开发 报错exec: gcc: executable file not found in %PATH%
这个就是一个缺少gcc编译器的报错而已,只需要下载正确的程序包安装配置好即可1.打开mingw-w64官网,并点击download跳转到下载页面2.选择我们的windows版本安装包,并点击对应连接查看信息3.点击进入包下载界面,会自动下载的4.打开程序包安装5.正确选择自己环境的配置,然后下一步6.选择安装路径,并记下自己的安装路径,因为我们一会儿还需要配置环境变量然后下一步开始安装7.到这里我们的安装已经安装,下一步配置环境变量.原创 2020-06-18 18:15:42 · 19654 阅读 · 6 评论 -
Golang开发Web API服务器,echo框架集成Swagger快速开发API文档
之前在公司用C# + ASP.Net Core开发Web API服务器中,用到Swagger这个插件来生成API文档觉得非常方便。于是最近在学习golang开发Web API服务器的时候想着也集成Swagger到项目中,但是在网上找了很多文档都是不可行的,并且还很复杂,要么就是说一半的,写着写着不知道改怎么写了。但是我不坑人,我接下来分享的我现在学习能够正常使用的方法,并且这篇博文我会在后面的使用过程中,有新的总结或者解决问题的方法都会更新出来。这是要用到的github上的Swagger包链接,原创 2020-06-13 02:08:21 · 1645 阅读 · 0 评论 -
golang web服务器开发使用JsonWebToken(JWT)身份验证
jwt的介绍我就不再写了,之前的文章有介绍过Asp.Net WebApi 使用JsonWebToken(JWT)身份验证,这篇文章主要简单说一下在golang的使用。主要文件package utilsimport ( "github.com/dgrijalva/jwt-go" //引入的jwt包 "time")//自定义Claims,继承包内的Claimstype jwtCustomClaims struct { jwt.StandardClaims // 追原创 2020-06-11 01:19:25 · 576 阅读 · 0 评论 -
goland编译报错cc1.exe: sorry, unimplemented: 64-bit mode not compiled in
主要原因是本地的cc1.exe版本不是64位的,在64位环境下无法编译在网上查了很多方法都失败了,最后还是找到了解决方案https://sourceforge.net/projects/mingw-w64/files/mingw-w64/mingw-w64-snapshot/下载下来解压后,放到自己想放的位置,然后配置环境变量,指向bin目录即可。...原创 2019-10-19 23:48:29 · 6228 阅读 · 3 评论 -
go包下载失败,go get下载失败解决方案,go get golang.org/x 包失败,go代理,goproxy.io
大家都知道,在go工程里引用了墙外的包,导致无法下载所需要的第三方包。要解决这个问题就是加代理。网上各种设置各种换代理的方式我都试过不行,昨天找到一个可行方案,亲测mac,windows都可以正常使用。而且速度还很快哦。直接上连接。===>goproxy这个不仅好用,设置也简单。只需要执行命令行配置环境变量就好。...原创 2019-10-19 12:15:56 · 921 阅读 · 0 评论