鸿渐于陆

本想着写满十八式,但按照目前的进度来看,是很难凑够十八式了。所以还是那句话,量力而行,适可而止。能写多少就写多少,我没法保证看完这本golang脱口秀,一定能成为golang大拿。但入了门,能自力更生开始写golang段子应该差不多。

技术这点事,说破天就是熟练工。一个知识点,一次不懂,就看两遍。两次不行,就来三遍。熟能生巧,巧能夺天。多少个大牛也是从一行一行代码中走过来的。毕竟像李一男这样开挂的技术太少了,绝大多数的coder生涯还是依靠代码量堆砌起来的。

我还在上大学的时候,计算机课程分为量大专业方向:理论研究和应用实践。理论研究就是研究各种算法原理,偏向于数学。应用实践则偏向于想法落地,也就是编码实现。那会总觉得写代码是一件非常有挑战性和有前途的事情,而研究算法,枯燥无聊,没有出路。

10年之后,我错了。

写代码的永远是民工,只不过是稍微高级一丢丢儿的民工。研究算法的,终归是比民工高级的金领级民工。在IT程序员这行,牛逼的算法不好找,写代码的程序员一大堆。所以算法最终要比代码重要。

多少次,想从写代码转行到研究算法,但总以失败而告终。原来有些债欠了就永远没机会去还了。人生能有几个10年,一个十年已然逝去,下个十年悄然到来。用了十年的时光,才明白数学不是摆设。难不成还需要再用一个十年来弥补这个过错?

或许弯道超车这四个字仅限于纸面之上,而现实却已经永远丧失了超车的机会。有些机会丧失了就是真的丧失了,机会是为有准备的人来准备的,但为了这个准备,你又需要很长时间的准备。厚积薄发,可能就是这个意思吧。

对于程序员来说,很多人都是这是一个青春饭。放到以前,我会嗤之以鼻,莞尔一笑。但现在我发自内心的表示认同,中国是没有程序员情怀的。中国的程序员黄金时间是在25~32岁,这段时间,可以尽情的加班,尽情的熬夜,尽情的迸发灵感,尽情的肆无忌惮。而一旦过了黄金时间的程序员们,就需要考虑养家,需要考虑生活,需要考虑和同龄人之间的财富差距也需要考虑自己下一代的未来。精力有限,家庭慢慢占据了精力的大头。对待编码,纵然还有十分的热情,但已经无法奉献五分的精力。

如果旁边又有一群优越的同龄人在刺激你,那种滋味着实的难受。

不是故意贬低程序员这份职业,而这是实实在在的社会困境。而这个问题,以前总是刻意回避,但现在已经无法逃避。对于这个问题,每个人都有自己的答案。毕竟路是自己选的,再苦再累也要走下去。

来自朝鲜的问候

今日在看这本书的数据统计时,发现了居然有一个来自朝鲜的UV,一时激动特意拍照留念

为了纪念这个特殊的时刻,本节特意取名<来自朝鲜的问候>。也不知道是朝鲜哪位兄台访问此本书,从PV上面来看只点击了10次,估计八成是看不懂中文,随便点了点就走了。 但对于我来说,这个UV却显得弥足珍贵。也不知道这位用户是"革命武装力量的最高领导人"的哪位亲戚好友,如果能看到这篇文章,可否引荐一下?(이 사람이'혁명 무장 역량의 최고 지도자'라고 할 수 있는 어느 친척인 데,이 글을 볼 수 있 다면, 추천을 받을 수 있 을지도 모 른다.)

话说回来,技术无国界。我们一衣带水的邻居想学点技术怎么了?想看点入门教程又怎么了?你们那里招聘Golang工程师不?我可以在家办公,远程帮助你们解决问题,冲着这份伟大的国际友谊,我都不好意思提钱的事情,您看着给!(당신들은 Golang 엔지니어를 채용 합니까?나는 집에서 일 할 수 있고, 장거리도 너희들에게 문제를 해결하고,이 위대 한 국제적인 우정을 가지고 있 는데,나는 돈을 말 할 수 없는 일을, 당신이 바라 보고 있다!)

谢谢有道词典,把我的意思翻译的八九不离十,除了有道,暂时没有好用的翻译软件了,只能忍之再忍。如果你也想参与到这场伟大的技术革命浪潮中,留个联系方式给我。等哪天金正恩同志召唤我了,我再组团召唤你们。为了革命!我们时刻在准备着(혁명을 위하여!우리는 항상 준비하고 있다.)。朝鲜朋友看到这里就可以了,下面我要写golang了。

我的风格一向是想到哪里,就写到哪里。前几天在写程序的时候,有一段死循环了。仔细看了看,是递归算法的退出条件有问题了。这节就先说递归吧。

递归

简单来说,递归就是重复调用同一个函数过程来解析相同的问题。转换成人话,就是自己调自己。伪代码如下:

func recursion() {
recursion()
}
func main() {
recursion()
}

大多数程序语言都支持这种调用方式,使用递归时,一定要注意退出条件,否则就会跟我一样,出现死循环!因为递归属于算法中的一种,按道理来说应该是放在算法书中讲解最好。所以就用一个例子来提醒所有使用递归的人,一定要注意退出条件!

package main

import "fmt"

func fibonaci(i int) (ret int) {
if i == 0 {
return 0
}
if i == 1 {
return 1
}
return fibonaci(i-1) + fibonaci(i-2)
}
func main() {
var i int
for i = 0; i < 10; i++ {
fmt.Printf("%d ", fibonaci(i))
}
}

上面两个if就是用来判断退出条件的。如果退出条件,写得好,递归就不会出现问题。在我的死循环案例中,是在if环节,用来判断两个变量类型是否一致时出现了问题,导致永远是false,因此死了循环%>_<%。于是乎,趁热打铁,下面说一下Golang如何进行类型强转。

类型转换和类型断言

Golang中涉及到类型的操作有两种,一种是类型转换,一种是类型断言。

先说类型转换,Golang的类型分为两种,一种是静态类型,一种是底层类型。比如:

type myString string

通过type关键字声明了自己的类型myString。myString则是静态类型,而string则是底层类型。如果底层类型相同,则两种类型可以转换成功,反之则失败。如果不知道底层类型,则可以调用reflect的Kind方法来获取,如下:

fmt.Printf("%v",reflect.Kind(count))
--
int32

在Golang当中还有接口类型interface{}。很多时候,会将普通类型转换成interface{},这个过程是隐式推导,用户无感知。但如果反向,将interface{}向普通类型进行转换,则需要进行显示推导。这个时候就需要进行类型断言.

断言方式分两种:

第一种,Comma-ok:

value, ok := element.(T)
比如:
var a interface{}
value, ok := a.(string)
if !ok {
fmt.Println("It's not ok for type string")
return
}

如果OK == true,表示a是string类型。反正,则表示不是string类型。

第二种,switch判断:

var t interface{}
t = functionOfSomeType() switch t := t.(type) {
case bool:
fmt.Printf("boolean %t\n", t) // t has type bool
case int:
fmt.Printf("integer %d\n", t) // t has type int
case *bool:
fmt.Printf("pointer to boolean %t\n", *t) // t has type *bool
case *int:
fmt.Printf("pointer to integer %d\n", *t) // t has type *int
default:
fmt.Printf("unexpected type %T", t) // %T prints whatever type t has
}

优点就是可以节省代码,本质和Comma-OK一样。

综合起来,golang类型转换就是三条规则:

  1. 普通类型向interface{}转换是隐式。
  2. interface{}向普通类型转换必须显示
  3. 强制转换时,最好使用类型断言,防止panic。

还是最补充一句吧,转载请保留我的邮箱。 ztao8607@gmail.com

来自朝鲜的问候 golang入坑系列的更多相关文章

  1. 初生牛犊不怕虎 golang入坑系列

    读前必读,下面所有内容都是来自这里. 放到这里的目的,就是为了比对一下,哪里的读者多.平心而论,同样的Markdown,博客园排版真心X看,怎么瞅怎么X看.(X := '难' || X :='耐' | ...

  2. 入坑第二式 golang入坑系列

    史前必读: 这是入坑系列的第二式,如果错过了第一式,可以去gitbook( https://andy-zhangtao.gitbooks.io/golang/content/ )点个回放,看个重播.因 ...

  3. 维多利亚的秘密 golang入坑系列

    原文在gitbook,字字原创,版权没有,转载随意. 在写本文的前一天,2017维密在上海开始了. 为了纪念屌丝界的盛世,特为本节起名维多利亚的秘密.现在的社会,要想出名只有抓眼球.所以写份技术文章, ...

  4. 分水岭 golang入坑系列

    第三式开篇语有些负面, 所以这里就不贴了.有兴趣的自己可以去看看 https://andy-zhangtao.gitbooks.io/golang/content/ .怒发冲冠,意气之作.看完就完了, ...

  5. SEO是件贼有意思的事情 golang入坑系列

    这两天迷上了SEO.真心看不起百度的竞价排名,但作为一个商业网站,赚钱是一件无可厚非的事情.只做活雷锋,没有大金主是做不长的.做完功课后,发现百度和google的SEO策略又不相同,几乎是无法通用.百 ...

  6. 准备冲锋 golang入坑系列

    史前摘要: 本来想写读前必读,但连续几篇博文都写读前必读,感觉就没有了新意. 所以换成史前摘要,反正是一个意思. 此摘要的目的仍然是提醒点击而来的同学,本系列最新文章在这里.放到博客园的目的是为了方便 ...

  7. 坐忘峰 golang入坑系列

    读前必读: 本文写于20日,首发于gitbook. 迟到的是日期,没变的是内容. 点击进入 https://andy-zhangtao.gitbooks.io/golang/content/ 可以看到 ...

  8. 崩溃 golang入坑系列

    早上(11.30)收到邮件,Vultr东京机房网络故障.当时搭建SS时,考虑到了机房故障.所以特意分出了日本和香港两条线路.但千算万算,忘记数据库还在东京机房中. 现在网络故障,SS服务器无法读取数据 ...

  9. 乐呵乐呵得了 golang入坑系列

    开场就有料,今天返回去看了看以前的文章,轻松指数有点下降趋势.一琢磨,这不是我的风格呀.一反思,合着是这段时间,脑子里杂七杂八的杂事有点多,事情一多,就忘了快乐.古话说得好:愁也一天,乐也一天,只要还 ...

随机推荐

  1. django中使用sha1,md5加密

    # salt 盐 使用sha1加密算法,返回str加密后的字符串 # 提高字符串的复杂的 from hashlib import sha1 def get_hash(str, salt=None): ...

  2. maven基本基础知识及命令学习-1

    Maven概述:Maven是很有效的项目管理工具,maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目构建.报告和文档的软件项目管理工具.统一管理环境,架包等. 一 maven下载 ...

  3. ubuntu上安装adt时无法在线安装的问题

    安装了新的ubuntu系统之后,就得重新布置android开发环境了. 找了网上的教程,一步一步做,到了在eclipse上在线下载adt总是出现 Unable to connect to reposi ...

  4. code forces 436 C. Bus

    C. Bus time limit per test 2 seconds memory limit per test 256 megabytes input standard input output ...

  5. 【Aladdin Unity3D Shader编程】之一 基本入门

    OpenGL.DirectX以及GLSL.HLSL.CG OpenGL和DirectX是图像应用编程接口,用于渲染二维或者三维图形. GLSL着色语言是用来在OpenGL中着色编程的语言,有点在于跨平 ...

  6. 在ASP.NET Core中使用AOP来简化缓存操作

    前言 关于缓存的使用,相信大家都是熟悉的不能再熟悉了,简单来说就是下面一句话. 优先从缓存中取数据,缓存中取不到再去数据库中取,取到了在扔进缓存中去. 然后我们就会看到项目中有类似这样的代码了. pu ...

  7. 【转载】SQL注入

             "SQL注入"是一种利用未过滤/未审核用户输入的攻击方法("缓存溢出"和这个不同),意思就是让应用运行本不应该运行的SQL代码.如果应用毫无防 ...

  8. aria-label

    元素中的 aria-label用来命名一个元素     它的值可以是任何字符   读屏软件就会读出aria-label里的内容 <div role=”form” aria-labelledby= ...

  9. JavaScript系列----数据类型以及传值和传引用

    1.简单数据类型 在JavaScript中简单数据类型分为5种.分别为 Undefined, Null,Boolean,Number,String. Undefined类型Undefined类型只有一 ...

  10. JSON相关知识整理

    JSON   全称:JavaScript Object Notation ,一种轻量级的数据交换格式 示例:{"name":"eric","age&q ...