写在前面:
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是目前程序中关键字最少的)
break | default | func | interface | select |
case | defer | go | map | struct |
chan | else | goto | package | switch |
const | fallthrough | if | range | type |
continue | for | import | return | var |
Golang 还有 36 个预定定义的标识符也是不可以作为标识符定义的:
内建常量 | 内建类型 | 内建函数 | ||||||
nil | int | int64 | uint32 | float64 | byte | make | append | real |
iota | int8 | uint | uint64 | complex128 | rune | len | close | imag |
true | int16 | uint8 | uintptr | complex64 | string | cap | delete | panic |
false | int32 | uint16 | float32 | bool | error | new | complex | recover |
定义变量有多种方法,一种是声明类型后在赋值,一种是声明类型时直接赋值,一种是直接赋值,系统自动识别类型
下面用程序描述下:
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开发的最基础的内容,在开发中会逐渐熟悉,慢慢会得心应手的。
定义变量注意类型的定义
定义函数注意返回值类型和个数的统一