百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

从0开始Go语言,用Golang搭建网站,10分钟搭建Go开发环境

toyiye 2024-06-24 19:23 11 浏览 0 评论

私信我或关注微信号:猿来如此呀,回复:学习,获取免费学习资源包。

如何10分钟搭建Go开发环境

1.下载Go语言安装文件

访问Go语言官方网站下载页面:

https://golang.org/dl

可以看到官网提供了Microsoft Windows、Apple MacOS、Linux和Source下载。

直接下载对应操作系统的安装包。

[图片上传失败...(image-591890-1557632893071)]

2.和其他软件一样,根据提示安装

3.配置环境变量

在正式使用Go编写代码之前,还有一个重要的“环境变量”需要配置:“$GOPATH”

GOPATH环境变量指定工作区的位置。如果没有设置GOPATH,则假定在Unix系统上为$HOME/go,在Windows上为 %USERPROFILE%\go。如果要将自定义位置用作工作空间,可以设置GOPATH环境变量。

GOPATH环境变量是用于设置Go编译可以执行文件、包源码以及依赖包所必要的工作目录路径,Go1.11后,新的木块管理虽然可以不再依赖 $GOPATH/src,但是依然需要使用 $GOPATH/pkg 路径来保存依赖包。

首先,创建好一个目录用作GOPATH目录

然后设置环境变量 GOPATH:

Linux & MacOS:


导入环境变量

$ export GOPATH=$YOUR_PATH/go

保存环境变量

$ source ~/.bash_profile

Windows:


控制面板->系统->高级系统设置->高级->环境变量设置

GOPATH所指定的目录会生成3个子目录:

  • bin:存放 go install 编译的可执行二进制文件
  • pkg:存放 go install 编译后的包文件,就会存放在这里
  • src:存放 go get 命令下载的源码包文件


4.检查环境

打开命令行工具,运行

$ go env

如果你看到类似这样的结果,说明Go语言环境安装完成.

GOARCH="amd64"
GOBIN=""
GOCACHE="/Users/zeta/Library/Caches/go-build"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="darwin"
GOPATH="/Users/zeta/workspace/go"
GOPROXY="https://goproxy.io"
GORACE=""
GOROOT="/usr/local/go"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64"
GCCGO="gccgo"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
GOMOD=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/7v/omg2000000000000019/T/go-build760324613=/tmp/go-build -gno-record-gcc-switches -fno-common"

5.选择一款趁手的编辑器或IDE

现在很多通用的编辑器或IDE都支持Go语言比如

  • Atom
  • Visual Studio Code
  • Sublime Text2
  • ItelliJ Idea

Go语言专用的IDE有

  • LiteIDE
  • Goland

专用的IDE无论是配置和使用都比通用编辑器/IDE的简单许多,但是我还是推荐大家使用通用编辑器/IDE,因为在开发过程中肯定会需要编写一些其他语言的程序或脚本,专用IDE在其他语言编写方面较弱,来回切换不同的编辑器/IDE窗口会很低效。

另外,专用IDE提供很多高效的工具,在编译、调试方面都很方便,但是学习阶段,建议大家手动执行命令编译、调试,有利于掌握Go语言。

四行代码的Hello World!所能表达出来的核心


命令行代码仅适用于Linux和MacOS系统,Windows根据说明在视窗下操作即可。

1.创建项目

创建一个文件夹,进入该文件夹

$ mkdir gowebserver && cd gowebserver

新建一个文件 main.go

$ touch main.go

2. 用编辑器打开文件,并输入以下代码:

package main
import "fmt"
func main() {
 fmt.Println("Hello, 世界")
}

3.打开命令行终端,输入以下命令

$ go run main.go

看到终端会输出:

Hello, 世界

第一个Go代码就完成了

这是一个很简单的Hello World,但是包含了Go语言编程的许多核心元素,接下来就详细讲解。

解读知识点: 包 与 函数

package申明包 & import导入包

Go程序是由包构成的。

代码的第一行, 申明程序自己的包,用 package 关键字。package关键字必须是第一行出现的代码。

范例代码中,申明的本包名 main

在代码中第二行, 导入“fmt”包, 使用 import 关键字。默认情况下,导入包的包名与导入路径的最后一个元素一致,例如 import "math/rand",在代码中使用这个包时,直接使用rand,例如 rand.New()

导入包的写法可以多行,也可以“分组”, 例如:

import "fmt"
import "math/rand"

或者 分组

import (
 "fmt"
 "math/rand"
)

fmt包是Go语言内建的包,作用是输出打印。

func关键字:定义函数

func是function的缩写, 在Go语言中是定义函数的关键字。

func定义函数的格式为:

func 函数名(参数1 类型,参数2 类型){
 函数体
}

本例中定义了一个main函数。main函数没有参数。

然后在main函数体里调用fmt包的Println函数,在控制台输出字符串 “Hello, 世界”

所有Go语言的程序的入口都是main包下的main函数 main.main(),所以每一个可执行的Go程序都应该有一个main包和一个main函数。

我们已经介绍了九牛一毛中的一毛,接下来正式通过搭建一个简单的Web服务学习Go语言

0依赖,创建一个Web服务

先从代码开始

打开之前创建好的main.go文件,修改代码如下:

package main
import (
 "fmt"
 "net/http"
)
func myWeb(w http.ResponseWriter, r *http.Request) {
 fmt.Fprintf(w, "这是一个开始")
}
func main() {
 http.HandleFunc("/", myWeb)
 fmt.Println("服务器即将开启,访问地址 http://localhost:8080")
 err := http.ListenAndServe(":8080", nil)
 if err != nil {
 fmt.Println("服务器开启错误: ", err)
 }
}

保存文件,然后在命令行工具下输入命令,运行程序

$ go run main.go

这时候,你会看到用 fmt.Println打印出来的提示,在浏览器中访问 http://localhost:8080你将访问到一个页面,显示 "这是一个开始"

解读

我们从程序运行的顺序去了解它的工作流程

首先,定义package main,然后导入包。

这里,导入了一个新的包 net/http,这个包是官方的,实现http客户端和服务端的各种功能。Go语言开发Web服务的所有功能就是基于这个包(其他第三方的Go语言Web框架也都基于这个包,没有例外)

先看main函数里发生了什么

第一句,匹配路由和处理函数

http.HandleFunc("/", myWeb)

调用http包的HandleFunc方法,匹配一个路由到一个处理函数myWeb。

这句代码的意思是,当通过访问地址 http://localhost/ 时,就等同于调用了 myWeb 函数。

第二句,用fmt在控制台打印一句话,纯属提示。

第三句,开启服务并且监听端口

err := http.ListenAndServe(":8080", nil)

在这句,调用了http包中的ListenAndServe函数,该函数有两个参数,第一个是指定监听的端口号,第二个是指定处理请求的handler,通常这个参数填nil,表示使用默认的ServeMux作为handler。

什么是nil?

nil就是其他语言里的null。

什么是handler?什么是ServeMux?

ServeMux就是一个HTTP请求多路由复用器。它将每个传入请求的URL与已注册模式的列表进行匹配,并调用与URL最匹配的模式的处理程序。

很熟悉吧?还记得前面的http.HandleFunc吗?他就是给http包中默认的ServeMux(DefaultServeMux)添加URL与处理函数匹配。

通常都是使用http包中的默认ServeMux,所以在http.ListenAndServe函数的第二个参数提供nil就可以了

ListenAndServe函数会一直监听,除非强制退出或者出现错误。

如果这句开启监听出现错误,函数会退出监听并会返回一个error类型的对象,因此用err变量接收返回对象。紧接着,判断err是否为空,打印出错误内容,程序结束。


这里有两个Go语言知识点

1.定义变量

Go语言是静态语言,需要定义变量,定义变量用关键字var

 var str string = "my string"
//^ ^ ^
//关键字 变量名 类型

Go还提了一种简单的变量定义方式:=,自动根据赋值的对象定义变量类型,用起来很像脚本语言:

str := "my string"

2.错误处理

if err != nil{
 //处理....
}

在Go语言中,这是很常见的错误处理操作,另一种panic异常,官方建议不要使用或尽量少用,暂不做介绍,先从err开始。

Go语言中规定,如果函数可能出现错误,应该返回一个error对象,这个对象至少包含一个Error()方法错误信息。

因此,在Go中,是看不到try/catch语句的,函数使用error传递错误,用if语句判断错误对象并且处理错误。


3. if 语句

与大多数语言使用方式一样,唯一的区别是,表达式不需要()包起来。

另外,Go语言中的if可以嵌入一个表达式,用;号隔开,例如范例中的代码可以改为:

if err := http.ListenAndServe(":8080", nil); err != nil {
 fmt.Println("服务器开启错误: ", err)
}

err这个变量的生命周期只在if块中有效。

请求处理 myWeb函数

在main函数中,用http.HandleFunc将 myWeb与路由/匹配在一起。

HandleFunc函数定义了两个参数w,r,参数类型分别是http.ResponseWriter和*http.Request,w是响应留写入器,r是请求对象的指针。

响应流写入器 w: 用来写入http响应数据

请求对象 * r: 包含了http请求所有信息,注意,这里使用了指针,在定义参数时用*标记类型,说明这个参数需要的是这个类型的对象的指针

当有请求路径/,请求对象和响应流写入器被传递给myWeb函数,并由myWeb函数负责处理这次请求。

Go语言中红的指针: 在Go语言中 除了map、slice、chan 其他函数传参都是值传递,所以,如果需要达到引用传递的效果,通过传递对象的指针实现。在Go语言中,取对象的指针用&,取值用*,例如:

mystring := "hi"
//取指针
mypointer := &mystring
//取值
mystring2 := *mypointer
fmt.Println(mystring,mypointer,mystring2)

把这些代码放在main函数里,$ go run main.go运行看看

myWeb函数体

fmt.Fprintf(w, "这是一个开始")

再一次遇到老熟人fmt,这次使用他的Fprintf函数将字符串“这是一个开始”,写入到w响应流写入器对象。w响应流写入器里写入的内容最后会被Response输出到用户浏览器的页面上。

总结一下,从编码到运行,你和它都干了些什么:

  1. 定义一个函数myWeb,接收参数 响应流写入器和请求对象两个参数
  2. 在main函数中,在默认的ServeMux中将路由/与myWeb绑定
  3. 运行默认的ServeMux监听本地8080端口
  4. 访问本地8080端口 / 路由
  5. http将请求对象和响应写入器都传递给myWeb处理
  6. myWeb向响应流中写入一句话,结束这次请求。


虽然代码很少很少,但是这就是一个最基本的Go语言Web服务程序了。


Web互动第一步,Go http 获得请求参数

还是先从代码开始

打开main.go文件,修改myWeb函数,如下:

func myWeb(w http.ResponseWriter, r *http.Request) {
 r.ParseForm() //它还将请求主体解析为表单,获得POST Form表单数据,必须先调用这个函数
 for k, v := range r.URL.Query() {
 fmt.Println("key:", k, ", value:", v[0])
 }
 for k, v := range r.PostForm {
 fmt.Println("key:", k, ", value:", v[0])
 }
 fmt.Fprintln(w, "这是一个开始")
}

运行程序

$ go run main.go

然后用任何工具(推荐Postman)提交一个POST请求,并且带上URL参数,或者在命令行中用cURL提交

curl --request POST \
 --url 'http://localhost:8080/?name=zeta' \
 --header 'cache-control: no-cache' \
 --header 'content-type: application/x-www-form-urlencoded' \
 --data description=hello

页面和终端命令行工具会答应出以下内容:

key: name , value: zeta
key: description , value: hello

解读

http请求的所有内容,都保存在http.Request对象中,也就是myWeb获得的参数 r 。

首先,调用r.ParseForm(),作用是填充数据到 r.Form 和 r.PostForm

接下来,分别循环获取遍历打印出 r.URL.Query() 函数返回的值 和 r.PostForm 值里的每一个参数。

r.URL.Query() 和 r.PostForm 分别是URL参数对象和表单参数对象

,它们都是键值对值,键的类型是字符串string,值的类型是string数组。

在http协议中,无论URL和表单,相同名称的参数会组成数组。

循环遍历:for...range

Go语言的循环只有for关键字,以下是Go中4种for循环

//无限循环,阻塞线程,用不停息,慎用!
for{
}
//条件循环,如果a<b,循环,否则,退出循环
for a < b{
}
//表达式循环,设i为0,i小于10时循环,每轮循环后i增加1
for i:=0; i<10; i++{
}
//for...range 遍历objs,objs必须是map、slice、chan类型
for k, v := range objs{
}

前3种,循环你可以看作条件循环的变体(无限循环就是无条件的循环)。

本例种用到的是 for...range 循环,遍历可遍历对象,并且每轮循环都会将键和值分别赋值给变量 k 和 v


我们页面还是只是输出一句“这是一个开始”。我们需要一个可以见人的页面,这样可以不行

你也许也想到了,是不是可以在输出时,硬编码HTML字符串?当然可以,但是Go http包提供了更好的方式,HTML模版。

来源网络,侵权删除

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码