我的Go+语言初体验——第一个Golang+ 应用程序

呦呦鹿鸣. 社区贡献者 2021-11-29 20:05:22

 

“我的Go+语言初体验” | 征文活动进行中......

 通过Homebrew安装GoLang         

  

GOPATH vs GOROOT 

 安装成功会自动生成两个目录:

       GOROOT ( /usr/local/go ): 该目录存放了Go的源码。Homebrew 将会为你自动注册该目录到计算机,

       GOPATH(/Users/toddbirchard/go):与大多数编程语言不同,go的所有项目和依赖项都应该存在于一个名为GOPATH的目录中。每当我们开发Go项目或安装第三方模块时,所有的操作最终都会发生在这个目录中。

      为了确保OSX能够识别GOPATH,我们必须将它添加到shell的启动脚本中。打开.bashrc、.zshrc或您使用的任何文件:

      

 

     接下来会添加基础目录和子目录

      

 

     保存修改,然后重新打开shell:

      

     现在我们来检查安装:

      

 

      最后我们再确认一下我们的GOPATH被识别成功了:

      

解剖GOPATH

       Golang的GOPATH是一个目录,您的所有Go代码和项目依赖项都位于其中。go CLI实际上有一个内置命令$go help gopath,它很好地解释了这一点:

GO路径用于解析导入语句
它由go/build包实现并记录在其中。
GOPATH环境变量列出查找Go代码的位置。

       与Python在Python路径中查找导入库的方式类似,Go在GOPATH中搜索相同的库。Python和Go路径之间的一个显著区别是Go希望所有的Go项目都位于GOPATH中,特别是/Go/src。这与Python相比,Python的项目可以在任何地方运行。

       GOPATH由三个子目录构成:

       

 解释了这些目录的作用

src:

 src目录保存源代码。src下面的路径确定导入路径或可执行文件名。

pkg:

pkg目录保存已安装的包对象。
与Go目录树一样,每个目标操作系统和体系结构对都有自己的pkg子目录(pkg/GOOS_GOARCH)。

 bin:

bin目录保存已编译的命令。
每个命令都以其源目录命名,但仅以最后一个元素命名,而不是以整个路径命名。

         简而言之,您的个人源代码属于/src,安装的第三方软件包将位于/pkg中,扩展go-CLI的第三方命令将位于/bin中。举个例子,我的路径是这样的:

         

 

        我们应该能够很容易地将其分解。

       /bin:包含我以前安装的两个Go命令。golint是Go的第三方linter,而“tour”是官方Go漫游的本地版本,帮助Go新手学习他们的语言(顺便说一句,我强烈建议完成这项工作)。
      /pkg:包含我安装的软件包。请特别注意/pkg/mod,您可以看到我在/Github.com目录下安装了几个来自Github的软件包。这些包包括dataframe go,它是Pandas-like DataFrames的go实现,以及mux,它是我们将在第一个hello world项目中使用的HTTP路由器。
      /src:有三个项目我已经做过了。golang helloworld是我们将在本教程中创建的项目。

GoLang 关键字

         在开始编码之前,让我们先复习一些基本的围棋词汇:

Package:Go程序由“包”组成,它反映了其他编程语言中的包概念(想想Python中的模块或Java中的包)。每个Golang程序都包含一个名为main的包,它是项目的入口点。
Module:Go模块是由Go安装的第三方库。模块本质上是已发布的项目,作为项目中的依赖项一般使用。
Vendors:这就是事情变得有趣的地方。虽然模块可以安装到/pkg/mod目录以供全局使用,但源项目可以包含它们自己的模块版本,以避免项目之间的依赖关系版本冲突(这与Python虚拟环境没有什么不同)。虽然不是必需的,但您可以选择保持模块版本特定于项目(我们将在示例中这样做)。

创建一个Hello World 应用程序

        说了这么多,接下来我们创建第一个golang应用程序,保存目录如下/go/src:

$ cd $GOPATH/src
$ mkdir golang-helloworld
$ cd golang-helloworld

        在新的项目目录中,我们现在将把项目初始化为Go模块。这意味着任何人都可以在Github上安装我们的Go代码,如果他们愿意的话。我知道我要将我的仓库保存到github.com/hackersandslackers/golang-helloworld,因此我们运行以下程序:

        

        完成此操作后,一个名为go.mod的新文件将出现在您的目录中。使用$cat go.mod查看内容,查看它的初始化:github.com/hackersandslackers/golang-helloworld,因此我们运行以下程序:

        

       到目前为止都很简单!go.mod包含其他人关于我们模块的信息,例如模块名称和它的目标版本。当我们为项目安装依赖项时,这些依赖项及其各自的版本将存储在这里。

 main.go

       如前所述,每个Go项目的入口点都是一个名为main.Go的文件。我们将创建最简单的main.go文件:他将输出"Hello, world.":

       

       现在请记住:因为Go是一种编译语言,所以我们需要先构建项目,然后才能运行它😮:

         

 

        大功告成!我们刚刚在Go中创建了第一个“hello world”应用程序。您的项目结构现在应该如下所示:

         

 

         新创建的golang helloworld文件是每次运行$go build时创建的已编译可执行文件。每次对源代码进行更改时,我们都应该再次运行$go build以使用更改重新生成此可执行文件。

代码格式:

        Go中的一个漂亮工具是一个代码格式化程序,可以清理源代码中的任何丑陋缩进等。尝试在main.go中弄乱缩进并运行以下操作:

        

 

         这将修复输出文件名中所有难看的格式,在我们的例子main.go中。

创建一个Web应用程序

         虽然我们已经成功地建立了Golang,学会了第一个应用程序“Hello,world”,但我们还没有学到很多有用的东西。是时候让我们的应用程序成为一个可以通过浏览器提供服务的web应用程序了。

         添加第一个依赖

         为了通过web服务器提供Go代码,我们将利用非常流行的gorilla/mux模块:一个轻量级的请求路由器和调度器,用于将传入的请求与各自的处理程序进行匹配。https://github.com/gorilla/mux

         通过运行$go get,然后运行$go install来安装:

         

        go get将gorilla/mux的源代码安装到我们的/go/bin目录中。-u标志是一个“更新”标志,我们用它获取最新版本。

        让我们看看运行$cat go.modgo.mod的影响:

         

         我们的模块依赖项现在已经添加到go.mod中,并带有正确的版本号。现在我们可以导入并使用github.com/gorilla/mux来帮助我们构建一个项目!

         我们还可以使用$go mod vendor/vendors文件夹中构建本地此依赖项。下面是一堵代码片段,它将我们的hello world应用程序转变为web应用程序:

          

          这里的函数是main()、router()和handler(),它们按该顺序执行。

         main()
         main()将HTTP服务器设置为在端口9100上本地提供服务,并将读写超时设置为最佳实践的一种形式。如果没有任何路由需要解决,我们的服务器本身就做不了多少事情。这就是我们的router()函数的作用。
         router()
         我们通过使用r := mux.NewRouter()创建变量r来初始化“路由器”。在此基础上,我们可以使用以下语法设置任意多个路由:

         

 

         HandleFunc()是解析URL路由的内置方法。第一个参数是目标URL,第二个参数是当用户请求所述路由时要执行的函数的名称。在我们的示例中,我们只指定了一条路线,但理论上我们可以设置任意数量的路线,例如:

         

 

         handler()
         默认情况下,Mux处理程序函数始终接受两个参数,它们基本上解析为输出和输入。w http.ResponseWriter需要一个名为w的参数,其类型为http.ResponseWriter,这是我们返回以向最终用户呈现内容的参数。r *http.Request包含有关用户请求的信息,保存到名为r的参数中。
         我们就简单点,因此我们只简单演示输出“hello world”消息的方法:

         

       使用$go build$go run main.go重新构建并运行我们的项目。现在尝试在浏览器中访问本地IP(127.0.0.1:9100):

     

      成功了

下面讲解一下语法:

        “Export”方法(又名:公共与私有)
        几乎每种编程语言都有“私有”与“公共”函数的概念。Go也有关于包之间共享函数的概念。“共享”的方法称为“导出方法”(参考JavaScript)。

        如果名称以大写字母开头,则导出方法名称。我们的helloworld示例只包含私有函数(这很有意义,因为我们只有一个包)。如果我们想让其他包可以访问我们的router()函数,我们只需要将其重命名为Router()。

        类型声明
Go期望变量、传入函数参数和函数返回值具有声明的类型。在下面的示例中,函数add()接受两个整数并将它们相加,这无疑会产生一个整数:

       

       变量使用与函数参数相同的语法进行设置,变量名称排在第一位:

       

        还有一种通过逗号分隔变量名来设置相同类型的多个变量的速记方法。在这种情况下,变量x、y和z被设置为无赋值的整数:

        

        赋值语句
        Go的一个非常酷的特性是 := 操作符。“short assignment”操作符可用于使用隐式类型一次设置多个变量。这意味着Go将根据分配的值自行解析每个变量的类型,而无需显式类型声明。下面的示例创建三个变量,其中x和y解析为布尔值,z解析为字符串:

       

      常量

       


      好吧,就写到这里,创作不易,麻烦点个赞

 

安装GO+

       1.安装GO+包,地址:https://github.com/goplus/gop.git,下载完成点击Download ZIP

     

        解压后在根目录输入:go run cmd/make.go --install

         

        添加环境变量

        

        验证:

        在控制台输入:gop versioon

        

       2.打开VSCODE安装插件,在插件窗口里搜索Goplus:

       

     点击安装

    2.新建一个文件夹命名为Goplus,在此文件夹中用命令行输入:go mod init go+         

   

    可以看到文件夹中出现了go.mod模块文件​​​​​​​ 

   

    go get github.com/goplus/gop/builtin

       下载最新的go+版本:

       

       3.验证:

       在Goplus文件夹中新建一个Hello.gop文件:

       写入如下代码: 

println [1, "Hello", true,1.2]

       控制台下运行

      

      并且自动将我们的go+代码生成了go代码:

      

      go代码如下:

     

GO+语法

1.数据类型及定义方法

//基础数据类型
var a int   
var b float64    
var c bool    //布尔
var d string
//复合数据类型
var e []int    //数组
var f map[string] int
var g chan int
var h func(string) int    函数
var i error

2.导入导出依赖的方法和python和go一样的

import "fmt"和go/py导入用法相同

3.定义函数

func 函数名(){
    ...
}

举例:
func add(a,b){
    return a+b
}

4.if-else,和lua语法的if else 写法有点类似,条件可以不要括号

if condition {
     println("condition, true")
} else {
     println("condition, false")
}

5.Switch -- case , 和C语言有点类似,省略了break,和value的括号

switch value{
  case value1:
      ...
  case value2:
      ...
  default:
      ...
}

​​​​​​​6.Go+语法新特性

由Go的fmt.Printf()升级为println,无需再import "fmt"了

for 循环

形式一:
for i <- [true, 2, 3, 4, "aa", 5, 10.5]


///////////////////////
形式二:
for i <- [true, 2, 3, 4, "aa", 5, 10.5], i > 2 {
  println i
}
这里i>2是条件判断


////////////////////////////////////////////
形式三:rang(start, end, step)
for i := range 0:9:2 {
  println i
}
上面的意为从0到9遍历,步长为2,和C语言里的i+=2类似

字符串遍历:

for i <- "hello world"{
    println i
}

列表推导

a := [i*i for i <- [1, 2, 3, 4, 5]]
b := [i*i for i <- [1, 2, 3, 4, 5], i > 3]
c := [i+j for i, j <- [1, 2, 3, 4, 5], i%2 == 1]

 

总结:可以看到go+确实简洁了更多,只需要更少的代码就能实现go里很多代码,手撸代码量更少了,不亦乐乎?

      “我的Go+语言初体验” | 征文活动进行中......

 

...全文
821 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
夏末秋初19 2021-12-01
  • 打赏
  • 举报
回复 5
点赞
第1章 5个例子 1 1.1 开始 1 1.2 编辑、编译和运行 3 1.3 Hello Who? 6 1.4 大数字——二维切片 8 1.5 栈——自定义类型及其方法 12 1.6 americanise示例——文件、映射和闭包 18 1.7 从极坐标到笛卡儿坐标——并发 28 1.8 练习 33 第2章 布尔与数值类型 35 2.1 基础 35 2.2 布尔值和布尔表达式 39 2.3 数值类型 40 2.3.1 整型 42 2.3.2 浮点类型 46 2.4 例子:statistics 53 2.4.1 实现一个简单的统计函数 54 2.4.2 实现一个基本的HTTP服务器 55 2.5 练习 58 第3章 字符串 60 3.1 字面量、操作符和转义 61 3.2 比较字符串 63 3.3 字符和字符串 65 3.4 字符串索引与切片 67 3.5 使用fmt包来格式化字符串 69 3.5.1 格式化布尔值 73 3.5.2 格式化整数 74 3.5.3 格式化字符 75 3.5.4 格式化浮点数 75 3.5.5 格式化字符串和切片 76 3.5.6 为调试格式化 78 3.6 其他字符处理相关的包 80 3.6.1 strings包 81 3.6.2 strconv包 86 3.6.3 utf8包 90 3.6.4 unicode包 91 3.6.5 regexp包 92 3.7 例子:m3u2pls 101 3.8 练习 106 第4章 集合类型 108 4.1 值、指针和引用类型 108 4.2 数组和切片 115 4.2.1 索引与分割切片 119 4.2.2 遍历切片 119 4.2.3 修改切片 121 4.2.4 排序和搜索切片 125 4.3 映射 128 4.3.1 创建和填充映射 129 4.3.2 映射查询 131 4.3.3 修改映射 132 4.3.4 键序遍历映射 132 4.3.5 映射反转 133 4.4 例子 134 4.4.1 猜测分隔符 134 4.4.2 词频统计 136 4.5 练习 141 第5章 过程式编程 144 5.1 语句基础 144 5.1.1 类型转换 147 5.1.2 类型断言 148 5.2 分支 149 5.2.1 if语句 150 5.2.2 switch语句 151 5.3 for循环语句 158 5.4 通信和并发语句 160 5.5 defer、panic和recover 166 5.6 自定义函数 171 5.6.1 函数参数 172 5.6.2 init()函数和main()函数 175 5.6.3 闭包 176 5.6.4 递归函数 178 5.6.5 运行时选择函数 181 5.6.6 泛型函数 183 5.6.7 高阶函数 187 5.7 例子:缩进排序 192 5.8 练习 197 第6章 面向对象编程 199 6.1 几个关键概念 199 6.2 自定义类型 201 6.2.1 添加方法 203 6.2.2 验证类型 207 6.3 接口 209 6.4 结构体 217 6.5 例子 224 6.5.1 FuzzyBool——一个单值自定义类型 224 6.5.2 Shapes——一系列自定义类型 229 6.5.3 有序映射——一个通用的集合类型 240 6.6 练习 248 第7章 并发编程 251 7.1 关键概念 252 7.2 例子 256 7.2.1 过滤器 256 7.2.2 并发的Grep 260 7.2.3 线程安全的映射 266 7.2.4 Apache报告 271 7.2.5 查找副本 278 7.3 练习 285 第8章 文件处理 287 8.1 自定义数据文件 287 8.1.1 处理JSON文件 290 8.1.2 处理XML文件 295 8.1.3 处理纯文本文件 301 8.1.4 处理Go语言二进制文件 307 8.1.5 处理自定义的二进制文件 309 8.2 归档文件 317 8.2.1 创建zip归档文件 317 8.2.2 创建可压缩的tar包 319 8.2.3 解开zip归档文件 321 8.2.4 解开tar归档文件 322 8.3 练习 324 第9章 包 326 9.1 自定义包 326 9.1.1 创建自定义的包 327 9.1.2 导入包 333 9.2 第三方包 334 9.3 Go命令行工具简介 335 9.4 Go标准库简介 336 9.4.1 归档和压缩包 336 9.4.2 字节流和字符串相关的包 336 9.4.3 容器包 337 9.4.4 文件和操作系统相关的包 339 9.4.5 图像处理相关的包 341 9.4.6 数学处理包 341 9.4.7 其他一些包 341 9.4.8 网络包 342 9.4.9 反射包 343 9.5 练习 346 附录A 后记 348 附录B 软件专利的危害 350 附录C 精选书目 353

1,006

社区成员

发帖
与我相关
我的任务
社区描述
Go+ 官方开发者社区。我们希望向广大的开发者和数据科学家介绍 Go+ 的定位和意义,并邀请更多开发者一起贡献代码、共建 Go+ 生态。 Go+ 官网:https://goplus.org/
其他 企业社区
社区管理员
  • Go+
  • 杨东杰
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

本社区为 Go+ 官方开发者社区。我们希望向广大的开发者和数据科学家介绍 Go+ 的定位和意义,并邀请更多开发者一起贡献代码、共建 Go+ 生态。

Go+ 官网:https://goplus.org/
GitHub地址:https://github.com/goplus/gop

试试用AI创作助手写篇文章吧