"b = &boy{}" vs "*b = boy{}" 谁不讲武德?golang 逃逸分析入门

背景最近想要将 protobuf 变量和之前设计的数据对象整合起来,维护在内存中,以减少内存申请和 GC 的性能损耗。feature or bug,gogoproto 解码疑惑由于 gogoproto 在 unmarshal 时不保证输入和输出一致,作为结果的指针变量和输入的字节切片可能不一致(比如说,在 unmarshal slice 时没有 reset 操作)。我们需要对这个指针变量进行重置,pb 生成文件的 reset 实现方法如下。func (m Data) Reset() { m = ...阅读全文

Segmentfault 2021-02-03 09:32:32 .container .car 等

Go - 实现项目内链路追踪

为什么项目内需要链路追踪?当一个请求中,请求了多个服务单元,如果请求出现了错误或异常,很难去定位是哪个服务出了问题,这时就需要链路追踪。从图中可以清晰的看出他们之间的调用关系,通过一个例子说明下链路的重要性,比如对方调我们一个接口,反馈在某个时间段这接口太慢了,在排查代码发现逻辑比较复杂,不光调用了多个三方接口、操作了数据库,还操作了缓存,怎么快速定位是哪块执行时间很长?不卖关子,先说下本篇文章最终实现了什么,如果感兴趣再继续往下看。实现了通过记录如下参数,来进行问题定位,关于每个参数的结构在下...阅读全文

Segmentfault 2021-02-02 23:32:33 .container .car 等

[Go] GO中的字符串底层数据结构

一个字符串是一个不可改变的字节序列,字符串通常是用来包含人类可读的文本数据。和数组不同的是,字符串的元素不可修改,是一个只读的字节数组。每个字符串的长度虽然也是固定的,但是字符串的长度并不是字符串类型的一部分。由于Go语言的源代码要求是UTF8编码,导致Go源代码中出现的字符串面值常量一般也是UTF8编码的。源代码中的文本字符串通常被解释为采用UTF8编码的Unicode码点(rune)序列。字符串的底层数据结构:type StringHeader struct { Data uintptr L...阅读全文

51CTO博客 2021-02-01 19:42:07 mb6013c3565bec6

详解Go内联优化

为了保证程序的执行高效与安全,现代编译器并不会将程序员的代码直接翻译成相应地机器码,它需要做一系列的检查与优化。Go编译器默认做了很多相关工作,例如未使用的引用包检查、未使用的声明变量检查、有效的括号检查、逃逸分析、内联优化、删除无用代码等。本文重点讨论内联优化相关内容。内联在《详解逃逸分析》一文中,我们分析了栈分配内存会比堆分配高效地多,那么,我们就会希望对象能尽可能被分配在栈上。在Go中,一个goroutine会有一个单独的栈,栈又会包含多个栈帧,栈帧是函数调用时在栈上为函数所分配的区域。但...阅读全文

Segmentfault 2021-02-02 15:32:37 .container .car 等

Go语言之环境搭建

本期九星带大家来了解下,Go语言开发的环境搭建。在我目前接触和了解到的编程语言中,我认为Go的环境搭建是最简单的,首先我们来看个小demo,在控制台输出Hello World。 这样在控制台就打印出了Hello World,有没有很简单。接下来,我们进行环境搭建的实际操作:1、安装包下载去,Golang 官网下载:https://golang.google.cn/;在国内,由于墙的原因,你可能无法访问Golang官网,这类推荐,去Golang中文社区,进行安装包的下载,下载地址:https://...阅读全文

简书 2021-02-01 18:34:38 goodcoding

手撸golang 结构型设计模式 代理模式

手撸golang 结构型设计模式 代理模式 缘起 最近复习设计模式 拜读谭勇德的<<设计模式就该这样学>> 本系列笔记拟采用golang练习之 代理模式 代理模式(Proxy Pattern)指为其他对象提供一种代理,以控制对这个对象的访问,属于结构型设计模式。 使用代理模式主要有两个目的:一是保护目标对象,二是增强目标对象。 _ 场景 某订单管理系统, 允许用户对订单进行增删改查 后增加日志需求, 要求对订单的Save和Delete操作, 记录操作日志 后再增加权限需求, 要求对订单的Save...阅读全文

云原生项目实践DevOps(GitOps)+K8S+BPF+SRE,从0到1使用Golang开发生产级麻将游戏服务器—第1篇

banner.png 项目初探 项目地址: 原项目:https://github.com/lonng/nanoserver 调过的:https://github.com/Kirk-Wang/nanoserver 这将是一个完整的,完全践行 DevOps/GitOps 与 Kubernetes 上云流程的 Golang 游戏服务器开发的系列教程。 这个系列教程是对开源项目 Nanoserver 的完整拆解,旨在帮助大家快速上手 Golang(游戏)服务器后端开发。通过实践去理解 Golang 开发...阅读全文

简书 2021-02-01 18:34:32 Hi为少

KubeEdge v1.3部署指南

概述 KubeEdge 是一个开源系统,可将本机容器化的业务流程和设备管理扩展到Edge上的主机。它基于Kubernetes构建,并为网络,应用程序部署以及云与边缘之间的元数据同步提供核心基础架构支持。它还支持MQTT,并允许开发人员编写自定义逻辑并在Edge上启用资源受限的设备通信。KubeEdge由云部分和边缘部分组成,边缘和云部分现已开源,本文将基于Centos7.6系统对KugeEdge进行编译与部署。 一、系统配置 1.1 集群环境 ke-cloud 云端 192.168.2.133 ...阅读全文

简书 2021-02-01 18:32:56 sknfie

最新版本「golang」+「goland」开发环境搭建

程序员的一天 前段时间,因为一些需要,使用到了go语言。 这也是我第一次使用go写代码,感觉还行... 近年,go语言非常热门,很有学习价值。如果大家空余时间比较充足,推荐学习go语言。 新手第一步,当然是开发环境准备。 现将go开发环境的具体搭建过程分享在此! 从golang到goland, 关键是goland的使用,你懂de~ go语言开发环境搭建阅读全文

简书 2021-02-01 18:32:56 程序员的一天

Bash getopt 使用

背景 需要写个shell脚本,运行在服务器上(centos),处理一些简单的参数。 选型 Node.js/Python要考虑服务器上的版本,临时小脚本,也没必要去规范/统一服务器上的版本。 所以选择Bash。 接下来看到小白文章里都会介绍getopt和getopts,就选了个支持长选项(--key1 val1 这样的用法)的getopt, 弯路就此开始。 爬坑 坑1 macOS 上的getopt是 BSD UNIX implementation of standalone getopt comm...阅读全文

简书 2021-02-01 18:32:54 yicone

go发送邮件

SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式,绝大多数语言如C++ Java等都通过库的方式支持了他,当然,go语言也不会例外 很重要 这个一定要写在前面,建议自己尝试的时候呢,多申请几个邮箱. 不要用自己的常用邮箱. 不要用自己的常用邮箱. 不要用自己的常用邮箱. 国内大多数邮箱都有数量限制,单日发的太多容易被封. smtp库 smtp标准库就是golang实现邮件发送的一个标准...阅读全文

简书 2021-02-01 18:32:54 我傻笑你跑掉

详解Go中内存分配源码实现

转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 本文使用的go的源码15.7 介绍 Go 语言的内存分配器就借鉴了 TCMalloc 的设计实现高速的内存分配,它的核心理念是使用多级缓存将对象根据大小分类,并按照类别实施不同的分配策略。TCMalloc 相关的信息可以看这里:http://goog-perftools.sourceforge.net/doc/tcmalloc.html。 即如果要分配的对象是个小对象(<= 32k),...阅读全文

博客园 2021-01-30 16:01 luozhiyun

Go中由WaitGroup引发对内存对齐思考

转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 本文使用的go的源码时14.4 WaitGroup使用大家都会,但是其中是怎么实现的我们也需要知道,这样才能在项目中尽可能的避免由于不正确的使用引发的panic。并且本文也将写一下内存对齐方面做一个解析,喜欢大家喜欢。 WaitGroup介绍 WaitGroup 提供了三个方法: func (wg *WaitGroup) Add(delta int) func (wg *WaitGro...阅读全文

博客园 2021-01-17 15:08 luozhiyun

多图详解Go的sync.Pool源码

转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 本文使用的go的源码时14.4 Pool介绍 总所周知Go 是一个自动垃圾回收的编程语言,采用三色并发标记算法标记对象并回收。如果你想使用 Go 开发一个高性能的应用程序的话,就必须考虑垃圾回收给性能带来的影响。因为Go 在垃圾回收的时候会有一个STW(stop-the-world,程序暂停)的时间,并且如果对象太多,做标记也需要时间。 所以如果采用对象池来创建对象,增加对象的重复利用...阅读全文

博客园 2020-12-26 23:03 luozhiyun

多图详解Go的互斥锁Mutex

转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 本文使用的go的源码时14.4 Mutex介绍 Mutex 结构体包含两个字段: 字段state:表示当前互斥锁的状态。 字段 sema:是个信号量变量,用来控制等待 goroutine 的阻塞休眠和唤醒。 type Mutex struct { state int32 sema uint32 } 在Go的1.9版本中,为了解决等待中的 goroutine 可能会一直获取不到锁,增加了...阅读全文

博客园 2020-12-18 22:53 luozhiyun

Go看源码必会知识之unsafe包

原文链接:戳这里前言有看源码的朋友应该会发现,Go标准库中大量使用了unsafe.pointer,要想更好的理解源码实现,就要知道unsafe.pointer到底是什么?所以今天就与大家来聊一聊unsafe包。什么是unsafe众所周知,Go语言被设计成一门强类型的静态语言,那么他的类型就不能改变了,静态也是意味着类型检查在运行前就做了。所以在Go语言中是不允许两个指针类型进行转换的,使用过C语言的朋友应该知道这在C语言中是可以实现的,Go中不允许这么使用是处于安全考虑,毕竟强制转型会引起各种各...阅读全文

Segmentfault 2021-02-02 15:32:36 .container .car 等

详解并发编程之sync.Once的实现(附上三道面试题)

原文链接:戳这里哈喽,大家好,我是asong,这是我并发编程系列的第二篇文章. 上一篇我们一起分析了atomic包,今天我们一起来看一看sync/once的使用与实现.什么是sync.onceGo语言标准库中的sync.Once可以保证go程序在运行期间的某段代码只会执行一次,作用与init类似,但是也有所不同:init函数是在文件包首次被加载的时候执行,且只执行一次。sync.Once是在代码运行中需要的时候执行,且只执行一次。还记得我之前写的一篇关于go单例模式,懒汉模式的一种实现就可以使用...阅读全文

Segmentfault 2021-02-02 15:32:36 .container .car 等