蘭陵N梓記

一指流沙,程序年华


  • 首页

  • 归档

  • 关于

  • 搜索
close

入园家长沟通会

时间: 2016-08-29   |   分类: 杂记     |   阅读: 908 字 ~2分钟

时间真是过得太快,转眼儿子要上幼儿园了。昨天是第一次参加儿子的入园家长沟通会。

上幼儿园的意义

上幼儿园是小孩步入社会第一步,是融入世界的起点。脱离原生家庭才能独立成长,幼儿园有孩子同龄的伙伴,可以让孩子收获不同的体验;幼儿园也有专业的老师,可以让孩子快乐自由的探索自己,认识朋友,体验世界。

我平时的工作都比较忙,基本都是早七晚九,白天小孩要么是跟他奶奶,要么是跟他外婆。还好他妈妈是小学老师,晚上能投入一些时间与他相处。大家居住环境比较封闭,邻里来往不多, 小孩基本都是呆在家里的时间居多。他对家的依赖比较多。虽他平时也会经常去他妈妈工作的小学玩,但还是在大家的完全监控下。养孩子的最终目的是为了看着他们独立,幼儿园是教孩子独立的第一步,也是教家长放手的第一步。

阅读全文 »

Hexo NexT主题移植

时间: 2016-08-28   |   分类: 技术     |   阅读: 726 字 ~2分钟

概述

我应该是一个喜欢折腾的技术党。从采用Hugo建静态blog以来,算上今天移植的这个,一共使用了三个主题:

第一个是修改自Hueman,它是一个Wordpress主题。第二个是修改自pacman,它是一个Hexo的主题。

这二个主题都是coderzh最早移植的,我只是在其上修改些布局,增加点功能,换个图片什么。这个过程让我弄清楚了Hugo中模板制作方法。

第三个则是从零开始,移植Github上人气最高的Hexo主题:NexT。正如你现在看到的,NexT是一款简洁又富有动感的主题,当前天我第一眼看到它时,就喜欢上它的风格。于是乎趁着周日,就开始NexT主题移植之旅。

阅读全文 »

Go测试

时间: 2016-08-24   |   分类: 技术     |   阅读: 2213 字 ~5分钟

Go语言内置了测试框架,编写单元测试非常方便。

命名约定

  • 测试代码位于以_test.go结尾的源文件中,一般与源码在同一个package中。

    位于同一个package中的主要原因是:测试可以访问package中不可导出的变量,方法等元素。

  • 测试源码可以修改package名,带上_test结尾

    修改的package名称,不需要再单独新建立目录,也与源码在一个目录下。参考标准库的bytes中的测试代码,方便使用被测试的元素,可以采用.来import测试的package:

    package bytes_test
    
    import (
        . "bytes"
        "io"
        ...
    )
    
阅读全文 »

Goroutine Local Storage

时间: 2016-08-13   |   分类: 技术     |   阅读: 2992 字 ~6分钟

背景

最近在设计调用链与日志跟踪的API,发现相比于Java与C++,Go语言中没有原生的线程(协程)上下文,也不支持TLS(Thread Local Storage),更没有暴露API获取Goroutine的Id(后面简称GoId)。这导致无法像Java一样,把一些信息放在TLS上,用于来简化上层应用的API使用:不需要在调用栈的函数中通过传递参数来传递调用链与日志跟踪的一些上下文信息。

在Java与C++中,TLS是一种机制,指存储在线程环境内的一个结构,用来存放该线程内独享的数据。进程内的线程不能访问不属于自己的TLS,这就保证了TLS内的数据在线程内是全局共享的,而对于线程外却是不可见的。

在Java中,JDK库提供Thread.CurrentThread()来获取当前线程对象,提供ThreadLocal来存储与获取线程局部变量。由于Java能通过Thread.CurrentThread()获取当前线程,其实现的思路就很简单了,在ThreadLocal类中有一个Map,用于存储每一个线程的变量。

阅读全文 »

理解Go Interface

时间: 2016-08-03   |   分类: 技术   笔记     |   阅读: 3421 字 ~7分钟

概述

Go语言中的接口很特别,而且提供了难以置信的一系列灵活性和抽象性。接口是一个自定义类型,它是一组方法的集合,要有方法为接口类型就被认为是该接口。从定义上来看,接口有两个特点:

  • 接口本质是一种自定义类型,因此不要将Go语言中的接口简单理解为C++/Java中的接口,后者仅用于声明方法签名。
  • 接口是一种特殊的自定义类型,其中没有数据成员,只有方法(也可以为空)。

接口是完全抽象的,因此不能将其实例化。然而,可以创建一个其类型为接口的变量,它可以被赋值为任何满足该接口类型的实际类型的值。接口的重要特性是:

  1. 只要某个类型实现了接口所有的方法,那么我们就说该类型实现了此接口。该类型的值可以赋给该接口的值。
  2. 作为1的推论,任何类型的值都可以赋值给空接口interface{}。

接口的特性是Go语言支持鸭子类型的基础,即“如果它走起来像鸭子,叫起来像鸭子(实现了接口要的方法),它就是一只鸭子(可以被赋值给接口的值)”。凭借接口机制和鸭子类型,Go语言提供了一种有利于类、继承、模板之外的更加灵活强大的选择。只要类型T的公开方法完全满足接口I的要求,就可以把类型T的对象用在需要接口I的地方。这种做法的学名叫做"Structural Typing"。

阅读全文 »

理解Go Context机制

时间: 2016-08-02   |   分类: 技术     |   阅读: 3860 字 ~8分钟

什么是Context

最近在公司分析gRPC源码,proto文件生成的代码,接口函数第一个参数统一是ctx context.Context接口,公司不少同事都不了解这样设计的出发点是什么,其实我也不了解其背后的原理。今天趁着妮妲台风妹子正面登陆深圳,全市停工、停课、停业,在家休息找了一些资料研究把玩一把。

Context通常被译作上下文,它是一个比较抽象的概念。在公司技术讨论时也经常会提到上下文。一般理解为程序单元的一个运行状态、现场、快照,而翻译中上下又很好地诠释了其本质,上下上下则是存在上下层的传递,上会把内容传递给下。在Go语言中,程序单元也就指的是Goroutine。

每个Goroutine在执行之前,都要先知道程序当前的执行状态,通常将这些执行状态封装在一个Context变量中,传递给要执行的Goroutine中。上下文则几乎已经成为传递与请求同生存周期变量的标准方法。在网络编程下,当接收到一个网络请求Request,处理Request时,我们可能需要开启不同的Goroutine来获取数据与逻辑处理,即一个请求Request,会在多个Goroutine中处理。而这些Goroutine可能需要共享Request的一些信息;同时当Request被取消或者超时的时候,所有从这个Request创建的所有Goroutine也应该被结束。

阅读全文 »

为什么是Go

时间: 2016-07-23   |   分类: 技术     |   阅读: 3234 字 ~7分钟

HW的执行力就是强,推广Go也是雷力风行,几乎目前是全员皆Go。作为一名其中的参与者,也知目前Go若大规模应用还是有很多的不成熟,风险也非常大。那为什么我司还是选择Go?也来谈谈我个人对为什么选择Go的认识,仅是个人拙见,不代表我司官方的观点。

背景

Go语言主创人员之是C语言与Linux的发明人,所以Go的语法在C的基础之上取众家之精华:

  • 主要继承了C(func, struct,指针)
  • 包管理吸取自Java(package, import)
  • 多态吸取自Python与Ruby(duck type)
  • 并发吸取自Limbo(CSP模型)。
阅读全文 »

Go语言不足

时间: 2016-07-18   |   分类: 技术     |   阅读: 2083 字 ~5分钟

最近公司是在疯狂地推广Go语言,我也是推广小组成员。Go语言的确很多的优点,这里并不想表扬Go语言,而是说说它的不足。

生态不成熟

一个语言的流行,都有其背后的推动者。Go语言是由Google公司创建与推动。最近我司的高层也亲自拜访了Go语言的主创人员。Google称目前已有100+的App从Java转向Go。Google内部主要有三大语言(C++、Java、Python),之前对Go语言的公司内部的政治意义大于它的实际使用。近两年来,语言的战略地位凸显,不断地在推动Go语言的应用。

目前主要使用Go语言的公司是一些创业公司或互联网公司。而这些公司采用Go语言非技术的因素主要有:

  • 公司软件资产积累少,不存在切换其它语言成本,使用Go语言可以轻装上阵;
  • 互联网公司的技术人员流动大,Go语言面向开发简化,招人容易,上手快;
阅读全文 »
9 10 11 12 13 14 15 16 17
兰陵子

兰陵子

Programmer & Architect

164 日志
4 分类
57 标签
RSS 订阅
GitHub 知乎
© 2009 - 2022 蘭陵N梓記
Powered by - Hugo v0.101.0
Theme by - NexT
0%