写在前面: 0x01 — 测试模式

在Golang中,测试是有独特的方式的,我们首先建立一个新的工程用于后续的测试:通过GoLand创建工程很简单,结构如图:

我在项目目录中建立了两个文件夹一个存放源代码(src),一个存放测试文件(test),在测试目录中创建了基本数据类型目录,下面又创建了一个相关定义的测试文件(define_test.go), 只有后缀为 _test.go 的文件才会被程序认为是测试文件 ,在文件中创建一个函数, 函数名称必须是以 Test 为开头才会认为是测试函数,同时参数需有testing类型的参数 ,否则无法使用相关方法。

目前我们测试只需要知道t.Log为打印函数即可,其他的函数后续会有说明,以上代码:

 package test

import (
   "fmt"
   "testing"
)

func TestDefine(t *testing.T) {

   fmt.Println("测试定义")
   t.Log("测试定义")
}  

输出:

 === RUN   TestDefine
测试定义
    define_test.go:11: 测试定义
--- PASS: TestDefine (0.00s)
PASS  
0x02 — 定义变量

定义变量首先了解标识符, 标识符实就是一个或是多个 字母(A~Z和a~z)数字(0~9)、下划线(_) 组成的序列, 第一个字符必须是字母或下划线而不能是数字或其他符号 ,如有效标识符:

 a aa aaa a1 a_1 a1_ _a1
Ab AbA  

Golang是明确区分大小写,getName和Getname是两个不不同的名字,下面是无效无效标识符:

 1 1a 1_ a+ a)   

按以上标准同时Golang关键字也无法被使用:

下面列举了 Golang 代码中会使用到的 25 个关键字或保留字:(Golang是目前程序中关键字最少的)

Golang 还有 36 个预定定义的标识符也是不可以作为标识符定义的:

定义变量有多种方法,一种是声明类型后在赋值,一种是声明类型时直接赋值,一种是直接赋值,系统自动识别类型

下面用程序描述下:

 package test

import (
   "errors"
   "testing"
)
/*
加法函数
*/func addF(a,b int) (int, error) {
   if a > 10 {
      return 0, errors.New("无效的类型") // 手动返回一个错误
   }
   return a + b, nil // 返回两个值用逗号分割,注意函数定义了返回值类型需要保持一直,nil类似null等,属于error类型
}
/*
测试函数返回及错误处理
*/func TestFuncRe(t *testing.T) {
   var fir int = 10
   var sec int = 12
   if res, err := addF(fir, sec); err != nil { // 此处调用了函数,接收了返回的两个值,同时在一行判断了是否存在问题,GoLang语法后续会讲到
      t.Log("返回错误", err)
   } else {
      t.Log("获得返回值:", res)
   }
}

/*
测试定义方法
*/func TestDefine(t *testing.T) {
   // 定义后 在赋值
   var test1 int
   test1 = 10

   //批量定义
   var pd1, pd2, pd3 string

   pd1 = "批量定义"
   pd2, pd3= "批量", "赋值"

   // 定义时直接赋值
   var test2 float64 = 100.55

   // 直接赋值(简短变量赋值),Golang在定义变量是可以使用简化写法 := 实现简
   // 化定义,在开发过程中这也是使用频率最高的定义方式,
   // 同时此种定义方式只能在函数内使用
   test3 := "我是一只小麻雀"     // GoLang中字符串需要使用双引号
   test4 := 'b'            // 单引号在Golang中表示码点字面量[rune literal],不能使用单引号表示字符串

   t.Log("定义后 在赋值:", test1)
   t.Log("批量定义:", pd1, pd2, pd3)
   t.Log("定义时直接赋值:", test2)
   t.Log("直接赋值1:", test3)
   t.Log("直接赋值2:", test4)
}  

输出:

 === RUN   TestDefine
    define_test.go:52: 定义后 在赋值: 10
    define_test.go:53: 批量定义: 批量定义 批量 赋值
    define_test.go:54: 定义时直接赋值: 100.55
    define_test.go:55: 直接赋值1: 我是一只小麻雀
    define_test.go:56: 直接赋值2: 98
--- PASS: TestDefine (0.00s)
PASS  

代码21行使用的是单引号定义,说明在代码上,如果使用单引号定义字符串,会抛出以下错误:

 FAILgoDemo/test/basicDataType [setup failed]
# goDemo/test/basicDataType
define_test.go:18:11: illegal rune literal
FAIL  
0x03 — 注意事项
  • 使用 [:=]方式定义只能在函数内定义,其他方式可以在函数外,类似于局部变量和全局变量。
  • 定义变量和函数时需要注意名称第一个字符,如果是大写,则可以被包外引用调用,如实小写则只能在保内调用类似public和private。
  • 变量类型以及函数参数和返回类型一定要明确,Golang是静态编译型语言,类型没有编译会直接报错,类型模糊不清运行可能会抛出panic(最高级别错误)。
0x04 — 总结

定义变量或函数是Golang开发的最基础的内容,在开发中会逐渐熟悉,慢慢会得心应手的。

定义变量注意类型的定义

定义函数注意返回值类型和个数的统一