杜龙少(sdvdxl)

golang入门

Word count: 2,424 / Reading time: 9 min
2016/03/13 Share

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

Go 基本介绍

Go发展

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

Go语言最主要的特性

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

开发环境配置

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


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

Go 编程基础

基础数据类型

  • 布尔类型bool
  • 整数类型int8uint8int16uint16int32uint32int64uint64intrunebytecomplex128complex64其中byteint8 的别名
  • 浮点类型float32 float64
  • 字符串类型string
  • 字符类型runeint32 的别名
  • nil
  • 万能类型 interface{}

    操作符

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

    内置函数

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

变量的定义和赋值

  1. 先定义后赋值变量的定义要用var 关键字声明如,var str string这就定义了一个名字为strstring类型的变量有过其他编程语言经验的读者可能会有点不适应不过没错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的包包的名字只允许有一级目录即不允许类似javacom.example.a或者com/example/a这样的多层级定义一般来说包的名字最好和其父目录的名字一致这样在使用包和包里的内容时会比较容易理解另会有文章说明

包的使用

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

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

函数和变量常量导出规则

Go语言中抛弃了类似C++和Java中的privatepublicprotected或者是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" //fmtgo标准包用于处理输入输出
    )

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

    //调用格式话输出打印maxmin
    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
    // 这里可以添加注释这是单行注释

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

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

    // 这里是for循环gofor是非常给力的循环控制器没有其他方式不推荐用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命令

CATALOG
  1. 1. Go 基本介绍
    1. 1.1. Go 发展
    2. 1.2. Go 语言最主要的特性:
  2. 2. 开发环境配置
  3. 3. Go 编程基础
    1. 3.1. 基础数据类型
    2. 3.2. 操作符
    3. 3.3. 内置函数
    4. 3.4. 变量的定义和赋值
    5. 3.5. 函数
    6. 3.6.
      1. 3.6.1. 包的定义
      2. 3.6.2. 包的使用
    7. 3.7. 函数和变量(常量)导出规则