Go官方工具链用法详解

Go官方工具链用法详解

Go官方工具链 为了从任意目录运行Go官方工具链中工具命令(通过go命令), Go官方工具链安装目录下的bin子目录路径必须配置在PATH环境变量中。 当使用安装程序安装Go官方工具链时,安装程序很可能已经自动地将此配置好了。windows环境中需要在把安装目录下bin子目录添加到高级系统环境变量中保存生效。 Go官方工具链近来的版本都支持一个称为Go模块(Go modules)的特性, 用来管理项目依赖。此特性在版本1.11中被试验性引入, 在版本1.16中被默认支持。 第一个环境变量 我们应该了解一个环境...

2022-11-25 217 0
Go语言--切片(Slice)详解

Go语言--切片(Slice)详解

说明: Go 语言切片是对数组的抽象。 Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go中提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。 一、定义切片 注意:切片不需要说明长度 1、声明一个未指定大小的数组来定义切片 var identifier []type //例如 var slice []int 2、使用make()函数来创建切片 var slice1 []type =...

2022-11-25 222 0
golang交叉编译详细

golang交叉编译详细

1、环境变量对照表 golang交叉编译环境变量对照表 GOOS | GOARCH | OS VERSION ---|---|--- linux | 386 / amd64 / arm | >= Linux 2.6 darwin | 386 / amd64 | OX X (Snow Leopard + Lion) freebsd | 386 / amd64 | >= FreeBSD 7 windows | 386 / amd64 | >= Windows 2000...

2022-11-25 207 0
Go 泛型和非泛型代码详解

Go 泛型和非泛型代码详解

1. 开启泛型 在 Go1.17 版本中,可以通过: export GOFLAGS="-gcflags=-G=3" 或者在编译运行程序时加上: go run -gcflags=-G=3 main.go 2.无泛型代码和泛型代码 2.1. AddSlice 首先看现在没有泛型的代码:  package main ​ import ( "fmt" ) ​ func AddIntSlice(input []int, diff int)...

2022-11-25 204 0
Go语言基础语法之结构体及方法详解

Go语言基础语法之结构体及方法详解

结构体类型可以用来保存不同类型的数据,也可以通过方法的形式来声明它的行为。本文将介绍go语言中的结构体和方法,以及“继承”的实现方法。 结构体类型 结构体类型(struct)在go语言中具有重要地位,它是实现go语言面向对象编程的重要工具。go语言中没有类的概念,可以使用结构体实现类似的功能,传统的OOP(Object-Oriented Programming)思想中的继承在go中可以通过嵌入字段的方式实现。 结构体的声明与定义: // 使用关键字 type 和 struct 定义名字为Person结构...

2022-11-25 209 0
Go并发编程实现数据竞争

Go并发编程实现数据竞争

1.前言 虽然在 go 中,并发编程十分简单, 只需要使用 go func() 就能启动一个 goroutine 去做一些事情,但是正是由于这种简单我们要十分当心,不然很容易出现一些莫名其妙的 bug 或者是你的服务由于不知名的原因就重启了。 而最常见的bug是关于线程安全方面的问题,比如对同一个map进行写操作。 2.数据竞争 线程安全是否有什么办法检测到呢? 答案就是 data race tag,go 官方早在 1.1 版本就引入了数据竞争的检测工具,我们只需要在执行测试或者是编译的时候加上 -ra...

2022-11-25 210 0
golang进行简单权限认证的实现

golang进行简单权限认证的实现

使用JWT进行认证 JSON Web Tokens (JWT) are a more modern approach to authentication. As the web moves to a greater separation between the client and server, JWT provides a wonderful alternative to traditional cookie based authentication models. JWTs provide...

2022-11-25 199 0
Go语言中CGO的使用实践

Go语言中CGO的使用实践

       部门产品业务功能采用Golang开发,但是有些功能是用c写的,比如说net-snmp,bfd协议等等,像这些如果使用GO语言重编的话,既有实现的复杂度也需要相当长的时间,好在GO语言提供了CGO机制,使得能够在go代码中直接调用C的库函数,大大提高了效率,减少了重复开发工作,此外还支持在C语言中调用GO函数,这一点还是蛮强大的。 1. Go语言调用C函数例子: package main // // 引用的C头文件需...

2022-11-25 187 0
go语言yaml转map、map遍历的实现

go语言yaml转map、map遍历的实现

yaml文件内容 apiVersion: policy/v1beta1 kind: PodSecurityPolicy metadata: name: mysql-snapshot spec: privileged: false allowPrivilegeEscalation: false volumes: - "*" hostNetwork: false hostIPC: false hostPID: false runAsUser:...

2022-11-25 233 0
go语言实现mqtt协议的实践

go语言实现mqtt协议的实践

一、什么是MQTT MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。 MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用 MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。...

2022-11-25 210 0
一些关于Go程序错误处理的相关建议

一些关于Go程序错误处理的相关建议

前言 Go的错误处理这块是日常被大家吐槽较多的地方,我在工作中也观察到一些现象,比较严重的是在各层级的逻辑代码中对错误的处理有些重复。 比如,有人写代码就会在每一层都判断错误并记录日志,从代码层面看,貌似很严谨,但是如果看日志会发现一堆重复的信息,等到排查问题时反而会造成干扰。 今天给大家总结三点Go代码错误处理相关的最佳实践给大家。 这些最佳实践也是网上一些前辈分享的,我自己实践后在这里用自己的语言描述出来,希望能对大家有所帮助。 认识error Go程序通过error类型的值表示错误 error...

2022-11-25 211 0
详解如何在Go服务中做链路追踪

详解如何在Go服务中做链路追踪

使用 Go 语言开发微服务的时候,需要追踪每一个请求的访问链路,这块在 Go 中目前没有很好的解决方案。 在 Java 中解决这个问题比较简单,可以使用 MDC,在一个进程内共享一个请求的 RequestId。 在 Go 中实现链路追踪有两种思路:一种是在项目中使用一个全局的 map, key 是 goroutine 的唯一 Id,value 是 RequestId,另一种思路可以使用 context.Context 来实现。 下面的代码基于 gin 框架来实现。 1. 使用全局 map 来实现 使用...

2022-11-25 185 0
谈论Go 什么时候会触发 GC问题

谈论Go 什么时候会触发 GC问题

在早期经常遭到唾弃的就是在垃圾回收(下称:GC)机制中 STW(Stop-The-World)的时间过长。那么这个时候,我们又会好奇一点,作为 STW 的起始,Go 语言中什么时候才会触发 GC 呢? 1、什么是 GC 在计算机科学中,垃圾回收(GC)是一种自动管理内存的机制,垃圾回收器会去尝试回收程序不再使用的对象及其占用的内存。 最早 John McCarthy 在 1959 年左右发明了垃圾回收,以简化 Lisp 中的手动内存管理的机制(来自 @wikipedia)。 2、为什么要 GC 手动管理内...

2022-11-25 214 0
Go语言变量与基础数据类型详情

Go语言变量与基础数据类型详情

一、基础介绍 Go 是静态(编译型)语言,是区别于解释型语言的弱类型语言(静态:类型固定,强类型:不同类型不允许直接运算) 例如 python 就是动态强类型语言 1、Go 的特性 跨平台的编译型语言,交叉编译 管道(channel),切片(slice),并发(routine) 有垃圾回收机制 支持面向对象和面向过程的编程模式(Go 的面向对象没有类的概念) 2、Go 的常用命令 go env // go的环境变量 -GO111MODULE= // 空的,现在没有使用MO...

2022-11-25 197 0
Go语言中的逃逸分析究竟是什么?

Go语言中的逃逸分析究竟是什么?

1、逃逸分析介绍 学计算机的同学都知道,在编译原理中,分析指针动态范围的方法称之为逃逸分析。通俗来讲,当一个对象的指针被多个方法或线程引用时,我们称这个指针发生了“逃逸”。 Go语言的逃逸分析是编译器执行静态代码分析后,对内存管理进行的优化和简化,它可以决定一个变量是分配到堆还栈上。 写过C/C++的小伙伴应该知道,使用比较经典的malloc和new函数可以在堆上分配一块内存,这块内存的使用和回收(销毁)的任务在程序员中,处理不当,很可能会发生内存泄露。 2、Go中内存分配在哪里? 但是在Go语言中...

2022-11-25 200 0