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 · 1239 次点击
    这是一个创建于 2318 天前的主题,其中的信息可能已经有所发展或是发生改变。

    读前必读:这是本系列的第二式了,请原谅没有在 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   ·   我们的愿景   ·   实用小工具   ·   1791 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 16:31 · PVG 00:31 · LAX 09:31 · JFK 12:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.