基于GO编写一个http服务,接收JSON数组[“a“,“b“,“c“],需要返回[false,false,false],在接收[“b“, “c“]返回JSON [true,true]并编写测试用例

Go布尔逻辑设计原理:为什么只有true/false且禁止隐式转换 布尔逻辑是编程中最基础的控制结构,其核心在于确定性与可验证性。在Go语言中,布尔类型被严格限定为仅由bool字面量、比较运算(==、!=、<等)和逻辑运算(&&、||、!)生成,杜绝JavaScript式的'truthy/falsy'隐式转换,也排除Python中任意对象的真值测试。这种设计源于Go‘显式优于隐式’的核心哲学,保障了条件判断的编译期可推理性与运行时零开销。它直接支撑nil安全检查、边界防御、并发状态同步(如atomic.Bool)及错误处理范式(err != nil)。本文深入解析Go布尔系 阅读详情

http server

package main

import (
	"encoding/json"
	"io"
	"log"
	"net/http"
	"sync"
)

var (
	cacheObj             = NewCache()
	readRequestBodyError = "read body error"
	unmarshalBodyError   = "unmarshal body error"
	marshalResultError   = "unmarshal result error"
)

func NewCache() *cache {
	return &cache{Data: make(map[string]struct{})}
}

type cache struct {
	Data map[string]struct{}
	lock sync.RWMutex
}

func (c *cache) exists(key string) bool {
	c.lock.RLock()
	_, ok := c.Data[key]
	c.lock.RUnlock()
	return ok
}

func (c *cache) set(key string) {
	c.lock.Lock()
	c.Data[key] = struct{}{}
	c.lock.Unlock()
}

func echoHandler(writer http.ResponseWriter, request *http.Request) {
	body, err := io.ReadAll(request.Body)
	if err != nil {
		http.Error(writer, readRequestBodyError, http.StatusInternalServerError)
		return
	}

	var array []string
	err = json.Unmarshal(body, &array)
	if err != nil {
		http.Error(writer, unmarshalBodyError, http.StatusInternalServerError)
		return
	}

	result := make([]bool, len(array))
	for index, value := range array {
		if ok := cacheObj.exists(value); !ok {
			cacheObj.set(value)
		} else {
			result[index] = ok
		}
	}

	b, err := json.Marshal(result)
	if err != nil {
		http.Error(writer, marshalResultError, http.StatusInternalServerError)
		return
	}

	writer.Header().Add("Content-Type", "Application/json")
	writer.WriteHeader(http.StatusOK)
	writer.Write(b)
}

func main() {
	http.HandleFunc("/echo", echoHandler)
	err := http.ListenAndServe(":8080", nil)
	if err != nil {
		log.Fatal(err)
	}
}

test case

package main

import (
	"io"
	"net/http"
	"net/http/httptest"
	"strings"
	"testing"
)

func TestEchoServer(t *testing.T) {
	srv := httptest.NewServer(http.HandlerFunc(echoHandler))
	defer srv.Close()

	cases := []struct {
		req string
		exp string
	}{
		{req: `["a", "b", "c"]`, exp: `[false,false,false]`},
		{req: `["a", "b", "c", "d"]`, exp: `[true,true,true,false]`},
		{req: `["m", "d", "a"]`, exp: `[false,true,true]`},
		{req: `["a", "m", "s","l"]`, exp: `[true,true,false,false]`},
	}

	for _, cs := range cases {
		resp, err := http.Post(srv.URL, "application/json", strings.NewReader(cs.req))
		if err != nil {
			t.Fatalf("post error: %v", err)
		}

		if resp.StatusCode != http.StatusOK {
			t.Errorf("reponse code error: %d", resp.StatusCode)
		}

		res, err := io.ReadAll(resp.Body)
		if err != nil {
			t.Errorf("read all error: %v", err)
		}

		str := string(res)
		if str != cs.exp {
			t.Errorf("expected response body %s, but got %s", cs.exp, str)
		}
	}
}

Go语言JSON处理核心指南:从encoding/json原理到TVBox配置实战 JSON作为Web数据交换的通用格式,其序列化与反序列化能力是后端开发的基础能力。Go语言通过标准库encoding/json提供原生支持,依托结构体标签(struct tag)、零值语义和编译期字段映射机制,实现类型安全、错误明确、性能可控的JSON处理。它不依赖反射运行时匹配,而是通过导出字段+json tag建立内存视图与文本格式间的确定性映射,天然适配API契约、配置文件生成与微服务通信等场景。本文结合tvbox配置福利json接口自己做的、听书源链接合集json等真实需求,详解json.Marsh 阅读详情

相关推荐

Go Web应用安全实战:基于golang.org/x/crypto构建用户系统API

在Web应用开发中,数据安全与用户认证是保障系统可信赖的基石。其核心原理在于通过密码学技术,确保数据的机密性、完整性与身份的真实性。现代Web开发中,这直接关系到用户隐私保护与业务合规,是构建高可用服务的技术价值所在。典型的应用场景包括用户注册登录、会话管理、敏感信息存储与API通信防护。本文聚焦于Go语言生态,深入探讨如何利用官方的golang.org/x/crypto扩展包,通过bcrypt密码哈希、Ed25519 JWT签名、ChaCha20-Poly1305加密等工业级组件,系统性地解决这些安全挑战

weixin_33739523的博客 448

Go指针本质:值语义、nil安全与HTTP服务实践

Go中的指针并非C风格的内存地址操控工具,而是一种受类型系统严格约束的值类型——它遵循‘一切皆按值传递’的核心原则,其零值nil明确表示‘未指向有效变量’而非空地址。这种设计使指针天然具备内存安全性与并发友好性,支撑起Web服务中依赖注入、配置热更新、默认路由(如http.ListenAndServeTLS的nil handler)等关键实践。理解指针即理解Go如何将内存管理责任从开发者移交至语言 runtime,尤其在微服务、CLI工具及跨语言(Python/Java)转型场景中,掌握nil检查、接收者选

weixin_33713350的博客 454

现代C++ HTTP客户端与JSON解析实战:从cpr、libcurl到nlohmann/json

HTTP请求与JSON数据交换是现代网络编程和微服务架构中的基础技术。其原理基于客户端-服务器模型,通过HTTP协议传输结构化的JSON数据,实现高效、跨平台的信息交互。在C++后端开发中,高效处理HTTP通信与JSON解析能显著提升服务性能与可维护性。本文聚焦于C++生态下的工程实践,深入探讨如何利用libcurl、cpr和nlohmann/json等主流库,构建稳定、易用的HTTP客户端。通过解析HTTP状态码、处理网络错误、安全访问JSON数据等核心环节,并结合连接复用、异步请求等进阶优化,为开发者提

weixin_33695082的博客 358

golang json omitempty 测试

测试那些会被忽略 package main import ( "encoding/json" "fmt" ) type Struct struct { Map map[string]interface{} `json:"map,omitempty"` MapPtr *map[string]interface{} `json:"map_ptr,omitempty"` Slice []int `json:"slice,omitempty"` SlicePtr []*int

____ 946

Go语言JSON处理:结构体契约、标签控制与生产级避坑指南

JSON序列化是现代Web服务的数据交换基石,其本质是类型系统与文本协议之间的精确映射。在Go中,这一过程高度依赖结构体定义与字段标签(tag),而非运行时动态解析——这意味着类型安全、性能可控,但也要求开发者显式建模数据契约。核心原理在于encoding/json包通过反射+编译期标签实现零拷贝式字段绑定,而omitempty、string后缀、-忽略符等标签参数直接决定序列化行为。技术价值体现在错误可追溯、内存分配可预测、API变更可编译检查;典型应用场景覆盖HTTP API请求/响应、微服务通信、配置

weixin_33785108的博客 379

2023年第二十届五一数学建模竞赛C题:“双碳”目标下低碳建筑研究-思路详解与代码答案

2023年第二十届五一数学建模竞赛C题:“双碳”目标下低碳建筑研究-思路详解与代码答案

lichensun的博客 1万+

Go HTTP 接收 PSOT 提交的 JSON 数据

Go HTTP 接收 PSOT 提交的 JSON 数据

wgchen 709

UART中断接收的实战陷阱:HAL库常见误区与性能调优指南

本文深入解析STM32 HAL库UART中断接收机制,揭示常见实战陷阱如数据溢出、中断优先级配置不当等,并提供性能调优方案。重点介绍如何使用空闲中断处理不定长数据、DMA与中断混合模式优化,以及工业级错误恢复与流量控制策略,帮助开发者构建稳定可靠的串口通信系统。

pea55的博客 747

Go简单处理Json

{ "servers": [ { "serverName": "Shanghai_VPN", "serverIP": "127.0.0.1" }, { "serverName": "Beijing_VPN", "serverIP": "127.0.0.2" } ] } 解析 func Unmarshal(data []b.

巍巍玮玮的博客 448

Linux系统搭建OpenClaw(原Clawdbot)全流程指南 最新版

工具定位:开源个人 AI 助手,支持文件读取、命令执行、多渠道交互(Telegram / 本地终端等);系统要求:主流 Linux 发行版(Ubuntu/Debian/CentOS 等),Node.js ≥22(核心依赖);安全提示:OpenClaw 为测试版,具备高权限操作能力,建议使用非主力机,配置权限白名单,避免接触敏感数据。

AI时代老码农的第二春 6560

达梦--利用存储过程与定时任务实现数据自动迁移

本文详细介绍了在达梦数据库中如何结合存储过程与定时任务实现数据自动迁移。通过一个电商订单归档的实战案例,阐述了从设计表结构、编写具备异常处理和幂等性的存储过程,到配置DBMS_SCHEDULER定时任务的全流程。该方法能有效替代手动脚本,确保数据同步任务的稳定、准确与自动化执行,适用于报表准备、数据备份等多种场景。

weixin_29261711的博客 430

Golang 解析 json字符串 json数组

1. 解析json字符串到结构体 将json字符串解析到结构体,因为这里的 common_policy_config 是json数组,没办法用字段来表示,所以需要用 []interface{} 来存。 package main import ( "encoding/json" "github.com/beego/beego/v2/adapter/logs" ) type Request_common_policy_config struct { Action stri

duapple的博客 1万+

【VisualStdio】手把手教你做一个上位机(1)控件设计布局

网上有很多形形色色的制作上位机教程,有些写的挺好的,但是过于单调。

m0_73409202的博客 5435

Go语言项目后端使用gin框架接收前端发送的三种格式数据(form-data,json,Params)

Go语言项目后端使用gin框架接收前端发送的三种格式数据(form-data,json,Params)的详细实现

pyscl01的博客 4602

基于STM32的智能婴儿床设计(蓝牙通信+摄像头监控)_315

本项目设计并实现了一款基于STM32微控制器的智能婴儿床系统,通过多种传感器和智能控制模块为家长提供更便捷和高效的婴儿照护解决方案。系统包括婴儿哭泣检测、湿度监测、空气质量检测、温度监控等多项功能,并通过蓝牙与手机APP进行数据传输和远程控制。婴儿床内置摇摇床和安抚音乐播放功能,能够在婴儿哭泣时自动启动摇摇床并播放安抚音乐。此外,系统还支持摄像头远程监控,让家长实时查看婴儿的状态。整个系统采用STM32F103RCT6作为核心控制单元,结合声音传感器、湿度传感器、MQ135空气质量传感器。

864

在Qt中集成VTK和PCL:实现数据可视化的完整指南

在现代软件开发中,数据可视化至关重要。将VTK(Visualization Toolkit)和PCL(Point Cloud Library)集成到Qt环境里,能为开发者提供强大的可视化解决方案。本文将深入讲解如何在Qt中读取PCL文件,展示VTK模型和PCL数据,适合想要在Qt项目中实现数据可视化的开发者。

轩宇的博客 916

Go-VCR实战:HTTP交互录制回放,打造稳定高效的Go测试

在软件开发和测试中,HTTP客户端测试是确保应用与外部服务正确交互的关键环节。其核心原理在于模拟网络请求与响应,以验证业务逻辑的健壮性。通过录制与回放技术,开发者可以将真实的HTTP交互序列化保存,并在后续测试中复用,这带来了显著的技术价值:它消除了测试对网络环境和第三方服务稳定性的依赖,极大提升了测试的确定性和执行速度。这一技术尤其适用于微服务集成测试、第三方API客户端开发以及需要离线工作的场景。本文以Go生态中的`go-vcr`库为例,深入探讨如何利用其拦截器架构和多种工作模式(如录制、回放),来解决

dianchamian8747的博客 325

Windows Server 2016远程桌面服务配置和授权激活

Server 2016默认远程桌面连接数是2个用户,如果多余两个用户进行远程桌面连接时,系统就会提示超过连接数,可以通过添加远程桌面授权解决:1、添加远程桌面授权服务第一步:服务器管理 - 添加角色和功能打开添加角色和功能向导窗口,选择基于角色或给予功能安装:第二步:添加远程桌面会话主机和远程桌面授权功能:以上配置完成后即可使用多于2用户同时登陆,但使用期限为120天,再次登陆会有如下提示:2、添...

mahailiang的专栏 6万+

Golang OSINT工具开发实战:从PhoneInfoga看高并发架构与框架选型

开源情报(OSINT)技术是从公开来源搜集和分析信息的关键方法,广泛应用于安全评估、风控和调研领域。其核心原理在于通过自动化工具聚合多源公开数据,进行交叉验证,以提升信息获取的效率和可靠性。在技术实现上,高并发处理和易部署性是关键价值。Golang语言凭借其卓越的并发模型(Goroutine)和编译为单一可执行文件的特性,成为构建此类高性能命令行工具和网络服务的理想选择。结合插件化架构设计,开发者可以快速构建像PhoneInfoga这样可扩展的OSINT框架。在实际应用场景中,这类技术不仅用于电话号码等信息

weixin_34038293的博客 340

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

记录一次goravel(golang全系都有这个问题)底层返回超时,但controller依然执行踩坑

本文探讨了Golang框架中请求超时但数据库操作仍会执行的问题。作者通过实际案例发现,当请求超时返回后,数据库事务仍会继续执行而不会回滚。经过与社区讨论,了解到这是由于Golang协程无法被外部强制终止的特性导致的。文章提出了解决方案:通过Context传递超时信号,在每个数据库操作和文件上传操作中检测Context状态,发现超时则立即终止执行并回滚事务。作者分享了具体实现代码,采用协程和通道机制来监控超时情况。此外还介绍了两种替代方案:异步任务队列和简单调大超时时间。最后反思了开发者对Context机制认

qq_38883889的博客 464

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Go语言结构体详解:从定义、内存对齐到JSON序列化实战

在编程中,数据结构是组织和存储数据的基础,它决定了数据的逻辑关系和操作效率。结构体作为一种复合数据类型,其核心原理在于将不同类型的数据成员组合成一个逻辑整体,实现数据的封装与结构化。这一特性在工程实践中价值显著,它不仅能提升代码的可读性和可维护性,更是构建复杂业务模型、定义API契约和进行数据序列化的基石。通过内存对齐优化,结构体还能有效提升程序性能。在Go语言开发、Web后端构建及系统编程等应用场景中,结构体都是不可或缺的工具。本文聚焦于Go语言的结构体,深入探讨其定义、初始化、内存布局、与JSON的互转

weixin_34095889的博客 359

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

httplib + Protobuf实践:打造高性能二进制协议通讯录HTTP服务+从零构建到PB与JSON性能对比及总结

本文介绍了基于httplib和Protobuf的轻量级通讯录HTTP服务实现,通过Protobuf序列化实现客户端与服务端的数据交互,展示了客户端和服务端的实现流程,并进行了PB与JSON的性能对比测试,结果显示Protobuf在序列化和反序列化性能上优于JSON。

羑悻的博客. 2万+

Go语言HTTP Mocking神器gock:单元测试中模拟外部API调用的完整指南

在微服务架构和分布式系统开发中,单元测试经常面临对外部HTTP服务依赖的挑战。HTTP Mocking(模拟)技术通过拦截网络请求并返回预设响应,解决了测试速度慢、结果不稳定和产生费用等问题。其核心原理是在测试环境中用虚拟服务器替代真实远程服务,实现请求的匹配与响应的伪造。这项技术对于构建可靠、高效且独立的测试套件具有重要价值,广泛应用于API客户端测试、第三方服务集成验证以及微服务间的契约测试等场景。本文将深入解析Go语言中广受欢迎的HTTP Mocking库gock,它以其声明式API和链式调用设计,显

defkaug153461的博客 468

SyncYomi Web 管理面板使用手册:API Key、设备监控与历史数据一键回滚

SyncYomi 是一款自托管的漫画阅读进度同步服务器,可为 TachiyomiSY 等客户端在多设备间同步漫画库、阅读进度和分类。它的 Web 管理面板是你运维 SyncYomi 的总控制台:在这里生成 API Key、查看每台设备最近一次同步的状态,还能把出错的同步数据一键回滚到历史版本。本手册带你从零开始,用最少的步骤把这三件事做熟。 [![SyncYomi Web 管理面板项目 Logo

gitblog_01194的博客 786

Go Web开发效率革命:OTEMPLATE与Onion HTTP框架深度集成实战

在Go语言Web开发中,模板引擎是构建动态页面的核心技术,其核心原理是将后端数据与HTML结构动态结合,生成最终的响应内容。传统的html/template虽然安全可靠,但在实际工程中常面临开发流程割裂、代码冗余等痛点。OTEMPLATE通过深度集成Onion HTTP框架,实现了约定优于配置的自动化模板管理,其技术价值在于将模板发现、热加载、路由映射等繁琐步骤自动化,显著提升了开发效率。这一方案尤其适用于需要快速迭代的后台管理系统、内容展示型网站等应用场景,通过消除模板与后端逻辑间的摩擦,让开发者能更专注

weixin_34332905的博客 361

Zabbix 监控 MikroTik 无线网络:基于 SNMP/LLD 的 Wireless AP、Station 与 Registration Table 模板全解析

本文围绕 Zabbix 官方社区模板仓库(community-templates)中的 **MikroTik - Basico Wireless** 系列模板展开,系统讲解如何通过 SNMP 与 LLD(Low-Level Discovery,低级别自动发现)对 MikroTik 路由器的无线接口进行全维度监控。该模板由 `MikroTik - Basico Wireless AP`、`Mikro

gitblog_00543的博客 293
上一篇: golang gzip 包基础使用
下一篇: golang 拉取 bitbucket.org 私有库
backender
博客等级 码龄12年 4粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值