go2school-2
时间:2022-07-26
本文章向大家介绍go2school-2,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
go2school 系列的第二道题目
- 用 Go 语言实现一个简单的 HTTP Server。
题目
简要描述:实现 GET(get), POST(set) 两个功能
// 读取Redis的"path:path2"
@GET /path/path2
// 将 value(=3) 写入 redis 的 "path:path2"
@POST /path/path2
{
"value": 3
}
现有可用的redis数据库(已脱敏):
{
"Addr":"t.kezaihui.com:6580",
"Password":"06ad0c72d5ce41ce9f04ad1237965a4d"
}
交作业
- 使用go语言原生的http库作为route处理url:暂时不适用框架
- 使用go-redis作为redis client:使用人数多,速度快推荐
package main
import (
"encoding/json"
"fmt"
"github.com/go-redis/redis"
"net/http"
"os"
"regexp"
)
type payloadStruct struct {
Value string
}
var reg = regexp.MustCompile(`^/([(w)]+)/([(w)]+)/?$`)
var redisClient = redis.NewClient(&redis.Options{
Addr: "t.kezaihui.com:6580",
Password: "06ad0c72d5ce41ce9f04ad1237965a4d",
})
func main() {
http.HandleFunc("/", Route)
err := http.ListenAndServe(":8080", nil)
if err == nil {
os.Exit(4)
}
}
// web route
func Route(w http.ResponseWriter, r *http.Request) {
path := r.URL.Path
params := reg.FindStringSubmatch(path)
key := params[1] + ":" + params[2]
if r.Method == "GET" {
val := getValueFromRedis(key)
fmt.Fprintf(w, val)
} else if r.Method == "POST" {
decoder := json.NewDecoder(r.Body)
var payload payloadStruct
err := decoder.Decode(&payload)
if err != nil {
panic(err)
}
setValueToRedis(key, payload.Value)
fmt.Fprintf(w, "ok")
} else {
fmt.Fprintf(w, "NOT IMPLEMENT")
}
}
func setValueToRedis(key string, value string) {
fmt.Println(redisClient, key, value)
redisClient.Set(key, value, 0).Err()
}
func getValueFromRedis(key string) (val string) {
fmt.Println(redisClient, key)
val, err := redisClient.Get(key).Result()
if err != nil {
panic(err)
}
fmt.Println("key", val)
return val
}
本次的 http server 也可以使用 web 框架,比如 iris 和 mux。(iris知名度高)
存在的问题
整体写下来还有两个问题不是很清楚
- Gopath
- 包依赖管理
因为需要依赖go-redis这个第三方包,因此需要使用go get
这个命令下载第三方包,但是下载下来之后GoLand这个IDE会显示包不存在,但是实际运行并不会有问题,有代码洁癖的人实在无法忍受。本质原因还是Gopath没有设置正确。因为go的workspace和python还有c++实在是不同。因此习惯go的workspace,理解Gopath就至关重要了。但是好消息是go的2.0版本会使用类似于npm和pipenv的方式解决包管理的问题,期待…
- Mysql之binlog日志说明及利用binlog日志恢复数据操作记录
- 常用的AJAX弹出层代码
- Linux下检测IP地址冲突及解决方法
- linux如何挂载windows下的共享文件
- silverlight2中的定时器,以及如何动态改变控件的坐标
- 定时备份windows机器上的文件到linux服务器上的操作梳理(rsync)
- jQuery1.3以上版本"@"的问题
- 龚宏绩:三七互娱游戏上云的现状与未来
- Android 程序打包及签名
- 韩伟:解谜腾讯游戏海量服务架构
- Message和handler传递对象
- MVC RC2中关于HtmlHelper给DropDownList设置初始选中值的问题
- 结构struct(值类型)在实际应用要注意的二点:
- 王璋:腾讯云为游戏行业提供解决方案
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- kali2020 忘记密码
- 低比特量化之DoreFa-Net理论与实践
- 不用数组求多个数的最小值
- 小程序 Tip | 文档、环境、开发工具界面与特性
- 大佬的思路就是不一样,这是我见过最简洁又清晰的SSM框架整合
- SQL Server重置自增的值为0
- 被经理邀请去“爬山”,只是因为我写错了一条SQL语句?
- Maven环境配置-必会
- Centos7中Docker安装RabbitMQ
- 又陷入知识盲区了,面试被问Redis事务,我差点脸都“绿”了
- Mybatis中#{}与${}的区别
- POI合并单元格
- Centos7.x安装Docker
- 实在是妙啊!Java中强软虚弱引用,居然还能这样去操作
- 数据库连接池引起的FullGC问题,看我如何一步步排查、分析、解决