文章目录
  1. 1. 整体感受
  2. 2. GO语言的几点特征

整体感受

学了几天的GO语言,感觉GO的设计目的是简捷、简用,GO不能算是一种面向对象的程序设计语言,例如,没有oop中的很多概念:继承、this指针、构造函数/析构函数等,但是对面向对象编程提供支持,可以定义抽象数据类型,允许定义成员方法等,这些特性表现在GO语言中的接口(interface)和结构体(struct),特别是接口(interface)在整个GO语言的体系中的作用非常重要。

GO语言的几点特征

  1. 像java一样有内存回收机制,不需要考虑对堆中分配的内存进行delete
  2. 结构体struct(功能等同于其他语言的类class)没有构造函数,默认初始化为零值,可以用复合声明初始化
    复合声明如下:

    1
    2
    File{fd: fd, name: name}  //返回对象
    &File{fd,name} //返回指针,从堆上分配

    某些包里可能会有NewXXX(field1,field2)实现构造函数的功能

    1
    2
    3
    func NewXXX(field1,field2) *XXX{
    return &XXX{field1,field2}
    }
  3. struct可以有匿名字段,拥有该字段的方法(类似于继承)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    type A struct{
    .....
    }
    func (a *A)Add(){....} //A类的Add方法

    type B struct{
    A //匿名字段
    somevalue int
    ...
    }
    var b B
    b.A.Add() //拥有A类的Add方法
  4. interface只是方法的组合,任何类型只要包含某interface中所有的方法,该类型就实现了此interface,不需要显示地去定义(类比于java,则需要implements)

  5. Go中使用平行赋值,没有逗号表达式。

    1
    2
    3
    4
    5
    //i++,j++   
    //i=2,j=7 这些都是不允许的

    i, j = i+1, j+1
    i ,j = j, i //互相交换,也是允许的
  6. Go的字符串是UTF-8编码的,string转成[]rune([]rune(str)),每个字符对应一个数值(rune就是int32),即rune数组个数等于string的字符数

  7. range 是个迭代器,当被调用的时候,从它循环的内容中返回一个键值对。基于不同的内容,range 返回不同的东西。当对slice 或者array 做循环时,range 返回序号作为键,这个序号对应的内容作为值。对map则返回键和值

    1
    2
    3
    4
    5
    6
    7
    8
    arr := [...]int{1,2,3,4,5}
    for i , j := range arr{
    //每次迭代 i从04(序号) j从15(值)
    }

    for _, j := range arr{
    //‘_’表示丢弃赋给它的值,GO语言中不允许定义的变量未使用,所以_有时用得到
    }
  8. Switch更加灵活。表达式不必是常量或整数,执行的过程从上至下,直到找到匹
    配项,而如果switch 没有表达式,它会匹配true 。
    实现if-else if-else

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    func unhex(c byte) byte {
    switch {
    case '0' <= c && c <= '9':
    return c - '0'
    case 'a' <= c && c <= 'f':
    return c - 'a' + 10
    case 'A' <= c && c <= 'F':
    return c - 'A' + 10
    }
    return 0
    }

    多值匹配

    1
    2
    3
    4
    switch c {
    case ' ', '?', '&', '=', '#', '+':
    return true
    }

    Go里面switch默认相当于每个case最后带有break,匹配成功后不会自动向下执行其他case,而是跳出整个switch, 但是可以使用fallthrough强制执行后面的case代码。

    1
    2
    3
    4
    5
    6
    7
    switch {
    case true:
    ....
    fallthrough
    case false:
    ... //不管符不符合,执行上一个fallthrough之后,都会强制执行这段
    }
  9. Go语言中大多数情况都可以省略分号
    如果行末标记为:

    • 一个标识符
    • 一个整数、浮点数、虚数、字符或字符串文字
    • 关键字break、continue、fallthrough或return中的一个
    • 运算符和分隔符++、—、)、]或}中的一个
      则分号将被自动插入到标记流中非空白行的末尾。
  10. 方法和成员变量命名以大小写确定是否可以导出, 为了方便理解,大写开头相当于public 小写开头相当于pravite。此规则适于包和结构体中

未完待续…

文章目录
  1. 1. 整体感受
  2. 2. GO语言的几点特征