a

收录了 18 篇文章 · 2 人关注

  • Golang 源码剖析:fmt 标准库 --- Print* 是怎么样输出的?

    Golang 源码剖析:fmt 标准库 --- Print* 是怎么样输出的? 原文地址:Golang 源码剖析:fmt 标准库 前言 package main import ( "fmt" ) func main() { fmt.Println("Hello World!") } 标准开场见多了,那内部标准库又是怎么输出这段英文的呢?今天一起来围观下源码吧 ???? 原型 func Print(a ...interface{}) (n int, err error) { return Fpri...

  • Go 语言中的递归和尾调用操作

    曾几何时,我看过一段关于 Go 递归函数的简单例子,作者用了极快的速度简单的陈述了 Go 这门语言中并没有优化递归这一操作,即使是在尾调用(tail calls)非常明显的时间。我当时并不理解什么是尾调用(tail calls),我非常想知道这位作者提到的 Go 语言没有优化递归操作的原因是什么,因为我从来不知道原来递归操作还可以被优化。 有些人不太理解什么是递归操作,其实可以用一种简单的说法来解释,就是函数自己调用自己本身。 那为什么我们会需要写一个函数来调用自己本身呢?举个例子,递归算...

  • Go 语言编译器的 "//go:" 详解

    前言 C 语言的 #include 一上来不太好说明白 Go 语言里 //go: 是什么,我们先来看下非常简单,也是几乎每个写代码的人都知道的东西:C 语言的 #include。 我猜,大部分人第一行代码都是 #include 吧。完整的就是#include <stdio.h>。意思很简单,引入一个 stdio.h。谁引入?答案是编译器。那么,# 字符的作用就是给 编译器 一个 指示,让编译器知道接下来要做什么。 编译指示 在计算机编程中,编译指示(pragma)是一种语言结构,它指示编译器应该...

  • Go语言interface底层实现

    Go的interface源码在Golang源码的runtime目录中。 Go在不同版本之间的interface结构可能会有所不同,但是,整体的结构是不会改变的,此文章用的Go版本是1.11。 Go的interface是由两种类型来实现的:iface和eface。 其中,iface表示的是包含方法的interface,例如: type Person interface { Print() } 复制代码而eface代表的是不包含方法的interface,即 type Person interface...

  • Go 语言核心文件调试

    程序调试对于检查和理解程序运行过程和状态是非常有用的。 一个核心转储文件( core dump file )中包含程序进程运行时的内存信息和进程状态。它主要用于程序的问题调试,以及在运行过程中理解程序的状态。这些对于我们诊断程序问题原因和分析生产环境中的服务问题有非常大的帮助。 在本文中,我会用一个非常简单的 hello world 网页应用服务举例,实际情况,我们的程序会更加复杂。对核心转储文件的分析意义在于可以帮助我们查看程序当时的运行情况,并可能让我们有机会重现当时的程序问题。...

  • [翻译]编译器(9)-解析

    原文在此。 ————翻译分隔线———— 编译器(9)-解析 第一部分:介绍 第二部分:编译、转译和解释 第三部分:编译器设计概览 第四部分:语言设计概述 第五部分:Calc 1 语言规格说明书 第六部分:标识符 第七部分:扫描 第八部分:抽象语法树 长征已经走了很远。我们概览了扫描和抽象语法树的基本概念。现在终于可以向着解析前进。 如果你已经开始与概念点不停的斗争,那么我需要警告你,从现在开始会变得越来越难。解析可能是你脑袋里已有的概念中最难的部分。我们将处理扫描器发现的词素,给它们提供一个含义...

  • Go语言TCP网络编程(详细)

    一、序言 Golang的主要 设计目标之一就是面向大规模后端服务程序,网络通信这块是服务端 程序必不可少也是至关重要的一部分。在日常应用中,我们也可以看到Go中的net以及其subdirectories下的包均是“高频+刚需”,而TCP socket则是网络编程的主流,即便您没有直接使用到net中有关TCP Socket方面的接口,但net/http总是用到了吧,http底层依旧是用tcp socket实现的 网络编程方面,我们最常用的就是tcp socket编程了,在posix标准出来后,so...

  • Go的50坑:新Golang开发者要注意的陷阱、技巧和常见错误[2]

    目录 初级篇 开大括号不能放在单独的一行 未使用的变量 未使用的Imports 简式的变量声明仅可以在函数内部使用 使用简式声明重复声明变量 偶然的变量隐藏Accidental Variable Shadowing 不使用显式类型,无法使用“nil”来初始化变量 使用“nil” Slices and Maps Map的容量 字符串不会为“nil” Array函数的参数 在Slice和Array使用“range”语句时的出现的不希望得到的值 Slices和Arrays是一维的 访问不存在的Map ...

  • Go 语言运行时环境变量快速导览

    原文: http://dave.cheney.net/2015/11/29/a-whirlwind-tour-of-gos-runtime-environment-variables Go 语言运行时环境变量快速导览 介绍: Go Runtime除了提供:GC, goroutine调度, 定时器,network polling等服务外, 还提供其它一些工具设施,用于开启额外的调试输出, 或是改变Go Runtime自身的一些行为。这些工具设施由传给Go program的一些环境变量控制, 本文主...

  • Go语言中反射包的实现原理(The Laws of Reflection)

    前言 过去只是知道某些语言带有反射,但是一直没机会使用这种高级功能,所以也没有深入了解过。昨天看golang时里面提到reflection,既然这么多语言支持这个性质,那就深入了解下好了。这篇文档翻译自官方文档的The Laws of Reflection,翻译目的不是为了翻译,而是加深自己记忆以及理解,所以有些地方可能不会直译,因为我没那么高水平,有时自己能看懂,但是按着原话翻译出来给别人听感觉好难。某些专用名词会继续保留原文,有时,其实我觉得还是英文更加容易理解。 The Laws of R...

  • 只用200行Go代码写一个自己的区块链!

    区块链是目前最热门的话题,广大读者都听说过比特币,或许还有智能合约,相信大家都非常想了解这一切是如何工作的。这篇文章就是帮助你使用 Go 语言来实现一个简单的区块链,用不到 200 行代码来揭示区块链的原理!高可用架构也会持续推出更多区块链方面文章,欢迎点击上方蓝色『高可用架构』关注。 “用不到200行 Go 代码就能实现一个自己的区块链!” 听起来有意思吗?有什么能比开发一个自己的区块链更好的学习实践方法呢?那我们就一起来实践下! 因为我们是一家从事医疗健康领域的科技公司,所以我们采用人类平静...

  • golang连接mysql操作及动态连接池设置

    golang本身没有提供连接mysql的驱动,但是定义了标准接口供第三方开发驱动。这里连接mysql可以使用第三方库,第三方库推荐使用https://github.com/Go-SQL-Driver/MySQL这个驱动,更新维护都比较好。下面演示下具体的使用,完整代码示例可以参考最后。 下载驱动 sudo go get github.com/go-sql-driver/mysql 数据库连接 db, err := sql.Open("mysql", "user:password@tcp(loca...

  • 【玩转Golang】slice切片的操作——切片的追加、删除、插入等

    一、一般操作 1,声明变量,go自动初始化为nil,长度:0,地址:0,nil func main(){ var ss []string; fmt.Printf("length:%v \taddr:%p \tisnil:%v",len(ss),ss, ss==nil) } --- Running... length:0 addr:0x0 isnil:true Success: process exited with code 0. 2,切片的追加,删除,插入操作 func main(){ var...

  • 120
    Go 语言机制之逃逸分析(Language Mechanics On Escape Analysis)

    ## 前序(Prelude) 本系列文章总共四篇,主要帮助大家理解 Go 语言中一些语法结构和其背后的设计原则,包括指针、栈、堆、逃逸分析和值/指针传递。这是第二篇,主要介绍堆和逃逸分析。 以下是本系列文章的索引: 1. [Go 语言机制之栈与指针](https://studygolang.com/articles/12443) 2. [Go 语言机制之逃逸分析](https://studygolang.com/articles/12444) 3. [Go 语言机制之内存剖析]...

  • golang 内存分析/动态追踪

    golang pprof 当你的golang程序在运行过程中消耗了超出你理解的内存时,你就需要搞明白,到底是 程序中哪些代码导致了这些内存消耗。此时golang编译好的程序对你来说是个黑盒,该 如何搞清其中的内存使用呢?幸好golang已经内置了一些机制来帮助我们进行分析和追 踪。 此时,通常我们可以采用golang的pprof来帮助我们分析golang进程的内存使用。 pprof 实例 通常我们采用http api来将pprof信息暴露出来以供分析,我们可以采用net/http/pprof 这...

  • [golang]为什么Response.Body需要被关闭

    Body io.ReadCloser The http Client and Transport guarantee that Body is always non-nil, even on responses without a body or responses with a zero-length body. It is the caller's responsibility to close Body. The default HTTP client's Transport does n...

  • golang

    技巧: 在本地查看golang文档,在dos目录下执行 godoc -http=:8080 然后,输入 http://localhost:8080 即可. 中文版指南:http://go-tour-zh.appsp0t.com/#3 以下为收集的一些golang的学习资料: 最权威的教程非 http://golang.org 莫属了,但经常被翻墙.解决办法可修改host文件,添加下面一行即可. 173.194.71.141 golang.org tour.golang.org talks.gol...

  • 120
    Go 调优技术

    ## 内存管理 在开始探索 Go 调优技术和工具之前,我们需要先了解一下 Go 内存模型,它可以帮助我们理解内存是如何使用的。 Go 实现的是 _并行的_ [标记-清除垃圾回收器](http://wiki.c2.com/?MarkAndSweep)。在 _传统的_ 标记-清除模型中,垃圾回收器会先让程序停下来(也就是,“stop the world”),然后查找已经失效的对象,并把这些对象清理掉(也就是,释放内存)。因为程序在运行中会移动引用(references),导致垃圾的识别和...