Golang Go语言中有没有人来实现一下这个功能

{
	"server1":{
    	"domain":"https://www.baidu.com",
         "api":{
         	"api1":"/api1"
         }
    },
    "server2":{
    	"domain":"https://www.google.com",
         "api":{
         	"api2":"/api2"
         }
    }
}

有这么一段 json ,想解析之后实现如下要求的功能

  1. 在使用 api1 或 api2 成员变量时,想着能在内部实现拼接上对应的 server1 或 server2 中的domain,如server1.api.api1得到的完整路径是: https://www.baidu.com/api1

  2. 达到 1 的目的就是不允许server1.domain和和server2.api.api2拼接

  3. 不想让调用者进做拼接工作

  4. 不想让调用者传入字符串作为参数

最终的目的就是尽可能的获取到完整的正确的路径,避免随便拼接。

如果不会 golang 的,可以使用其他语言实现,主要是看有没有什么好思路


Golang Go语言中有没有人来实现一下这个功能

更多关于Golang Go语言中有没有人来实现一下这个功能的实战教程也可以访问 https://www.itying.com/category-94-b0.html

15 回复

这个直接问 chatgpt 好了

更多关于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 不?

  1. 问题描述的不够清晰,至少我个人觉得读了几遍不是很理解。
    2. 这个 JSON 用例看起来设计的不够直观。
    3. 基于我的理解,写了一个 demo 不知道是不是你期望的结果: https://goplay.tools/snippet/5BiXw_xKxcw

很厉害,从你的示例中学到了很多东西,JSON 结构是可以改变的

哈哈,犀利的,直接的

感谢大家的回复,我从



各位的建议中获取了思路,最终达到了我想要的。

这是 demo 代码片段: https://goplay.tools/snippet/-1XgF5N8y61
如果有更好的方案,可以再讨论讨论。

当然,我可以帮你构思一个关于在Go语言中实现特定功能的思路,尽管你没有具体说明需要实现哪个功能,但我可以提供一个通用的示例框架,供你参考并根据具体需求进行调整。

在Go语言中实现一个功能通常涉及以下几个步骤:

  1. 明确需求:首先,确定你要实现的具体功能是什么,包括输入、输出和可能的边界条件。

  2. 设计算法:根据需求设计算法,这可以是简单的条件判断、循环处理,也可以是复杂的数据结构操作或算法实现。

  3. 编写代码:在Go语言的源文件(通常以.go为扩展名)中编写代码。确保代码遵循Go的语法和最佳实践,如使用驼峰命名法、保持代码简洁等。

  4. 测试与调试:编写单元测试来验证你的功能是否正确实现。使用Go的测试框架testing可以方便地编写和运行测试。如果发现错误,使用Go的调试工具(如Delve)进行调试。

  5. 优化与文档:在功能正确实现后,考虑性能优化和代码可读性。添加必要的注释和文档,以便其他人(或未来的你)能够理解和维护代码。

例如,如果你要实现一个计算数组中所有元素和的功能,你可以定义一个函数,接收一个整数切片作为参数,并返回它们的和。这个过程中,你可以使用Go的内置函数和循环结构来高效地完成任务。

希望这个框架对你有所帮助!如果你有更具体的需求或问题,请随时提供详细信息。

回到顶部