golang学习——分工协作及功能复用

分工协作及功能复用

1. 如何实现分工

  • 模块化编程不仅可以提高代码结构的清晰度,还可以促进团队协作水平,提高开发效率

  • 建立项目

    • 建立项目文件夹,明确项目文件存放的具体位置
    • GOPATH下的src文件夹下面建立一个项目文件夹,如等差数列
  • 根据分工,为每个开发者建立各自的工作目录,分别为maininputsumoutput

  • 每个开发者右键各自的工作目录\选择New File 建立自己的go文件,分别为 main.goinput.gosum.gooutput.go

  • 其他工作目录和main文件夹在同级目录,那么在引用包的时候应写相对于src的相对路径;

  • package input//input.go
    
    import (
    	"fmt"
    )
    
    //Input 输入函数
    func Input() (a1 int, num int, dis int) {
          
           //()表示无参数
    	fmt.Println("input a0")
    	fmt.Scanln(&a1)
    	fmt.Println("input num")
    	fmt.Scanln(&num)
    	fmt.Println("input dis")
    	fmt.Scanln(&dis)
    	return
    }
    
    
  • package sum//sum.go
    
    //Sum 求和函数 
    func Sum(a1,num,dis int)(ans int){
          
          
    	ans=a1*num+num*(num-1)*dis/2
    	return 
    }
    
  • package output//output.go
    
    import (
    	"fmt"
    )
    //Output 输出函数
    func Output(ans int){
          
          
    	fmt.Println("the answer is:",ans)
    }
    
  • package main
    
    import (
    	"等差数列/input"
    	"等差数列/sum"
    	"等差数列/output"
    )
    
    func main(){
          
          
    	a1,num,dis:=input.Input()
    	ans:=sum.Sum(a1,num,dis)
    	output.Output(ans)
    }
    

    input a1 15 input num 20 input dis 3 the answer is: 870

2.如何进行单元测试

  • 日常开发中, 测试是不能缺少的

  • Go 语言中自带有一个轻量级的测试框架testing 和自带的go test 命令来实现单元测试和性能测试

  • 测试用例文件名必须以*_test.go结尾,*最好于测试文件的主文件名相同,以方便阅读

  • 测试用例代码与被测试代码存放路径相同

  • 标准测试参数为:t *testing.T

  • testing 提供对 Go 包的自动化测试的支持。通过 go test 命令,能够自动执行如下形式的任何函数:

    func TestXxx(*testing.T)
    

    其中 Xxx 可以是任何字母数字字符串(但第一个字母不能是 [a-z]),用于识别测试例程。

  • 在这些函数中,使用 Error, Fail 或相关方法来发出失败信号。

  • 一个测试用例文件中,可以有多个测试用例函数

  • PASS 表示测试用例运行成功,FAIL 表示测试用例运行失败

  • 当出现错误时,可以使用t.Fatalf 来格式化输出错误信息,并退出程序

  • t.Logf方法可以输出相应的日志

  • (1)cmd>go test[如果运行正确,无日志,错误时,会输出日志]
    (2) cmd>go test -v[运行正确或是错误,都输出日志]

package sum//sum包

//Sum 求和函数 
func Sum(a1,num,dis int)(ans int){
    
    
	ans=a1*num+num*(num-1)*dis/2
	return 
}
package sum//对sum包的单元测试

import "testing"//通过testing包实现自动化测试
func TestSum(t *testing.T){
    
    
	result:=Sum(1,100,1)
	if result!=5050{
    
    
		t.Fatalf("wrong")
	}else{
    
    
		t.Logf("success")
	}
}

E:\file\golang\goproject\src\分工协作\eqd\sum>go test PASS ok 分工协作/eqd/sum 0.159s

E:\file\golang\goproject\src\分工协作\eqd\sum>go test -v === RUN TestSum TestSum: sum_test.go:9: success --- PASS: TestSum (0.00s) PASS ok 分工协作/eqd/sum 0.163s

3.如何进行性能测试

  • 主要评价在压力环境下的的响应时间、负载等指标
  • 建立sum.go的性能测试用例代码sum_b_test.go
  • 测试函数名必须以Benchmark开头,标准性能测试参数为:b *testing.B
  • 执行 go test –bench=.* 进行性能测试
    package sum//对sum包的性能测试

    import "testing"
    func BenchmarkSum(b *testing.B){
    
    
        for i:=0;i<b.N;i++{
    
    //b.N为默认参数
            Sum(1,100,1)
        }
    }

E:\file\golang\goproject\src\等差数列\sum> go test -bench=".*"

goos: windows goarch: amd64 pkg: 等差数列/sum BenchmarkSum-8 1000000000 0.260 ns/op PASS ok 等差数列/sum 0.459s

运行10亿次,用时0.459s,0.260ns/op

  • 进行CPU和内存状态分析-文本格式
    • 首先go test -bench=".*" -cpuprofile=sum.prof
    • 生成可执行测试文件 sum.test.exe 和CPU性能文件sum.prof
    • 然后使用go tool pprof工具进入pprof命令模式分析数据: go tool pprof sum.test.exe sum.prof
    • 最后,输入text命令,以文本形式列出状态信息
    • quit退出
    • tree /f可以看到文件树
  • 进行CPU和内存状态分析-状态图方式
    • 首先go test -bench=".*" -cpuprofile=sum.prof
    • 然后使用go tool pprof工具进入pprof命令模式分析数据: go tool pprof sum.test.exe sum.prof
    • 输入web命令,在IE中查看cpu性能分析图(需要提前安装好graphviz才能在IE中以图形方式查看)
    • image-20200710110324478

4.如何集成?

  • 在项目研发过程中,单元测试和性能测试通过后,如何将各部分代码汇总形成完整的系统?各个项目成员又如何获取到完整的代码呢?
  • 协同开发工具的推荐
    • Source Control: CVS/SVN、git 和github
    • Bug Tracking: Bugzilla, Trac, Roundup
    • 交流工具: maillist, IM, Forum, IRC, Wiki
    • 协同开发平台: sourceforge, BaseCamp

5.如何编译并执行整个系统?

  • go install 包源码存放路径的最后一个目录
  • go install:主要用来生成库和工具。
    • 一是编译包文件(无main包),将编译后的包文件放到 pkg 目录下($GOPATH/pkg)。
    • 二是编译生成可执行文件(有main包),将可执行文件放到 bin 目录($GOPATH/bin)。
  • image-20200712225855357

6.代码复用

image-20200712230034172

  •     package main//findmax  main.go
    
        import (
            "fmt"
            "代码复用/maxthree"
        )
    
        func main(){
          
          
            fmt.Println(maxthree.Maxthree(3,4,5))
        }
    
  •     package maxthree//maxthree   maxthree.go
        import "代码复用/maxtwo"
        //Maxthree 找最大
        func Maxthree(a,b,c int)int{
          
          
            return maxtwo.Maxtwo(maxtwo.Maxtwo(a,b),c)
        }
    
  •     package maxtwo//maxtwo   maxtwo.go
        //Maxtwo 选出大者
        func Maxtwo (a,b int)int{
          
          
            if a>=b{
          
          
                return a
            }
            return b
        }
    

o(maxtwo.Maxtwo(a,b),c)
}


+ ```go
    package maxtwo//maxtwo   maxtwo.go
    //Maxtwo 选出大者
    func Maxtwo (a,b int)int{
        if a>=b{
            return a
        }
        return b
    }

猜你喜欢

转载自blog.csdn.net/jinniulema/article/details/119102982
今日推荐