当前位置: 首页 > news >正文

使用包和测试

Go天生就是为了支持良好的项目管理体验而设计的

1、包,go项目和文件名没有关系,和src下目录结构有关

go使用包来管理接口、结构体、方法和变量

包名一般和文件目录名相同,如果不同,构建、安装会以代码包名为准,但是生成的构建文件是以目录名命名的。

一个目录下不能有不同包名的代码文件

下面通过案例介绍

1)、go项目结构通常如下:

我本地GOPATH路径为F:\goLangStudy\demo,已经设置了环境变量。

bin中是编译后的可执行文件

pkg中是编译后的包文件

src中是源码目录

其中bin和pkg文件夹如果没有,go会自动创建

2)、在src文件夹下创建文件结构如下

3)、math.go和math_pkg.go文件使用同一个包,最终会被编译到一个二进制包文件math.a中;此处可说明文件名可以和包名不一样

 math_pkg.go文件如下:

package math

func Add(a, b int) int {
    return a + b
}

func Substract(a, b int) int {
    return a - b
}

math.go文件如下:

package math

func Multiply(a, b int) int {
    return a * b
}

func Divide(a, b int) int {
    if b == 0 {
        panic("Can not divided by zero")
    }
    return a / b
}

4)、一个项目只能有一个main包,main包相对src的目录结构就对应执行go install main包目录

main.go文件如下(import中math是net.duokr/math源码包别名):

package main

import (
    "fmt"
    math "net.duokr/math"
)

func main() {
    var a = 100
    var b = 200

    fmt.Println("Add demo:", math.Add(a, b))
    fmt.Println("Substract demo:",math.Substract(a,b))
    fmt.Println("Multiply demo:",math.Multiply(a,b))
    fmt.Println("Divide demo:",math.Divide(a,b))
}

5)、编写一个脚本文件,省的每次去执行多行同样的命令,build.bat文件如下(我本地配置了环境变量,就把设置GOPATH那段注释了):

@echo off
rem set GOPATH=GOPATH;F:\goLangStudy\demo
set GOBIN=F:\goLangStudy\demo\bin
go build net.duokr\math
go build main.go
go install main

在src文件夹下,执行完脚本后,目录结构如下(src文件夹下会有个main.exe,是由go build main.go生成):

可以通过go run命令执行main.go;也可以直接运行bin下的bin.exe,查看结果

 2、src下的main文件夹不是必须的,main包的文件名也不一定叫main.go,下面更改后如下

 3、测试代码编写

在math文件夹下创建math_test.go文件,编写测试代码,在当前测试文件所在路径下执行go test命令,会自动执行以_test.go结尾的文件中Test开头的函数,并且测试函数参数为

*testing.T类型

math_test.go代码如下

package math

import(
    "testing"
    "fmt"
)

func TestAdd(t *testing.T){
    var a=100
    var b=200

    var val=Add(a,b)
    if val!=a+b{
        t.Error("Test Case [","TestAdd","] Failed")
    }else{
        fmt.Println("Add Method Pass")
    }
}

func TestSub(t *testing.T){
    var a=100
    var b=200

    var val=Substract(a,b)
    if val!=a-b{
        t.Error("Test Case [","TestAdd","] Failed")
    }else{
        fmt.Println("Substract Method Pass")
    }
}

func TestDemo(t *testing.T){
    fmt.Println("测试代码")
}

func testDemo(t *testing.T){
    fmt.Println("不是测试代码")
}

func TessDemo(t *testing.T){
    fmt.Println("不是测试代码")
}

 

 

 

相关文章:

  • 2018 noip 考前临死挣扎
  • vue增加按钮到表头单元格的解决方法
  • PostgreSQL 10.1 手册_部分 IV. 客户端接口_第 33 章 libpq - C 库_33.19. 在线程化程序中的行为...
  • facl权限(getfacl/setfacl)
  • Python打包系统简单入门
  • 动画开发
  • 高性能架构-存储高性能-关系型数据库
  • While executing gem bad response Not Found 404
  • mysql重启,重启释放ibtmp1
  • 我是一个线程(修订版) 转
  • 从头编写一个 HTTP 静态资源服务器
  • 简单手撸代码进入SMP2018中文人机对话技术评测任务一前三甲
  • 小程序开发之插件功能的有效实现方法
  • 数据库 Oracle12c (三):安装与启动
  • elasticsearch实战---中文拼音A-Z排序(完美解决)
  • [case10]使用RSQL实现端到端的动态查询
  • 2017-08-04 前端日报
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • Idea+maven+scala构建包并在spark on yarn 运行
  • Laravel 中的一个后期静态绑定
  • Ruby 2.x 源代码分析:扩展 概述
  • Sequelize 中文文档 v4 - Getting started - 入门
  • vue.js框架原理浅析
  • vue-cli3搭建项目
  • 机器学习 vs. 深度学习
  • 配置 PM2 实现代码自动发布
  • 前端临床手札——文件上传
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 数组的操作
  • 正则与JS中的正则
  • postgresql行列转换函数
  • 回归生活:清理微信公众号
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • #1014 : Trie树
  • #mysql 8.0 踩坑日记
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (1)(1.13) SiK无线电高级配置(六)
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (9)目标检测_SSD的原理
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • .a文件和.so文件
  • .NET Remoting学习笔记(三)信道
  • .Net 知识杂记
  • .net6+aspose.words导出word并转pdf
  • .NET基础篇——反射的奥妙
  • .NET连接数据库方式
  • .NET微信公众号开发-2.0创建自定义菜单
  • .Net转Java自学之路—SpringMVC框架篇六(异常处理)
  • [4.9福建四校联考]
  • [Angular 基础] - 数据绑定(databinding)