Go工程构建的一些思考 | 青训营笔记

64 阅读3分钟

这是我参与「第五届青训营 」笔记创作活动的第2天

前言

近期学习进度有些缓慢,笔记也懒得写了。又懒又菜,实在是不该,内心羞愧不已。于是乎23:00爬起来来写笔记。

问题的发现

虽说基础语法这些,看一遍就看懂了,不会的地方也可以随时翻阅查询。但是我作为一名"实战派",还是喜欢把代码亲自打一打,日后写起来才会顺手。于是乎,高高兴兴的建好文件。第一个helloworld.go写完后,很自然的写了第二个文件。点击运行,结果出了问题。

image.png 此时才发现对于Go语言,一个包下只能有一个main函数。对于后面web项目等等来说倒是无可厚非,但是在初步学习阶段,我还是很习惯一个包下放很多文件,来练习不同的语法。

三种解决方法

既然人家已经明说一个包下只能有一个main函数,自然不能与编译器抬杠。但是我们还是有许多解决办法的。

方案一:设置不同的包

一个包下只能有一个main函数,那么用包来分开放置小文件不就好了。第一节课老师的示例代码也是这样放置的。不过这样多少觉得有点麻烦,毕竟要多一步新建包的操作。 代码层次结果如图所示

image.png

方案二:使用Go的单元测试

第二节课我们学到了Go语言的单元测试,只需新建一个测试文件,便可方便的调用其对于文件的函数,我们使用这种方式作为练习也是可以的。不过依然存在要多一步操作的问题。代码层次结果如图所示

image.png

方案三:多建几个函数

这就是我目前采用的方案了。在一个文件内写大量的函数,然后在main函数里面调用。作为一种懒狗写法,他的可维护性,观赏性差了很多。但是确实省了不少操作,对于初期学习,也并不需要后期维护。我觉得目前这种方案是可取的。代码示例(很乱且没有实际意义,关注结构即可)

func constTest() {
   const s = "const var"
   const h = 500000000
   const i = 3e20 / h
   fmt.Println(s, h, i)
   const (
      a = iota
      b
      c
   )
   println(a, b, c)
}
func ifTest() {
   i := 0
   for {
      fmt.Println("loop", i)
      i += 1
      if i == 100 {
         break
      }
   }

   for n := 0; n < 5; n++ {
      if n%2 == 0 {
         continue
      }
      println(n)
   }
   for i > 1 {
      println(i)
      i -= 1
   }
}
func switchTest() {
   t := time.Now()
   switch {
   case t.Hour() > 12:
      println("下午")
   case t.Hour() < 12:
      println("上午")
   }
}
func main() {
   //constTest()
   //ifTest()
   switchTest()
}

思考

学一门新的语言,心里总会有之前学过语言的影子。一开始遇到问题我还在想,为什么Java可以一个包下每个文件都有一个main函数,Go就不可以。但其实每一个语言都有其自己的特色,我们应该不断去了解它的特点,深入的理解它。对待人亦是如此。