来自朝鲜的问候 golang入坑系列
鸿渐于陆
本想着写满十八式,但按照目前的进度来看,是很难凑够十八式了。所以还是那句话,量力而行,适可而止。能写多少就写多少,我没法保证看完这本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类型转换就是三条规则:
- 普通类型向interface{}转换是隐式。
- interface{}向普通类型转换必须显示
- 强制转换时,最好使用类型断言,防止panic。
还是最补充一句吧,转载请保留我的邮箱。 ztao8607@gmail.com
来自朝鲜的问候 golang入坑系列的更多相关文章
- 初生牛犊不怕虎 golang入坑系列
读前必读,下面所有内容都是来自这里. 放到这里的目的,就是为了比对一下,哪里的读者多.平心而论,同样的Markdown,博客园排版真心X看,怎么瞅怎么X看.(X := '难' || X :='耐' | ...
- 入坑第二式 golang入坑系列
史前必读: 这是入坑系列的第二式,如果错过了第一式,可以去gitbook( https://andy-zhangtao.gitbooks.io/golang/content/ )点个回放,看个重播.因 ...
- 维多利亚的秘密 golang入坑系列
原文在gitbook,字字原创,版权没有,转载随意. 在写本文的前一天,2017维密在上海开始了. 为了纪念屌丝界的盛世,特为本节起名维多利亚的秘密.现在的社会,要想出名只有抓眼球.所以写份技术文章, ...
- 分水岭 golang入坑系列
第三式开篇语有些负面, 所以这里就不贴了.有兴趣的自己可以去看看 https://andy-zhangtao.gitbooks.io/golang/content/ .怒发冲冠,意气之作.看完就完了, ...
- SEO是件贼有意思的事情 golang入坑系列
这两天迷上了SEO.真心看不起百度的竞价排名,但作为一个商业网站,赚钱是一件无可厚非的事情.只做活雷锋,没有大金主是做不长的.做完功课后,发现百度和google的SEO策略又不相同,几乎是无法通用.百 ...
- 准备冲锋 golang入坑系列
史前摘要: 本来想写读前必读,但连续几篇博文都写读前必读,感觉就没有了新意. 所以换成史前摘要,反正是一个意思. 此摘要的目的仍然是提醒点击而来的同学,本系列最新文章在这里.放到博客园的目的是为了方便 ...
- 坐忘峰 golang入坑系列
读前必读: 本文写于20日,首发于gitbook. 迟到的是日期,没变的是内容. 点击进入 https://andy-zhangtao.gitbooks.io/golang/content/ 可以看到 ...
- 崩溃 golang入坑系列
早上(11.30)收到邮件,Vultr东京机房网络故障.当时搭建SS时,考虑到了机房故障.所以特意分出了日本和香港两条线路.但千算万算,忘记数据库还在东京机房中. 现在网络故障,SS服务器无法读取数据 ...
- 乐呵乐呵得了 golang入坑系列
开场就有料,今天返回去看了看以前的文章,轻松指数有点下降趋势.一琢磨,这不是我的风格呀.一反思,合着是这段时间,脑子里杂七杂八的杂事有点多,事情一多,就忘了快乐.古话说得好:愁也一天,乐也一天,只要还 ...
随机推荐
- A Simple Game
A Simple Game Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/65535 K (Java/Others) Total ...
- 英语学习笔记---01---新概念第一册---Lesson 1 Excuse me!
Lesson 1 Excuse me! [词汇] excuse [iks5kju:z] v. 原谅 劳驾.借光 me ...
- vsftpd安装及虚拟用户配置
服务器环境:CentOS6.9 Linux 2.6.32-696.10.1.el6.x86_64 安装vsftpd.db4.db4-utils # yum -y install vsftpd db4 ...
- ⑾bootstrap组件 徽章 大屏 页头 基础案例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- JAVAscript学习笔记 js事件 第一节 (原创) 参考js使用表
<!DOCTYPE html> <html lang="en" onUnload="ud()"> <head> <me ...
- 谷歌浏览器Chrome播放rtsp视频流解决方案
找半天,HTML5的可以支持RTMP 但是无法播放RTSP,flash也止步于RTMP,最后同事推荐了个开源的好东东 VLC ,请教谷歌大神之后,这货果然可以用来让各浏览器(IE activex方式, ...
- Scrum Meeting Alpha - 4
Scrum Meeting - NewTeam // 地点:新主楼F座二楼 任务反馈 团队成员 完成任务 计划任务 安万贺 确定了API部分的目录结构及包装方式,完成了部分API的包装https:// ...
- JS--我发现,原来你是这样的JS:面向对象编程OOP[2]--(创建你的那个对象吧)
一.介绍 我们继续面向对象吧,这次是面向对象编程的第二篇,主要是讲创建对象的模式,希望大家能从博客中学到东西. 时间过得很快,还是不断的学习吧,为了自己的目标. 二.创建对象 1.前面的创建对象方式 ...
- web前端vertical-align的作用及对象详解
很多程序员知道web前端技术里的vertical-align是什么意思,但是对于vertical-align到底以什么为对齐标准却一知半解,今天我们就来说说web前端vertical-align. 1 ...
- [转载] JaCoCo:分析单元测试覆盖率的利器
转载自http://www.ibm.com/developerworks/cn/java/j-lo-jacoco/和http://www.cnblogs.com/chenfengmugu/p/4937 ...