Go 开发实践:手把手教你搭建一个登录功能

news2025/1/9 2:32:22

本文首发自「慕课网」 ,想了解更多IT干货内容,程序员圈内热闻,欢迎关注"慕课网"及“慕课网公众号”!

作者:Codey|慕课网讲师


用 Go 语言搭建简易登录功能

如果你最近刚学习Go 语言基础特性,对 Go 语言也有了一定掌握和理解。那么接下来小慕就带你学习如何使用 Go 语言如何搭建一个提供登陆功能的 web 服务。

1. 搭建服务

在 Go 语言中想要搭建一个 http 服务是非常容易的一件事情,一行代码就可以了。

代码示例:

package main

import (
    "net/http"
)

func main() {
    http.ListenAndServe("127.0.0.1:9300", nil) //设置监听的端口
}

运行以上代码可以得到一个服务,在浏览器上输入​​http://127.0.0.1:9300/​​,由于没有编写任何路由,所以只会出现 404 的提示:

2. 编写路由

服务已经可以运行了,接下来就是要编写能被外部访问的路由接口,http 请求分为两种,POST 请求和 GET 请求。我们首先想实现的是一个网站登录页面打开的路由 ​​/index​​,需要编写一个能响应 GET 请求的路由。

代码示例:

package main

import (
    "net/http"
)

func main() {
    //设置访问的路由
    http.HandleFunc("/index", func(w http.ResponseWriter, r *http.Request) {
        if r.Method == "GET" {
            w.Write([]byte("<h1>Hello Codey!<h1>"))
        }
    })
    http.ListenAndServe("127.0.0.1:9300", nil) //设置监听的端口
}

在浏览器中输入​​127.0.0.1:9300/index​​:

此处可以结合函数式编程的思想,将 index 的处理函数拿出来作为一个变量,代码修改后如下所示

package main

import (
    "net/http"
)

func main() {
    http.HandleFunc("/index", index)           //设置访问的路由
    http.ListenAndServe("127.0.0.1:9300", nil) //设置监听的端口
}

func index(w http.ResponseWriter, r *http.Request) {
    if r.Method == "GET" {
        w.Write([]byte("<h1>Hello Codey!<h1>"))
    }
}

然后修改一下输出字符串,使其输出一个页面,代码修改后如下

package main

import (
    "net/http"
)

func main() {
    http.HandleFunc("/index", index)           //设置访问的路由
    http.ListenAndServe("127.0.0.1:9300", nil) //设置监听的端口
}

func index(w http.ResponseWriter, r *http.Request) {
    if r.Method == "GET" {
        w.Write([]byte(`<!DOCTYPE html>
        <html>
        <head>
            <meta charset="utf-8">
            <title>Go语言实战1</title>
        </head>
        <body>
            <div>
                <h3>登录</h3>
                <form>
                    <div>
                        <div>
                            <input type="text"  id="username" name="username" placeholder="请输入账号">
                        </div>
                    </div>
                    <div>
                        <div>
                            <input type="password" class="form-control" id="password" name="password" placeholder="请输入密码">
                        </div>
                    </div>
                    <div >
                        <div >
                            <button id="loginbtn" type="button" >登录</button>
                        </div>
                    </div>
                </form>
            </div>
        </body>
        </html>`))
    }
}

运行上述代码,然后再次在浏览器中输入​​127.0.0.1:9300/index​​。

3. 配置页面到 html

一般写 web 应用,会涉及到很多 html 文件,我们不可能将其全部都放在 Go 文件的字符串里,不方便调试的同时也影响代码维护。所以我们一般会直接加载 html 文件

代码示例:

package main

import (
    "net/http"
    "text/template"
)

func main() {
    http.HandleFunc("/index", index)           //设置访问的路由
    http.ListenAndServe("127.0.0.1:9300", nil) //设置监听的端口
}

func index(w http.ResponseWriter, r *http.Request) {
    if r.Method == "GET" {
        t, _ := template.ParseFiles("view/index.html")//加载html文件
        t.Execute(w, nil)//将文件输出到浏览器
    }
}

目录结构如下

index.html 的代码如下:

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>Go语言实战1</title>
</head>
<body>
    <div>
        <h3>登录</h3>
        <form>
            <div>
                <div>
                    <input type="text"  id="username" name="username" placeholder="请输入账号">
                </div>
            </div>
            <div>
                <div>
                    <input type="password" id="password" name="password" placeholder="请输入密码">
                </div>
            </div>
            <div >
                <div >
                    <button id="loginbtn" type="button" >登录</button>
                </div>
            </div>
        </form>
    </div>
</body>
</html>

执行上述 Go 语言代码,在浏览器中输入​​127.0.0.1:9300/index​​。

4. 数据传输

在 html 页面点击登录暂时没有任何反应,为了提交页面到服务端,我们需要在服务端再编写一个接收数据的路由,这个路由需要能够接收 POST 请求。然后再这个路由中需要能验证账号密码是否正确,若是则跳转到主页,若不是则给出提示后跳转到登录页。

代码示例

package main

import (
    "net/http"
    "text/template"
)

func main() {
    http.HandleFunc("/index", index) //设置访问的路由

    http.HandleFunc("/check", check)
    http.ListenAndServe("127.0.0.1:9300", nil) //设置监听的端口
}

func check(w http.ResponseWriter, r *http.Request) {
    if r.Method == "POST" {
        accountID := r.FormValue("username")//获取账号
        password := r.FormValue("password")//获取密码
        if accountID == "Codey" && password == "12345" {
            //跳转到主页
            t, _ := template.ParseFiles("view/home.html")
            t.Execute(w, nil)
        } else {
            //跳转到登录
            w.Write([]byte("<script>alert('账号或者密码不正确')</script>"))
            t, _ := template.ParseFiles("view/index.html")
            t.Execute(w, nil)
        }

    }
}

func index(w http.ResponseWriter, r *http.Request) {
    if r.Method == "GET" {
        t, _ := template.ParseFiles("view/index.html")
        t.Execute(w, nil)
    }
}

home.html 的代码如下:

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>Go语言实战1</title>
</head>
<body>
    <div>
        <h3>主页</h3>
       这里是主页
    </div>
</body>
</html>

执行上述 Go 语言代码,在浏览器中输入​​127.0.0.1:9300/index​​。

输入正确的账号:Codey,密码:12345

然后点击登录,会跳转到主页

若输入错误的账号密码,则不跳转

随后跳转回登录页面

一个简易的登录功能就搭建完成了。

你学废(hui)了吗!


欢迎关注「慕课网」官方帐号,我们会一直坚持提供IT圈优质内容,分享干货知识,大家一起共同成长吧!

本文原创发布于慕课网 ,转载请注明出处,谢谢合作

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/563227.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《深入理解BigDecimal:揭秘钱财计算的核心技术》

文章目录 《深入理解BigDecimal:揭秘钱财计算的核心技术》***\*一、BigDecimal概述\*******\*二、BigDecimal常用构造函数\****2.1、常用构造函数2.2、使用问题分析***\*三、BigDecimal常用方法详解\****3.1、常用方法3.2、BigDecimal大小比较***\*四、BigDecimal格式化\*****…

【正点原子STM32连载】 第二十章 基本定时器实验 摘自【正点原子】STM32F103 战舰开发指南V1.2

1&#xff09;实验平台&#xff1a;正点原子stm32f103战舰开发板V4 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第二十…

字符串匹配算法--KMP算法--BM算法

该算法解决的是字符串匹配问题&#xff0c;即查看字符串中是否含有完整的匹配字符串。如在java的string的contains方法匹配问题最简单的就是暴力破解了。在java的contains也是这么实现的&#xff0c;效率是低一点的。如果想要更快的速度可以自己写KMP算法。 代码实现体验 还未…

chatgpt赋能Python-python_numpy怎么用

Python与Numpy&#xff1a;简介 Python是一种高级编程语言&#xff0c;它具有简洁的语法和广泛的应用领域。Numpy是一个为Python提供高效数学库的开源库&#xff0c;它允许进行高速数值计算和数据处理。 对于那些正在开始使用Python和Numpy的初学者&#xff0c;这篇文章将向您…

CANoe使用教程

目录 1.CAN IG使用 2.Visual Sequence 自动发送报文序列&#xff0c;可以设置多个visual sequence&#xff0c;可用于重复的网络模拟和write窗口输出&#xff0c;比IG灵活&#xff0c;比CAPL简单 3.CANoe中的系统变量和环境变量都是一种用于存储和传递数据的变量&#xff0c;…

linux部署yolov5

Linux配置 LibTorch 和 OpenCV LibTorch 下载地址&#xff1a;https://pytorch.org/get-started/locally/ 直接解压即可 OpenCV 下载地址&#xff1a;https://opencv.org/releases/ 需要配置ffmpeg环境 export LD_LIBRARY_PATH$LD_LIBRARY_PATH:/home/workspace/dengzr/li…

嵌入式Linux应用开发笔记:GPIO编程

文章目录 目的基础说明代码示例数字输出数字输入外部中断 总结 目的 GPIO嵌入式设备中最基础的外设&#xff0c;使用上也是非常频繁的。这篇文章将记录下应用程序中GPIO操作相关内容。 这篇文章中内容均在下面的开发板上进行测试&#xff1a; 《新唐NUC980使用记录&#xff1…

15、STM32驱动sht35温湿度传感器

本文使用模拟IIC驱动sht35温湿度传感器 踩坑点&#xff1a;购买的模块IIC上拉电阻为10KΩ&#xff0c;会导致IIC不稳定&#xff0c;抗干扰差&#xff0c;容易导致时序错误&#xff1b;建议更换为4.7KΩ 一、CubeMx配置 其余默认&#xff0c;生成工程 1、us精确延时 Delay_Dr…

2023年电子、通信与控制工程国际会议(SECCE 2023)

会议简介 Brief Introduction 2023年电子、通信与控制工程国际会议(SECCE 2023) 会议时间&#xff1a;2023年8月11日-13日 召开地点&#xff1a;韩国济州岛 大会官网&#xff1a;www.isecce.org 2023年电子、通信与控制工程国际会议(SECCE 2023)将围绕“电子、通信与控制工程”…

Spring Boot 整合流程引擎 Flowable(附源码地址)

一、导入依赖 flowable依赖&#xff1a; <dependency><groupId>org.flowable</groupId><artifactId>flowable-spring-boot-starter</artifactId><version>6.7.2</version> </dependency>pom.xml: <?xml version"1…

驱动页面性能优化的3个有效策略

目录 引言 背景 前端性能优化 测试视角的解法 性能问题的发现 性能数据的采集 性能指标的确定 性能问题的分析 如何衡量性能问题严重性 分析性能瓶颈-分析思路 分析结论关键思路 引言 测试通过发现、分析、验证三板斧&#xff0c;驱动推进页面性能优化快速有效&…

关注 | 蛙色元宇宙,正式成为XRMA联盟成员单位

中国虚拟现实与元宇宙产业峰会&#xff0c;2023年3月22日于杭州圆满结束&#xff0c;在杭州市人民政府、浙江省经济和信息化厅指导&#xff0c;由杭州市经济和信息化局、杭州市西湖区人民政府主办&#xff0c;中国信息通信研究院承办。 蛙色元宇宙作为元宇宙的领先企业之一&…

【AI面试】CrossEntropy Loss 、Balanced Cross Entropy、 Dice Loss 和 Focal Loss 横评对比

样本不均衡问题一直是深度学习领域一个不可忽略的问题&#xff0c;常说的长尾效应&#xff0c;说的就是这个问题。一类占据了主导地位&#xff0c;导致其他类无论怎么优化&#xff0c;都不能好转。 无论是纯纯的分类任务&#xff0c;还是稍微复杂一些的目标检测任务和分割任务…

关于java在成员/全局变量上不同类型赋值遇到的问题(值传递)

一个疑惑 文件简介回答参考文献 文件简介 class ss{static class Student{int id;String name; /*public Student(int id, String name) {this.id id;this.name name;}*/public int getId() {return id;}public void setId(int id) {this.id id;}public String getName() {…

数字人入门文章速览

语音驱动三维人脸方法 OPPO 数字人语音驱动面部技术实践 【万字长文】虚拟人漫谈 Blendshape学习笔记 人脸重建速览&#xff0c;从3DMM到表情驱动动画 功能强大的python包&#xff08;四&#xff09;&#xff1a;OpenCV 从Blendshapes到Animoji 3D人脸重建算法汇总 一、3D人脸重…

windows 10 安装k8s环境 Kubernetes

主要命令有 1. iwr https://chocolatey.org/install.ps1 -UseBasicParsing | iex 2. choco install minikube 3. minikube start 4. minikube dashboard 使用管理员运行 PowerShell 执行下面这条命令 iwr https://chocolatey.org/install.ps1 -UseBasicParsing | iex choc…

开源赋能 普惠未来|铜锁/Tongsuo诚邀您参与2023开放原子全球开源峰会

铜锁/Tongsuo是一个提供现代密码学算法和安全通信协议的开源基础密码库&#xff0c;为存储、网络、密钥管理、隐私计算、区块链等诸多业务场景提供底层的密码学基础能力&#xff0c;实现数据在传输、使用、存储等过程中的私密性、完整性和可认证性&#xff0c;为数据生命周期中…

Linux:web基础与HTTP协议

Linux&#xff1a;web基础与HTTP协议 一、域名概述1.1 域名的概念1.2 域名空间结构1.3 域名注册 二、网页的概念2.1 网页2.2 网站2.3 主页2.4 网页2 三、HTML概述3.1 HTML概述3.2 HTML文档结构3.3 HTML 基本标签 四、web概述4.1 web概述4.2 Web1.0 vs Web2.04.3 静态网页4.3.1 …

【挑战自己】软件测试的7个级别,做到3级已经超越80%测试人

有人说&#xff1a;软件测试就是最low的点点点工作。 有人说&#xff1a;测试工作职位薪水到一定程度只能原地踏步无法提升 也有人说&#xff1a;测试行业相对于开发来说技术性很低&#xff0c;容易被取代。 这其实是对测试行业最大的误解。测试可深可浅&#xff0c;可窄可广…

QDir拼接路径解决各种斜杠问题

一般在项目中经常需要组合路径,与其他程序进行相互调用传递消息通信。 经常可能因为多加斜杠、少加斜杠等问题导致很多问题。 为了解决这些问题,我们可以使用QDir来完成路径的拼接,不直接拼接字符串。 QDir的静态方法QDir::cleanPath() 是为了规范化路径名的,在使用QDir组…