首页 > 其他分享 >0x01 - 新建go项目 & go项目的模块处理

0x01 - 新建go项目 & go项目的模块处理

时间:2024-04-04 21:44:21浏览次数:14  
标签:项目 fmt args 0x01 add go simplemath calc

0x00 - 目标-一个计算器项目,可以计算加法和开根号

首先要有一个根目录的概念。我们给这个项目起一个名字,叫做first_go.

看一下我们要有的目录结构长这样:

(base) vth@vthdeMacBook-Pro learn_go % tree
.
└── first_go
    ├── bin
    │   └── calc
    ├── pkg
    └── src
        ├── calc
        │   └── calc.go
        └── simplemath
            ├── add.go
            ├── add_test.go
            ├── sqrt.go
            └── sqrt_test.go

7 directories, 6 files

其中bin/pkg/src是一个基于GOPATH构建体系必不可少的三大块。

pkg主要处理模块(包),而bin存放了编译好的程序,src中就全是代码了。

其中, src中的calc是入口程序,而simplemath作为一个自己写的基础库,被calc调用。

 

0x01 - 代码清单

calc/calc.go

package main

import "os"
import "fmt"
import "simplemath"
import "strconv"


var Usage = func(){
    fmt.Println("Usage: calc command [arguments] ...")
}

func main(){
    args := os.Args[1:]
    if args == nil || len(args) < 2{
        Usage()
        return
    }
    switch args[0]{
        case "add":
            if len(args) != 3{
                fmt.Println("USAGE: calc add <integer1><integer2>")
                return
            }
            v1, err1 := strconv.Atoi(args[1])
            v2, err2 := strconv.Atoi(args[2])
            if err1 != nil || err2 != nil{
                fmt.Println("USAGE: calc add <integer1><integer2>")
                return
            }
            ret := simplemath.Add(v1, v2)
            fmt.Println("Result: ", ret)
        case "sqrt":
            if len(args) != 2{
                fmt.Println("USAGE: calc sqrt <integer>")
                return
            }
            v, err := strconv.Atoi(args[1])
            if err != nil{
                fmt.Println("USAGE: calc sqrt <integer>")
                return
            }
            ret := simplemath.Sqrt(v)
            fmt.Println("Result: ", ret)
        default:
            Usage()
    }
}

add.go

package simplemath

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

add_test.go

package simplemath

import "testing"

func TestAdd1(t, *testing.T){
    r := Add(1, 2)
    if r != 3{
        t.Errorf("Add(1, 2) failed, Got %d, expected 3.", r)
    }
}

sqrt.go

package simplemath

import "math"

func Sqrt(n int) int{
    v := math.Sqrt(float64(n))
    return int(v)
}

sqrt_test.go

package simplemath

import "testing"

func TestSqrt1(t *testing.T) {
    v := Sqrt(16)
    if v != 4{
        t.Errorf("Sqrt(16) failed, Got %v, expected 4", v)
    }
}

 

0x02 - 环境搭建

因为我们采用的是GOPATH,所以要做2个事情:

1. 将当前的项目根目录加入到GOPATH中。

2. 将GO111MODULE设置为off, 意思是要走GOPATH构建模式,不要走GOMOD.

export GOPATH="/Users/vth/Projects/learn_go/first_go" # 第一步
go env -w GO111MODULE=off # 第二步

然后我们进入到bin目录下进行编译:

go build calc 

大功告成!可以用一下试试:

(base) vth@vthdeMacBook-Pro bin % ./calc add 2 3
Result:  5

 

标签:项目,fmt,args,0x01,add,go,simplemath,calc
From: https://www.cnblogs.com/bjfu-vth/p/18114976

相关文章

  • django渲染模板与vue的语法冲突解决Flask框架默认WSGI:Werkzeug
    django渲染模板与vue的语法冲突解决Flask框架默认WSGI:Werkzeug Python来说,它有很多web框架,常见的有jango、Flask、Tornado、sanic等,比如Odoo、Superset都基于Flask框架进行开发的开源平台,具有强大的功能。在Linux下,默认使用的WSGIServer一般为Gunicorn,它是一个比较出名的We......
  • SAP 消息号 GLT2002 项目种类*****丢失(在科目***中是必须的)
    【背景】在做F-40汇票收付的时候,遇到以上error。【对应方法】先找到【为文档拆分给总分类账科目分类】点击进入。将原本分类03000改成04000,返回F-40即可成功过账。......
  • 一个好的Java项目是什么样子?
    1、数据闭环数据闭环是每一个程序员都需要考虑的问题a、数据/资源从何而来?数据/资源不能凭空产生,经常会遇到模拟面试的粉丝或者朋友,出现数据凭空产生的情况;我举一个案例,比如仓库管理类的系统:仓库如何录入物料/商品/物品,有的粉丝说通过表单直接填写,这样就会造成资源凭空产生......
  • python项目练习——14.学生管理系统
    这个项目可以让用户管理学生的信息,包括学生的姓名、年龄、成绩等,并提供添加、编辑、删除、查询等功能。这个项目涉及到数据库操作、用户界面设计、数据验证等方面的技术。代码示例:importtkinterastk #导入Tkinter库importsqlite3 #导入sqlite3库classStude......
  • Linux项目自动化构建工具 --- make/Makefile
    文章目录make/Makefile文件1背景2理解2.1创建执行代码2.2创建makefile文件2.3运行make指令2.3.1依赖关系2.3.2依赖方法2.3.3原理2.4项目清理make/Makefile文件1背景会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力一个工程中的源文......
  • golang 接口类型断言失败时,有哪些方式可以优雅地处理panic?
    在Go语言中,接口类型断言失败会导致运行时panic。为了避免程序因为类型断言失败而意外终止,可以采取以下几种优雅处理panic的方法:1.使用recover函数recover函数可以用来捕获panic,并从中恢复。这通常与defer语句一起使用。在进行类型断言的代码块之后,可以添加一......
  • golang反射与接口类型断言有什么区别?
    在Go语言中,反射(Reflection)和接口类型断言(InterfaceTypeAssertion)是两种不同的机制,它们各自有不同的用途和行为。以下是对它们的比较和区别的详细解释。反射(Reflection)反射是一种在运行时检查和操作程序内容的能力。在Go语言中,反射主要通过reflect包来实现。反射使......
  • 基于keil搭建stm32项目
    1.下载stm32cube的固件包1.1进入st的官网ST官网传送门1.2查找固件包 1.3找到自己的硬件对应的系列的固件包 1.4选择固件包点击进入后,点击获取软件 1.5选择版本下载 2.创建项目相关的目录2.1创建项目相关的目录 2.2给Drivers添加相关的驱动文件或者目录......
  • 有了uWGSI服务器,Django 为什么还需要 Nginx?
     一个普通的个人网站,访问量不大的话,当然可以由uWSGI和Django构成。但是一旦访问量过大,客户端请求连接就要进行长时间的等待。这个时候就出来了分布式服务器,我们可以多来几台Web服务器,都能处理请求。但是谁来分配客户端的请求连接和Web服务器呢?Nginx就是这样一个管家......
  • 操作系统综合题之“短进程优先调度算法(Shortest-Process-First,SPF)和非抢占式优先权调
    一、问题:1.当系统采用短进程优先调度算法时,试写出进程的执行顺序,并计算各个进程的周转时间以及平均周转时间2.当系统采用优先权调度算法时,试写出进程的执行顺序,并计算各个进程的周转时间以及平均周转时间  二、参考答案上面是短进程优先调度算法下面是优先权调度算法 ......