入坑第二式 golang 入坑系列 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
ztao8607
V2EX    Go 编程语言

入坑第二式 golang 入坑系列

  •  
  •   ztao8607 2017-11-22 10:03:50 +08:00 1736 次点击
    这是一个创建于 2883 天前的主题,其中的信息可能已经有所发展或是发生改变。

    读前必读:这是本系列的第二式了,请原谅没有在 V2EX 完整转发第一式。 如果想看完整版,直接到gitbook点击阅读,如果能给个 star,尤为最好。 在每次入坑之前,都会有一个坑前宣言,其实就是瞎侃瞎贫。我总感觉一个技术类文章没必要写的那么正经严肃,又不是新闻联播。 接点地气,说说段子,轻轻松松的就挺好。 如果大家感觉轻松过头了,可以提出来,我尽量收敛。 如果说这类文章,就不应该轻松。 也请举手示意,我这里统计一下人数, 然后放到下个段子里面去。 提不提在您,但我够呛能改。

    下面,开始正式上宣言。

    飞龙在天

    乾卦九五 此式跃起凌空,居高下击,先声夺人!以一飞冲天之式上跃双膝微曲,提气丹田,待觉真气上升,放松肌骨,存想玉枕穴间,急发掌劲取敌首、肩、胸上三路

    不知是金庸老先生造就了降龙十八掌还是周易启发了金庸老先生,总之我是先知道了降龙十八掌,然后才明白了周易,最后学会了 Golang。

    学 Golang 不用先学周易,这不是玄学,纯属爱好。周易博大精深,没人带路真是学不会。所以我就半途而废了。 但 Golang 没人带路,也能学的八九不离十。 但总有那么一拨人,喜欢人前带路,填坑奠土。我就属于这么一拨人中的一份子。

    平心而论,我也不知道能给像你这样渴望进步的小青年带来多少知识的积累,或许有些人感觉这教程写的狗屁不是,连第二式都没看到。但本着一颗红心向太阳,两把破浆向前划的精神,我知道多少就说多少,会多少就讲多少。努力把这本书写到低。如果谁能一路跟到底,没的说。

    铁粉! I Like You

    坑前宣言结束,下面开始正式章节 - 打包粮草

    打包粮草

    还真有一位哥们(可能是姐们, who care~)说每篇前面的扯淡内容比后面的正文要好,读完扯淡就撤。虽然这话有些伤人,但冲着你告诉了我文章的优点,我就挺你到底。直接上最扯淡的部分:

    马瘦毛长蹄子肥,儿子偷爹不算贼,瞎大爷娶个瞎大奶奶,俩人过了多半辈子 谁也没见过谁 !

    好,扯完了。 那位哥 /姐们,你可以撤了。呵呵,开玩笑,哪能真赶走上帝呢,留下来和我一起学 Golang 吧。

    书接上文,每种编程语言的入门级教程中,基本都是这个套路,先讲基本知识,再开始升阶,然后就结束。 看的多了,我也不免落入俗套。所以上节讲到了 Golang 的变量类型。本节开始入手操作运算符。

    Golang 的运算符基本分为以下几类:

    • 算术运算符

    • 关系运算符

    • 逻辑运算符

    • 位运算符

    • 分配运算符

    • 杂项运算符

    我们逐项掰开了,揉碎了按个讲解。

    算术运算符

    顾名思义,就是加减乘除这一套小学内容。 编程使用最多的也就这么四个运算,像 i++,++i。基本每位从大学时代过来的人都经历过死记硬背 i++/++i 区别,然后应付考试的一段时光。真正开始写代码了以后,会发现知道原理和不知道原理,对工作几乎没影响。

    假设 A :=10 B:=20 然后 (gitbook 的表格语法和 V2 水火不兼容,所以图的这部分建议去 gitbook 查看)

    | 操作符 | 操作描述 | 实例 | | :--- | :--- | :--- | | + | 两数相加 | A + B = 30 | | - | 两数相减 | A - B = -10 | | * | 两数相乘 | A * B = 200 | | / | 两数相除 | B / A = 2 | | % | 取模运算,得出余数 | B % A = 0 | | ++ | 自增加一 | A++ = 11 | | -- | 自减减一 | A-- = 9 |

    算术运算到此为止。很简单,一目了然。 若有不懂,就写几段代码验证一下。 结果如果和你预期不一致,忠告一下,相信 CPU。一定是你错了

    关系运算符

    和加减不同,这里计算的是相等,不相等,大于和小于。同样假设 A :=10 B:=20 然后(gitbook 的表格语法和 V2 水火不兼容,所以图的这部分建议去 gitbook 查看)

    | 运算符 | 描述 | 实例 | | :--- | :--- | :--- | | == | 判断左右两边是否相等(同数据类型情况下) | (A == B) false. | | != | 判断左右两边是否不相等(同数据类型情况下) | (A != B) true. | | > | 判断左边是否大于右边(同数据类型情况下) | (A > B) false. | | < | 判断左边是否小于右边(同数据类型情况下) | (A < B) true. | | >= | 判断左边是否大于或者等于右边(同数据类型情况下) | (A >= B) false. | | <= | 判断左边是否小于或者等于右边(同数据类型情况下) | (A <= B) true. |

    只要注意左右两边必须是可比较的,基本都用不错。还是那句话:若有不懂,就写几段代码验证一下。 结果如果和你预期不一致,忠告一下,相信 CPU。一定是你错了

    逻辑运算符

    与关系不同,这里讨论的是与或非。"我与你,我或他,不是我" 这三种问题。这个时候,需要假设 A :=true B:=false 然后

    | 运算符 | 描述 | 实例 | | :--- | :--- | :--- | | && | 与。 两边都是 ture,结果是 ture。否则为 false | (A && B) false. | | || | 或。两边有一个 ture,结果就是 true。否则为 false | (A || B) true. | | ! | 非。取反值。 | !(A && B) true. |

    写到与或非,就想到了大学上的电路课,每周的周四去实验室在电路板上面通过与或非门来模拟 CPU,计算一些二进制数据。后悔当时光乐乐呵呵去玩了,没有好好学习。导致没有进入单片机的天堂,走上了编码的不归路。 如果有来生,在此立誓,打死我都不碰计算机学院的大门。 最后补充一句,河北工业大学的计算机学院真的很强!( 软文免费推广)有推广需求,直接联系我

    在表格里面插入'|',在 PC 上面展现会错行,所以提供下面的图片:

    ![]( https://github.com/andy-zhangtao/blogpic/blob/master/表格 1.png?raw=true)

    位运算符

    位运算和逻辑运算,模样看起来差不多。 但是使用方式和使用场景,一个天上一个更天上。 看下面的图,就看出不一样了。

    | p | q | p& q | p | q | p ^ q | | :--- | :--- | :--- | :--- | :--- | | 0 | 0 | 0 | 0 | 0 | | 0 | 1 | 0 | 1 | 1 | | 1 | 1 | 1 | 1 | 0 | | 1 | 0 | 0 | 1 | 1 |

    位运算的与或非和逻辑运算大致相同,可仍然有不同。 位运算的与是 两位都是 1 时,结果为 1,否则为 0. 而或和逻辑运算的或相同,只要有一个 1,则结果就是 1,否则为 0. 最后的非则很不相同,两位相同就是 0,不同就是 1. 说起来简单,用起来难。 因为平时使用的少,所以每次用的时候,我仍然会再去温习一遍。 如果你记性好,那就好。 如果记性不好,这页放到浏览器书签里,用的时候再打开看一下。

    在表格里面插入'|',在 PC 上面展现会错行,所以提供下面的图片:

    ![]( https://github.com/andy-zhangtao/blogpic/blob/master/表格 2.png?raw=true)

    下面从 Golang 官方文档抄一段说明,权当练习题,巩固记忆吧

    A = 0011 1100 B = 0000 1101 ----------------- A&B = 0000 1100 A|B = 0011 1101 A^B = 0011 0001 ~A = 1100 0011 

    Golang 脱胎于 C,所以默认也支持了 C 的位运算。相对于上面的运算符,下面的运算符更为常用些: (使用上面练习题的 A 和 B 值)

    | 运算符 | 描述 | 实例 | | :--- | :--- | :--- | | & | 按位进行与运算 | (A & B) = 12,二进制是 0000 1100 | | | | 按位进行或运算 | (A | B) = 61, 二进制是 0011 1101 | | ^ | 按位进行非运算 | (A ^ B) = 49, 二进制是 0011 0001 | | << | 按位进行左移操作 | A << 2 = 240 二进制是 1111 0000 | | >> | 按位进行右移操作 | A >> 2 = 15 二进制是 0000 1111 |

    来个图片

    分配运算符

    这种运算符经常用到,但可能不太能意识到。所以这里也提一下,以防面试的时候被人 XX。

    分配运算符就是将运算后的值赋给内存中一个新的变量,这个变量的变量名可能是另外的名字,也可能是当前的名字。(和字符串不可修改有异曲同工之妙)

    | 运算符 | 描述 | 实例 | | :--- | :--- | :--- | | = | 简单的赋值操作符,从右操作数赋值到左操作数 | C = A + B 等同于 把 A + B 的值赋给 C | | += | 将右操作数加到左操作数,并将结果赋给左操作数 | C += A 等同于 C = C + A | | -= | 从左操作数减去右操作数,并将结果赋给左操作数 | C -= A 等同于 C = C - A | | *= | 将右操作数乘以右操作数,并将结果赋给左操作数 | C *= A 等同于 C = C * A | | /= | 将左操作数和右操作数相除,并将结果赋给左操作数 | C /= A 等同于 C = C / A | | %= | 使用两个操作数来进行模运算,并将结果赋给左操作 | C %= A 等同于 C = C % A | | <<= | 左移位和赋值运算符 | C <<= 2 等同于 C = C << 2 | | >>= | 右移位和赋值运算符 | C >>= 2 等同于 C = C >> 2 | | &= | 位与赋值运算符 | C &= 2 等同于 C = C & 2 | | ^= | 位非赋值运算符 | C ^= 2 等同于 C = C ^ 2 | | |= | 位或赋值运算符 | C |= 2 等同于 C = C | 2 |

    来个图片

    其它运算符

    其它就是下面这两个,用于指针操作

    | 运算符 | 描述 | 实例 | | :--- | :--- | :--- | | & | 返回地址. | &a; 返回 a 内存实际位置. | | * | 返回指针. | *a; 指向 a 内存地址的指针. |

    Golang 的运算符就上面这几种,而常用莫过于算术,逻辑运算符了。 其它不常用不代表不用,知道有这些运算符,用的时候,再看看上面的规则就 OK 了。

    本节的最后提一下运算符里的优先级。 这些文字可不是为了充字数的,真心有用。

    优先级

    运算符优先级决定表达式中元素的分组。最终会影响表达式的计算方式。某些运算符的优先级高于其他运算符。例如,乘法运算符的优先级高于加法运算符。

    例如 x = 7 + 3 * 2;这里,x 是 13,不是 20,因为运算符*的优先级高于+,所以它首先乘以 3 * 2 然后加到 7。

    在这里,具有最高优先级的操作符出现在表的顶部,最低的则出现在底部。在表达式中,会按照优先级进行计算。

    | 类别 | 运算符 | 结合方式 | | :--- | :--- | :--- | | Postfix | () [] -> . ++ - - | Left to right | | Unary | + - ! ~ ++ - - (type)* & sizeof | Right to left | | Multiplicative | * / % | Left to right | | Additive | + - | Left to right | | Shift | <<>> | Left to right | | Relational | <<= >>= | Left to right | | Equality | == != | Left to right | | Bitwise AND | & | Left to right | | Bitwise XOR | ^ | Left to right | | Bitwise OR | | | Left to right | | Logical AND | && | Left to right | | Logical OR | || | Left to right | | Conditional | ?: | Right to left | | Assignment | = += -= *= /= %=>>= <<= &= ^= |= | Right to left | | Comma | , | Left to right |

    来个图片

    为了保证权威性和准确性,我原文照搬 Golang 官方文档的说明,没有修改一个字母。 所以出了问题,不要找我, 找 Golang 开发组去。

    兵马未动粮草先行,开发语言里,运算符算是一种粮草了。 因此本节就开始打包这些粮草。 如果看着着急,感觉进度慢 。嗯。 大哥,你自己试试,一个字一个字的码起来,真的很累...... 以后等内容充实了,开始上一些 demo 了。你就感觉快了。

    2 条回复    2017-11-22 14:22:31 +08:00
    araraloren
        1
    araraloren  
       2017-11-22 13:10:58 +08:00
    Markdown is evil!
    Why not using asciidoc?
    ztao8607
        2
    ztao8607  
    OP
       2017-11-22 14:22:31 +08:00
    @araraloren Because gitbook use markdown as its default :D
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5284 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 03:53 PVG 11:53 LAX 20:53 JFK 23:53
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86