Golang Go语言中有没有人来实现一下这个功能
{
"server1":{
"domain":"https://www.baidu.com",
"api":{
"api1":"/api1"
}
},
"server2":{
"domain":"https://www.google.com",
"api":{
"api2":"/api2"
}
}
}
有这么一段 json ,想解析之后实现如下要求的功能
-
在使用 api1 或 api2 成员变量时,想着能在内部实现拼接上对应的 server1 或 server2 中的
domain
,如server1.api.api1
得到的完整路径是: https://www.baidu.com/api1 -
达到 1 的目的就是不允许
server1.domain
和和server2.api.api2
拼接 -
不想让调用者进做拼接工作
-
不想让调用者传入字符串作为参数
最终的目的就是尽可能的获取到完整的正确的路径,避免随便拼接。
如果不会 golang 的,可以使用其他语言实现,主要是看有没有什么好思路
Golang Go语言中有没有人来实现一下这个功能
更多关于Golang Go语言中有没有人来实现一下这个功能的实战教程也可以访问 https://www.itying.com/category-94-b0.html
gpt 回答,看是否有用
-----------
可以使用 Go 内置的 encoding/json 包将 JSON 解析成一个结构体。以下是一个 Go 示例代码:
package main
import (
“encoding/json”
“fmt”
)
// JSON 对应的结构体
type Config struct {
Server1 struct {
Domain string json:"domain"
Api struct {
Api1 string json:"api1"
} json:"api"
} json:"server1"
Server2 struct {
Domain string json:"domain"
Api struct {
Api2 string json:"api2"
} json:"api"
} json:"server2"
}
// Api 类型封装了 server 的信息和 API 的路径
type Api struct {
baseURL string
path string
}
// NewApi 方法创建一个 Api 对象
func NewApi(config *Config, serverName string, apiName string) *Api {
api := &Api{}
switch serverName {
case “server1”:
api.baseURL = config.Server1.Domain
switch apiName {
case “api1”:
api.path = config.Server1.Api.Api1
default:
panic(fmt.Sprintf(“unsupported API: %s”, apiName))
}
case “server2”:
api.baseURL = config.Server2.Domain
switch apiName {
case “api2”:
api.path = config.Server2.Api.Api2
default:
panic(fmt.Sprintf(“unsupported API: %s”, apiName))
}
default:
panic(fmt.Sprintf(“unsupported server: %s”, serverName))
}
return api
}
// URL 方法返回拼接过的完整 URL
func (api *Api) URL() string {
return api.baseURL + api.path
}
func main() {
// 假设这是从 HTTP 响应体中获取的 JSON 数据
jsonStr := <br>{<br> "server1": {<br> "domain": "<a target="_blank" href="https://www.baidu.com" rel="nofollow noopener">https://www.baidu.com</a>",<br> "api": {<br> "api1": "/api1"<br> }<br> },<br> "server2": {<br> "domain": "<a target="_blank" href="https://www.google.com" rel="nofollow noopener">https://www.google.com</a>",<br> "api": {<br> "api2": "/api2"<br> }<br> }<br>}<br>
// 将 JSON 解析成结构体
var config Config
err := json.Unmarshal([]byte(jsonStr), &config)
if err != nil {
panic(err)
}
// 创建 API 对象并输出 URL
api1 := NewApi(&config, “server1”, “api1”)
fmt.Println(api1.URL()) // 输出 https://www.baidu.com/api1
api2 := NewApi(&config, “server2”, “api2”)
fmt.Println(api2.URL()) // 输出 https://www.google.com/api2
}
-----------
当然是问过 gpt 了,这个实现之后,调用的时候需要传入字符串当作参数了。容易传错的可能
好吧
第一步用 map[string]interface{} 解析这个 json , 然后遍历一遍所有的 $.server{x}.api.api{x} 把这些值都修改一次,加上 domain ,然后再给外部调用
思路无非是重构一个 kv 结构:“api”=>“domain”
其实思路是以 api 为主对象进行封装
domain 是 api 对象的一个成员属性
不给伪代码了 自己思考一下吧。。。
怎么着,这年头伸手党都这么犀利了吗?又不是什么复杂的难题,要是说“请教下怎么实现”那都绝对不算是伸手党。可这连标题都是下需求,OP 头像脸都不要了也就算了,咋请教个问题也脸都不要了呢。。
是因为经济不景气、所以楼上各位就这么卷着来伺候伸手党吗?建议不要吧
早上起床气还没有散,加上是 go 的,希望 gopher 至少能动动脑子,所以对不住了各位,请收了神通吧!
正在奇怪,刷新一下看到你发的,那我就不发了😅
两个问题:
一、“server1"和"server2"这样的键名是怎么获取的?你不想传入字符串的意思是,这俩是 hardcode 进去而不是变量?
二、你这 json 能改吗?
{
“server1”:{
“domain”:“https://www.baidu.com”,
“api”:{
“api1”:”/api1"
}
},
“server2”:{
“domain”:“https://www.google.com”,
“api”:{
“api2”:"/api2"
}
}
=>
{
[
{
“servername”:“server1”,
“domain”:“https://www.baidu.com”,
“api”:{
“api1”:"/api1"
}
},
{
“servername”:“server2”,
“domain”:“https://www.google.com”,
“api”:{
“api2”:"/api2"
}
}
]
}
弄成这样的 ok 不?
- 问题描述的不够清晰,至少我个人觉得读了几遍不是很理解。
2. 这个 JSON 用例看起来设计的不够直观。
3. 基于我的理解,写了一个 demo 不知道是不是你期望的结果: https://goplay.tools/snippet/5BiXw_xKxcw
很厉害,从你的示例中学到了很多东西,JSON 结构是可以改变的
哈哈,犀利的,直接的
感谢大家的回复,我从
各位的建议中获取了思路,最终达到了我想要的。
这是 demo 代码片段: https://goplay.tools/snippet/-1XgF5N8y61
如果有更好的方案,可以再讨论讨论。
当然,我可以帮你构思一个关于在Go语言中实现特定功能的思路,尽管你没有具体说明需要实现哪个功能,但我可以提供一个通用的示例框架,供你参考并根据具体需求进行调整。
在Go语言中实现一个功能通常涉及以下几个步骤:
-
明确需求:首先,确定你要实现的具体功能是什么,包括输入、输出和可能的边界条件。
-
设计算法:根据需求设计算法,这可以是简单的条件判断、循环处理,也可以是复杂的数据结构操作或算法实现。
-
编写代码:在Go语言的源文件(通常以
.go
为扩展名)中编写代码。确保代码遵循Go的语法和最佳实践,如使用驼峰命名法、保持代码简洁等。 -
测试与调试:编写单元测试来验证你的功能是否正确实现。使用Go的测试框架
testing
可以方便地编写和运行测试。如果发现错误,使用Go的调试工具(如Delve)进行调试。 -
优化与文档:在功能正确实现后,考虑性能优化和代码可读性。添加必要的注释和文档,以便其他人(或未来的你)能够理解和维护代码。
例如,如果你要实现一个计算数组中所有元素和的功能,你可以定义一个函数,接收一个整数切片作为参数,并返回它们的和。这个过程中,你可以使用Go的内置函数和循环结构来高效地完成任务。
希望这个框架对你有所帮助!如果你有更具体的需求或问题,请随时提供详细信息。