Go新手需注意的知识点(一)

学习Go的一些需要注意的知识点。

一、GO中的包

1、这个是GO中非常基础,包使用package定义,使用import导入,可以理解PHP中的类,使用自动加载,所以包名称和路径名称必需一致,且包名称必需小写

2、包中的常量、变量、函数的首字母,表示包外常量、包外变量、包外方法,可以理解为public,可以在另一个包中使用。如果首字母小写,表示包内,可以理解为private,仅可以在同一个包内部使用。

3、因为一个目录即表示一个包,所以同一个目录下的包名称必需一致

4、你可以通过使用包的别名来解决包名之间的名称冲突。

二、变量

1、使用关键字var声明,格式 var identifier type

2、type的类型有:

  • string:字符串,Go语言的字符串的字节使用UTF-8编码标识Unicode文本
  • bool:true / false
  • int系列:包括int、int8、int16、int32、int64、uint、uint8、uint16、uint32、uint64
    int:32位或64位,和操作系统有关。
    int8:2的7次方,-128到127
    int16:2的15次方,-32768到32767
    int32:2的31次方,-2147483648 到 2147483647
    int64:2的63次方,-9223372036854775808 到 9223372036854775807
    uint:32位或64位,和操作系统有关。
    uint8:2的8次方,0 到 255
    int16:2的16次方,0 到 65535
    int32:2的32次方,0 到 4294967295
    int64:2的64次方,0 到 18446744073709551615
  • 浮点系列:float32、float64、complex64、complex128
    float32:IEEE-754 32位浮点型数
    float64:IEEE-754 64位浮点型数
    complex64:32 位实数和虚数
    complex128:64 位实数和虚数
  • 其它类型:byte、rune、uintptr
    byte:类似 uint8
    rune:类似 int32
    uintptr:无符号整型,用于存放一个指针
  • 派生类型:指针类型(Pointer)、数组类型、结构化类型(struct)、Channel 类型、函数类型、切片类型
    、接口类型(interface)、Map 类型

三、运算符

1、GO是强类型语言,不同类型的值进行二元运算,无法通过编译。

2、Go 对于值之间的比较有非常严格的限制,只有两个类型相同的值才可以进行比较,假如 a == b,此时a、b的类型也必需一致,否则,无法通过编译。

四、时间

1、特别注意:在go中的日期format格式,使用2006代表年,01代表月,02代表日,03代表小时、04代表分、05代表秒。

2、获取当前时间戳,time.Now().Unix()
获取指定时间的时间戳:
tm1, _ := time.Parse(“2006-01-02 03:04:05″, “2018-01-01 01:01:01″)
fmt.Println(tm1.Unix())
mt.Println(tm1.Format(“2006-01-02 03:04:05″))

五、控制结构

1、Go 完全省略了 if、switch 和 for 结构中条件语句两侧的括号,相比 Java、C++ 和 C# 中减少了很多视觉混乱的因素,同时也使你的代码更加简洁。

2、switch的集中格式:

switch var1 {
    case val1:
        ...
    case val2:
        ...
    default:
        ...
}
switch {
    case condition1:
        ...
    case condition2:
        ...
    default:
        ...
}
switch initialization {
    case val1:
        ...
    case val2:
        ...
    default:
        ...
}

六、函数

1、函数中可以没有形参,但必需要有形参的类型,例如:func f1(int, string) (string){return  “a” }

2、函数中如果有有多个分支,则每个分支都必需有return,例如:if else 则必需有2个return 关键字。

3、理解函数非命名返回值和命名返回值,尽量使用命名返回值:会使代码更清晰、更简短,同时更加容易读懂。

4、defer函数的用法

5、闭包函数的用法,看下面的例子

func Connect() {
    start := time.Now()  
    p2 := add()
    fmt.Println(p2(2))
    p3 := adder(20)
    fmt.Println(p3(30))
    fmt.Println(p3(60))
    fmt.Println(p3(10))
    elapsed := time.Since(start)
    fmt.Println(elapsed)
}
func add() (func(arg int) int) {
    return func(b int)(rst int) {
        rst = b + 1
        return
    }
}
func adder(arg int) (func(arg int) int) {
    return func (a int) (rst int) {
        arg += a
        return arg
    }
}

输出结果:

3
50
110
120
26.697µs

利用闭包函数(其实这里使用了工厂函数)高效实现斐波那契数列,相比递归实现性能高出何止千倍。

func Connect() {
    start := time.Now()  
    add(10) 
    elapsed := time.Since(start)
    fmt.Println(elapsed)
}
func add(a int) {
    f := adder();
    for i := 1; i <= a; i++ {
        fmt.Println(f(i))
    } 
}
func adder() (func(a int) int) {
    pre1, pre2 := 0,0
    return func(a int) (rst int) {
        if a <= 1 {
            pre1, rst = 1,1
        } else {
            rst = pre1 +  pre2 
            pre2 = pre1
            pre1 = rst 
        }
        return
    }
}

 6、工厂函数:一个返回值为另一个函数的函数可以被称之为工厂函数,这在您需要创建一系列相似的函数的时候非常有用:书写一个工厂函数而不是针对每种情况都书写一个函数。下面的函数演示了如何动态返回追加后缀的函数。

举例说明:

func Connect() {
    start := time.Now()  
    addBmp := makeAddSuffix(".bmp")
    addPng := makeAddSuffix(".png")
    fmt.Println(addBmp("header"))
    fmt.Println(addPng("banner"))
    elapsed := time.Since(start)
    fmt.Println(elapsed)
}
func makeAddSuffix(suffix string) (func(file string) string) {
    return func(file string) string {
        return file + suffix 
    }
}

7、计算代码执行时间

start := time.Now()
.........
end := time.Now()
delta := end.Sub(start)
start := time.Now()
..........
elapsed := time.Since(start)
fmt.Println(elapsed)

Go新手需注意的知识点(一)》上有2条评论

  1. Pingback引用通告: Go中结构体 struct 中的方法 | 精彩每一天

  2. Pingback引用通告: Go中的各种变量类型转换 | 精彩每一天

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>