• 《Go语言核心36讲》的订阅人数已超25000!

    我很高兴,在这个技术专栏上线了一年半之后,它的订阅者已经超过了两万五千人!对于这样一个讲解单一编程语言的专栏来说,我已经知足了。我后面会继续跟进和研究Go语言,但是对于 Go 语言的优势应用场景,比如 Web 服务系统、中间件、云计算等,我恐怕在短时间之内就没有机会再去进一步实践了。最近一年,我一直在忙着写新书,书名叫《Julia编程基础》,预计在2020年6月的下旬上市。这本书主要是面向广大编程爱好者和编程小白的。等这本书正式出版的时候,我还会发文进行介绍。最后,我再次感谢大家对技术专栏《Go语言核心36讲》的厚爱和支持!
  • 深入理解 Go defer

    在上一章节 《深入理解 Go panic and recover》中,我们发现了 defer 与其关联性极大,还是觉得非常有必要深入一下。希望通过本章节大家可以对 defer 关键字有一个深刻的理解,那么我们开始吧。你先等等,请排好队,我们这儿采取后进先出 LIFO 的出站方式... 特性 我们简单的过一下 defer 关键字的基础使用,让大家先有一个基础的认知 一、延迟调用 func main() { defer log.Println("EDDYCJY.") log.Println("en...
  • 深入理解 Go panic and recover

    作为一个 gophper,我相信你对于 panic 和 recover 肯定不陌生,但是你有没有想过。当我们执行了这两条语句之后。底层到底发生了什么事呢?前几天和同事刚好聊到相关的话题,发现其实大家对这块理解还是比较模糊的。希望这篇文章能够从更深入的角度告诉你为什么,它到底做了什么事? 思考 一、为什么会中止运行 func main() { panic("EDDYCJY.") } 输出结果: $ go run main.go panic: EDDYCJY. goroutine 1 [runn...
  • 史上最全的GO语言命令教程

    该教程为gitbook电子书,阅读地址:GO语言命令教程 作者介绍 郝林,从事互联网软件研发和管理工作已有15年,在银行、电信、社交网络、互联网金融、电子商务、大数据等领域都工作过。我对Go语言和Julia语言都情有独钟,并且目前正在独立从事编程教育研究、专业内容输出、在线社群运营等工作。我制作和发布过一些很受欢迎的免费教程、技术图书和付费专栏,其中就包括本教程。另外还有(按时间排序):慕课网的免费教程《Go语言第一课》、人邮图灵的原创技术图书《Go并发编程实战》、极客时间的付费专栏《Go语言核心36讲...
  • 学会使用 context 取消 goroutine 执行的方法

    Go语言里每一个并发的执行单元叫做goroutine,当一个用Go语言编写的程序启动时,其main函数在一个单独的goroutine中运行。main函数返回时,所有的goroutine都会被直接打断,程序退出。除此之外如果想通过编程的方法让一个goroutine中断其他goroutine的执行,只能是在多个goroutine间通过context上下文对象同步取消信号的方式来实现。 这篇文章将介绍一些使用context对象同步信号,取消 goroutine 执行的常用模式和最佳实践,从而让我们能构建更迅捷、...
  • 大神是如何学习 Go 语言之写出优雅的 Go 代码

    Go 语言是一门简单、易学的编程语言,对于有编程背景的工程师来说,学习 Go 语言并写出能够运行的代码并不是一件困难的事情,对于之前有过其他语言经验的开发者来说,写什么语言都像自己学过的语言其实是有问题的,想要真正融入生态写出优雅的代码就一定要花一些时间和精力了解语言背后的设计哲学和最佳实践。  如果你之前没有 Go 语言的开发经历,正在学习和使用 Go 语言,相信这篇文章能够帮助你更快地写出优雅的 Go 语言代码;在这篇文章中,我们并不会给一个长长地列表介绍变量、方法和结构体应该怎么命名,这些 Go...
  • 大神是如何学习 Go 之并发编程与 Context

    Context 是 Golang 中非常有趣的设计,它与 Go 语言中的并发编程有着比较密切的关系,在其他语言中我们很难见到类似 Context 的东西,它不仅能够用来设置截止日期、同步『信号』还能用来传递请求相关的值。 在这一节中就会介绍 Go 语言中这个非常常见的 Context 接口,我们将从这里开始了解 Go 语言并发编程的设计理念以及实现原理。 概述 Go 语言中的每一个请求的都是通过一个单独的 Goroutine 进行处理的,HTTP/RPC 请求的处理器往往都会启动新的 Gor...
  • Go编程时光,一个零基础入门 Golang 的教程

    今天分享一本适合新手入门的Go语言书籍 Go编程时光。 阅读地址:Go编程时光 GitHub主页:https://github.com/iswbm/GolangCodingTime 第一章:基础知识 1.1 一文搞定开发环境的搭建 1.2 五种变量创建的方法 1.3 数据类型:整型与浮点型 1.4 数据类型:byte、rune与字符串 1.5 数据类型:数组与切片 1.6 数据类型:字典与布尔类型 1.7 数据类型:指针 1.8 流程控制:if-else 1.9 流程控制:switch-case...
  • 深入iris mvc

    知识点 Iris控制器(controller) Iris中间件(middleware) 控制器(controller) 控制器是Iris支持的重要特性之一,他能够非常清晰、方便的去定义和管理接口。 Iris controller的设计思想是约定优于配置,只要按照他Iris的约定规则来编写代码即可很简单地完成一个controller,下面我们通过一个实例来了解一下,代码如下: package main import ( "github.com/kataras/iris" "git...
  • 深度解密Go语言之sync.map

    而 sync.map 则是一种并发安全的 map,在 Go 1.9 引入。sync.map 是线程安全的,读取,插入,删除也都保持着常数级的时间复杂度。sync.map 的零值是有效的,并且零值是一个空的 map。而使用 sync.map 之后,对 map 的读写,不需要加锁。程序输出:18stefno20qcrao18<nil>false20sync.map 适用于读多写少的场景。源码分析数据结构先来看下 map 的数据结构。去掉大段的注释后:typeMapstruct{muMutexreadatomic.Value//readOnlydirtymap[interface{}]*entrymissesint}互斥量 mu 保护 read 和 dirty。dirty 是一个非线程安全的原始 map。read map 和 dirty map 的存储方式是不一致的。read 使用 atomic.Value,这是 lock-free 的基础,保证 load/store 的原子性。read 字段里实际上是存储的是://readOnlyisanimmutablestructstoredatomicallyintheMap.readfield.typereadOnlystruct{mmap[interface{}]*entryamendedbool//trueifthedirtymapcontainssomekeynotinm.}注意到 read 和 dirty 里存储的东西都包含 entry,来看一下:typeentrystruct{punsafe.Pointer//*interface{}}很简单,它是一个指针,指向 value。
  • Go语言中的数组和切片 len cap append copy

    Go的数组和切片都是从c语言中延续过来的设计。增加的方式只有一种,使用append函数追加。sliceTmp=appendsliceTmp=append每个切片有长度len和容量cap两个概念,长度是我们最熟知的,和数组长度相同,可以直接用来遍历。每次append时,如果发现cap已经不足以给len使用,就会重新分配原cap两倍的容量,把原切片里已有内容全部迁移过去。切片的长度与容量,len cap append copyslice1:=[]int{1,2,3}普通切片的声明方式,长度和容量是一致的。尝试扩容slice1=append输出,可以发现len扩容了!
  • 指针的详细讲解

    指针是一个代表着某个内存地址的值, 这个内存地址往往是在内存中存储的另一个变量的值的起始位置. Go语言对指针的支持介于Java语言和 C/C++ 语言之间, 它既没有像Java那样取消了代码对指针的直接操作的能力, 也避免了 C/C++ 中由于对指针的滥用而造成的安全和可靠性问题. 指针地址和变量空间 Go语言保留了指针, 但是与C语言指针有所不同. 主要体现在: 默认值: nil. 操作符 & 取变量地址, * 通过指针访问目标对象. 不支持指针运算, 不支持 -> 运算符, 直接用 . 访问...
  • bbs-go 3.1.1 版本发布,支持`推文`功能

    更新内容 新特性:支持推文功能,快捷发表推文,沟通更顺畅(推文图片支持粘贴板上传、拖拽上传) 新特性:支持图片LazyLoad功能,按需加载、快速省带宽 新特性:支持配置默认发帖节点 新特性:文件支持上传到服务器(之前仅支持上传到阿里云OSS) 新特性:首页导航栏添加快速发帖入口 增强:调整多处样式细节,做一个追求完美的人 Bugfix:修复后台修改用户密码和角色的BUG Bugfix:修复后台友情链接LOGO显示问题 Bugfix:修复编辑内容为空的话题时,读取内容错误的问题 Bugfix:修复话题修...
  • 在 Go 中使用 Viper 加载配置文件

    使用任何编程语言开发工程化的项目都缺少不了配置,我们可能要存储一些数据库信息、邮件配置、其他的第三方服务密钥等,而配置文件的类型又有很多种,比如 XML、JSON、YML、INI 等,配置文件又可能分为不同的环境,如 dev、test、prod,这篇文章中带你了解在 Go 中加载配置信息那些事儿。 加载配置的方式 所有的程序一开始都是没有框架的,那我们怎么做呢?还好 Go 语言的标准库封装的足够优秀,标准库已经有了 json 解析的包,如果你只想解析 yaml 可以试试 yaml 这个库。 我们假设现在...
  • Go的方法集详解

    本文作者经过对go语言的多年实践应用,现对go语言中的方法集进行了一次详细的总结,并通过实验进行了验证,相信对于go语言爱好者有很大的帮助。类型*Student方法集包含了showName()方法和setName()方法。2方法集和方法接受者的关系在上面的案例中,类型Student的方法集并不包含了setName()方法,那么是不是Student类型变量,就不能调用setName()方法呢?实例value或pointer可以调用全部的方法,编译器会自动转换。3方法集和接口接口的定义接口是一个或多个方法签名的集合。任何类型的方法集中只要拥有该接口“对应的全部方法”声名。对应的全部方法:是指有相同名称、参数列表 以及返回值。
公告

《从零开始开发BBS》课程上线啦,快来跟着我一步步搭建属于你的BBS吧。

课程地址:https://www.shiyanlou.com/courses/1436
9折优惠邀请码: ZHwfIjb1

该课程会带领大家一步步的了解并熟悉Go语言开发,如果你是一个Go语言初学者,或者正准备学习Go语言,那么这个课程非常适合你。如果你熟练掌握了本课程中的知识点,相信你就已经入门Go语言开发,并能胜任日常的开发工作了。