golang入门

作者: 杜龙少 | 来源:发表于2015-08-11 16:26 被阅读637次

    本文同步发表于我的博客,点此穿越

    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。也可以多行分别定义,如:

      var a string 
      var b string
      var c int
      

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

    ``` go
    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",如果多个,可以类似定义变量:

    import (
        "a"
        "b"
    )
    

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

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

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

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

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

      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,并添加如下内容:

      // 这里可以添加注释,这是单行注释
      
      /*
          这里也是注释,
          是多行注释,
          允许注释跨行
      */
      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命令

    相关文章

      网友评论

        本文标题:golang入门

        本文链接:https://www.haomeiwen.com/subject/fouiqttx.html