本文同步发表于我的简书,点此穿越

Go 基本介绍

Go发展

早在2007年9月,Go语言还是这帮大牛的20%自由时间的实验项目。 幸运的是, 到了2008年5月 , Google发现了Go语言的巨大潜力, 从而开始全力支持这个项目 , 让这批人可以全身心投入Go语言的设计和开发工作中。 Go语言的第一个版本在2009年11月正式对外发布,并在此后的两年内快速迭代,发展迅猛。 第一个正式版本的Go语言于2012年3月28 日正式发布, 让Go语言迎来了第一个引人瞩目的里程碑。截至现在,Go已经更新到1.5版本,1.5正式版就在8月份中旬发布。
Go编程语言是一个使得程序员更加有效率的开源项目。Go 是有表达力、简洁、清晰和有效率的。它的并行机制使其很容易编写多核和网络应用,而新奇的类型系统允许构建有弹性 的模块化程序。Go 编译到机器码非常快速,同时具有便利的垃圾回收和强大的运行时反射。它是快速的、静态类型编译语言,但是感觉上是动态类型的,解释型语言。

Go语言最主要的特性:

  • 自动垃圾回收
  • 更丰富的内置类型
  • 函数多返回值
  • 错误处理
  • 匿名函数和闭包
  • 类型和接口
  • 并发编程
  • 反射
  • 语言交互性

开发环境配置

请参见另一篇博客Golang 环境搭建


下面切入正题,介绍Go语言编程,由于只是本篇只是一个快速了解Go,所以有些内容会略微一提,如果读者用到或者要深入了解,可自行找文档参考,这里有个印象即可。

Go 编程基础

基础数据类型

  • 布尔类型:bool
  • 整数类型:int8 uint8 int16 uint16 int32 uint32 int64 uint64 int rune byte complex128 complex64,其中,byteint8 的别名
  • 浮点类型:float32 float64
  • 字符串类型:string
  • 字符类型: rune,是 int32 的别名
  • 空: nil
  • 万能类型: interface{}

    操作符

    + & += &= && == != ( )
    - | -= |= || < <= [ ]
    * ^ *= ^= <- > >= { }
    / << /= <<= ++ = := , ;
    % >> %= >>= -- ! ... . :
    &^ &^= ->

    内置函数

  • len:计算(字符串,数组或者切片,map)长度
  • cap:计算(数组或者切片,map)容量
  • close:关闭通道
  • append:追加内容到切片
  • copy:拷贝数组/切片内容到另一个数组/切片
  • delete:用于删除map的元素

变量的定义和赋值

  1. 先定义,后赋值。变量的定义要用var 关键字声明,如,var str string,这就定义了一个名字为“str”的string类型的变量;(有过其他编程语言经验的读者可能会有点不适应,不过没错,Go的变量类型就是放在变量后面的。)还可以一次定义多个变量,如 var a string, b int;这样就同时定义了一个字符串类型和一个int类型的变量;如果几个连续的变量是同样的类型,可以一次性在最后该类型变量后说明,不需要单个说明。var a, b,c string, int d。也可以多行分别定义,如:
1
2
3
var a string
var b string
var c int

这种写法要重复写var这个关键字,其实这种写法是可以只写一个var的,等价于下面的写法:

1
2
3
4
var (
a, b string
c int
)
  1. 变量的赋值
    var a string,定义一个string类型的a变量,然后a = "this is a string"就可以把字符串的值赋给a了。这里有个简便的写法,就是声明和赋值同时进行,以上两句等同于var a string = "this is a string",这种写法大多数语言都是类似的.由于Go可以根据变量的值自动推断该变量的数据类型,所以还等价于var a = "this is a string";另外Go中还有个更为简洁的写法,等同于a := "this is a string",直接省略关键字var,取而代之的是一个操作符:=,这个操作符的作用就是声明并赋值。
  2. 常量的定义和赋值
    常量用关键词const说明,并且常量的值是在定义的时候一次性赋值的,如定义一个字符串常量,const CONST_STR = "const string"等价于const CONST_STR string = "const string"
  3. *注意
    constvar:=不可同时使用。

函数

函数的结构如下 func func_name([param_name type][...]) [return_value type[...]]
以关键字func开头, 后面是函数名, 函数名后面是函数参数,参数个数大于等于0个,参数后面是返回值,返回值个数>=0,也就是说,Go语言支持多返回值。
其中go中有个特殊的函数(其实还有一个init函数,但是作为入门篇,不在这里介绍了),那就是main函数,main函数是无参,无返回值,名字是main的一个特殊函数,它是程序的入口,并且main函数只能定义在mian的包(下面有介绍)中。

如果您是Java开发者,想必对包的概念并不陌生。在Go语言中,如果开发中有来自不同库的同名的函数,该如何处理,这就要依靠package来区分,也就是说包的作用类似于作用于,是对函数,变量等作用范围的一种约束。

包的定义

包的定义是通过 package这个关键字来说明的,一般写在文件的最上方。如package a,则定义了一个名字为a的包。包的名字只允许有一级目录,即不允许类似java的com.example.a或者com/example/a这样的多层级定义。一般来说,包的名字最好和其父目录的名字一致,这样在使用包和包里的内容时会比较容易理解(另会有文章说明)。

包的使用

包的导入使用关键字import来声明,如要在其他包中导入上面定义的包a,则声明如下:import "a",如果多个,可以类似定义变量:

1
2
3
4
import (
"a"
"b"
)

函数和变量(常量)导出规则

Go语言中,抛弃了类似C++和Java中的private,public,protected,或者是friendld的可见性定义,采取了极简方式。如果变量或者函数首字母大写,代表可以导出,即对其他包是可见的,否则是不可见的。

到这里,Go的基本概念已经基本讲清楚,下面用一个示例说明上面的概念。

  1. 创建一个文件夹,名字假设叫做 example

  2. 进入example,创建文件main.go,并添加以下内容:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    package main //因为这里有程序的入口,main方法存在,所以包名必须命名为main

    // 这里导入要使用的包
    import (
    "./number" //这里导入我们自己定义的包,“./”是说用相对路径的方式导入包
    "fmt" //fmt是go标准包,用于处理输入输出
    )

    //这是程序的主函数,写法就是这样固定的,无参,无返回值
    func main() {
    //调用我们的函数并把产生的结果赋值给定义的max和min变量,根据GetMaxAndMin的返回值类型,go自动推断出max和min的是int类型
    max, min := number.GetMaxAndMin(1, 3, 4, 2, 6, 0, 8)

    //调用格式话输出打印max和min
    fmt.Printf("max:%v, min:%v\n", max, min)
    }
  3. 创建文件numbner.go,并添加如下内容:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    // 这里可以添加注释,这是单行注释

    /*
    这里也是注释,
    是多行注释,
    允许注释跨行
    */
    package number// 这是包名,除了文件的注释,一般包名要放在最上方

    // 这里定义一个函数,用来获取values参数中的最大值和最小值。
    // 函数名GetMaxAndMin大写代表其他包可见,如果是小写,则其他包不可引用该函数
    // (a, b int, values ...int),a,b, values都是该函的参数,a,b是必填的参数,
    // ...代表values是变参,即长度不固定,个数>=0,并且都是int类型
    // (int, int)代表该函数有两个返回值,都是int类型
    func GetMaxAndMin(a, b int, values ...int) (int, int) {
    max, min := a, a //定义并赋值两个变量 max,min,并把a的值赋给max和min
    if a<b { //go允许简单条件和控制语句之间不加小括号,并且大括号左部分必须和条件在同一行
    max = b
    } else {
    min = b
    }

    // 这里是for循环,在go中for是非常给力的循环控制器,没有其他方式(不推荐用goto)
    // _ 的作用是说把遍历values产生的下标的值忽略掉,v是产生的values的值,
    // range 关键词 用来配合for,构成一个简单的循环结构,相当于for-each
    // 关于 “_”,因为go中不允许有多余的为使用的参数和为使用的包,所以“_”就充当了一个垃圾桶的角色,多返回值产生的不必要值可以填入“_”,
    // 从而达到控制编译器编译过程中不会报错。
    for _, v := range values {
    if v>a {
    max = v
    }

    if v<b {
    min = v
    }
    }

    return max, min
    }

    注意,文件保存编码是utf-8 。
    打开终端(命令行工具),切换到example目录下,执行go run main.go,可以看到有内容输出:

    max:8, min:0

附Go命令