欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Go、Go开发要点、Go语言入门

程序员文章站 2022-04-29 08:18:27
...

  Go

  Go顾名思义是关注速度和效率的软件,一是运行速度,二是开发速度。Go的代码开发行数要明显少于C++,有些C++的项目可以移植到Go语言下实现。

  对于大多数企业而言,他们早期的Web应用程序在构建时并未考虑到可扩展性和易用性。随着业务的增长,这些应用程序越来越难以处理更频繁的请求和更重的负载。面对类似的成长困境,一小队Google工程师在2007年开发了一种名为Golang的语言,简称Go。Go语言是Robert Griesemer、Rob Pike和Ken Thompson于2007年在Google最初开发的一种编程语言。它是一种静态类型的语言,其语法与C相似。它提供了垃圾回收,类型安全性,动态键入功能以及许多高级内置类型,例如可变长度数组和键值映射。它还提供了丰富的标准库。 Go编程语言于2009年11月发布,并在Google的某些生产系统中使用。易于部署、强大的并发性和简单的语法使Go语言成为构建快速,可扩展的应用程序并与您的业务一起发展的出色语言。Go是出于完成工作的需要而创建的。这不是编程语言理论的最新趋势,而是解决现实世界问题的一种方法。它从具有静态类型的命令式语言中提取概念。它的编译速度快,执行速度快,并增加了易于理解的并发性,因为现在多核CPU很常见,并且已成功用于大型代码库(在Google处有大约1亿个本地代码)、标准库和庞大的社区。

  那么,Go可以为您的项目带来什么好处?让我们看一下Go的一些功能,这些功能使其成为明智的开发选择。

  编译语言

  Go是一种编译语言。编译语言以其速度而著称,因为它们可以直接转换为机器级代码,可以直接由计算机读取,而不必每次运行应用程序时都被解释,例如网页上的JavaScript。因此,当您编写完源代码后,将通过编译器运行该编译器,该编译器会将源代码转换为可执行文件,可分发该文件以在另一台计算机上运行该程序。

  编译器

  除了作为一种编译语言的快速性之外,Go编译器还具有其他优点,例如能够检查错误,更易于部署以及能够优化代码以提高效率。

  错误检查

  Go编译器的错误检查功能能够检测出未使用的变量,缺少运行或键入错误或无效操作所需的包或导入的变量。

  编译器会在程序的生成过程中发现这些错误。因此,Go甚至可以在运行程序之前让您了解什么有效,什么无效,从而节省了开发过程中的时间,而无需寻找bug。

  交叉编译

  Go的另一个独特功能是能够交叉编译您的应用程序,使其能够在与用于开发的计算机不同的计算机上运行。 Go编译器允许您使用简单的命令为不同的操作系统生成可执行二进制文件。无需将Go安装在外部计算机上,您可以轻松地交叉编译原始源代码以在多台计算机上运行。这使得将Go应用程序部署到生产服务器或本地计算机上变得轻而易举-只需移动最终的可执行文件即可。

  其它特点垃圾回收

  垃圾回收或自动内存管理是Go语言的一项关键功能。 Go擅长对内存分配进行大量控制,并且在最新版本的垃圾收集器中大大降低了延迟,平均延迟低于1毫秒。 Go的垃圾收集器通过与程序同时运行并使用三色标记扫掠算法来实现此目的。

  可伸缩性

  由于Go是由Google构建的,因此在设计时考虑了可伸缩性。随着应用程序的增长,它们需要同时处理许多较小的子任务,例如将HTML页面传递到各个Web浏览器。在应用程序中同时运行任务称为并发。 Go具有许多旨在处理并发性的内置功能,最著名的是goroutine和通道。

  Goroutines是能够与其他函数同时运行的函数。通道允许不同的goroutine相互通信,以确定如何最好地完成任务。

  简单易懂

  最后,Go简单易懂。借助非常小的语言规范文档,Go努力做到既易于阅读又易于编写。 Go官方网站还包括一个教程,可通过在浏览器中键入和练习代码来开始使用该语言。

  Go开发要点路由项目开发 (使用 gorilla/mux)

  Go的net / http软件包为HTTP协议提供了许多功能。它做得不好的一件事是复杂的请求路由,例如将请求url分割成单个参数。幸运的是,有一个非常受欢迎的程序包,以Go社区中良好的代码质量而闻名。在此示例中,您将看到如何使用gorilla / mux包创建具有命名参数、GET / POST处理程序和域限制的路由。

  安装gorilla/mux包

  gorilla / mux是适用于Go的默认HTTP路由器的软件包。它具有许多功能,可以提高编写Web应用程序时的生产率。它还符合Go的默认请求处理程序签名功能(w http.ResponseWriter,r * http.Request),因此该包可以与其他HTTP库(例如中间件或现有应用程序)混合使用。使用go get命令从GitHub安装软件包,如下所示:

  go get -u github/gorilla/mux创建一个新的路由器

  首先创建一个新的请求路由器。路由器是Web应用程序的主要路由器,以后将作为参数传递给服务器。它将接收所有HTTP连接,并将其传递给您将在其上注册的请求处理程序。您可以这样创建新的路由器:

  r :=mux.NewRouter()注册请求处理程序

  一旦有了新的路由器,就可以像往常一样注册请求处理程序。唯一的区别是,http.HandleFunc(...)您无需HandleFunc像调用那样在路由器上进行调用,而是这样:r.HandleFunc(...)。

  URL参数

  gorilla/mux路由器的最大优势是能够从请求URL中提取分段。例如,这是您的应用程序中的URL:

  /books/go-programming-blueprint/page/10

  该URL具有两个动态段:

  书名(go-programming-blueprint)页面(10)

  要使请求处理程序与上述URL匹配,您可以使用URL模式中的占位符替换动态分段,如下所示:

  r.HandleFunc("/books/{title}/page/{page}", func(w http.ResponseWriter, r *http.Request) {

  // get the book

  // navigate to the page

  })

  最后一件事是从这些段中获取数据。该包带有功能mux.Vars(r)它接受http.Request作为卖游戏账号参数并返回地图上的节段。

  func(w http.ResponseWriter, r *http.Request) {

  vars :=mux.Vars(r)

  vars["title"] // the book title slug

  vars["page"] // the page

  }设置HTTP服务器的路由器

  有没有想过什么nil在http.ListenAndServe(":80", nil)替换?它是HTTP服务器的主路由器的参数。默认情况下为nil,表示使用net/http程序包的默认路由器。要使用自己的路由器,请将替换为routernil 的变量r。

  http.ListenAndServe(":80", r)代码

  This is the complete code that you can use to try out the things you’ve learned in this example.

  package main

  import (

  "fmt"

  "net/http"

  "github/gorilla/mux"

  )

  func main() {

  r :=mux.NewRouter()

  r.HandleFunc("/books/{title}/page/{page}", func(w http.ResponseWriter, r *http.Request) {

  vars :=mux.Vars(r)

  title :=vars["title"]

  page :=vars["page"]

  fmt.Fprintf(w, "You've requested the book: %s on page %s

  ", title, page)

  })

  http.ListenAndServe(":80", r)

  }gorilla/mux路由器的功能方法

  将请求处理程序限制为特定的HTTP方法。

  r.HandleFunc("/books/{title}", CreateBook).Methods("POST")

  r.HandleFunc("/books/{title}", ReadBook).Methods("GET")

  r.HandleFunc("/books/{title}", UpdateBook).Methods("PUT")

  r.HandleFunc("/books/{title}", DeleteBook).Methods("DELETE")主机名和子域

  将请求处理程序限制为特定的主机名或子域。

  r.HandleFunc("/books/{title}", BookHandler)("mybookstore")方案

  将请求处理程序限制为http / https。

  r.HandleFunc("/secure", SecureHandler).Schemes("https")

  r.HandleFunc("/insecure", InsecureHandler).Schemes("http")路径前缀和子路由器

  将请求处理程序限制为特定的路径前缀。

  bookrouter :=r.PathPrefix("/books").Subrouter()

  bookrouter.HandleFunc("/", AllBooks)

  bookrouter.HandleFunc("/{title}", GetBook)