gpt4 book ai didi

go - 如何制作接受字符串参数的函数,并根据它返回不同的结构类型?

转载 作者:IT王子 更新时间:2023-10-29 02:31:03 26 4
gpt4 key购买 nike

我想创建一个接受字符串参数的函数,并根据字符串返回不同的类型

在我当前的项目中,我使用 Go 版本 1.11.4 作为 Rest API,使用 PostgreSQL 11 来存储数据。该函数是为了避免代码冗余,我只需要一个函数来处理请求,没有这个函数我会写更多的请求处理程序。

功能是:

func GetArrayOfModelStructs(table_name string) interface{} {
if table_name == "prefs_n_cities" {
Prefs_n_cities_array := &models.Prefs_n_cities_array{}
return Prefs_n_cities_array
} else if table_name == "position_owner" {
Position_owners := &models.Position_owners{}
return Position_owners
} else if table_name == "region" {
Regions := &models.Regions{}
return Regions
} else if table_name == "district" {
Districts := &models.Districts{}
return Districts
} else if table_name == "locality" {
Localities := &models.Localities{}
return Localities
} else if table_name == "locality_type" {
Locality_types := &models.Locality_types{}
return Locality_types
} else if table_name == "population" {
Populations := &models.Populations{}
return Populations
}
return nil
}
func GetModelStructs(table_name string) interface{} {
if table_name == "prefs_n_cities" {
return models.Prefs_n_cities{}
} else if table_name == "position_owner" {
return models.Position_owner{}
} else if table_name == "region" {
return models.Regions{}
} else if table_name == "district" {
return models.District{}
} else if table_name == "locality" {
return models.Locality{}
} else if table_name == "locality_type" {
return models.Locality_type{}
} else if table_name == "population" {
return models.Population{}
}
return nil
}

我的结构示例如下:

type Prefs_n_cities struct {
id int32
Name string
Description string
Region_id int32
}

type Prefs_n_cities_array struct {
Array []Prefs_n_cities
}

我试图在另一个包中使用所有这些来处理请求:

var GetData = func(res http.ResponseWriter, req *http.Request) {
// u.Logging(req, false)
db_name := req.URL.Query().Get("table_name")

data := u.GetArrayOfModelStructs(db_name)

spew.Dump(data)

sqlString := `SELECT * FROM "new_rollout_managment".` + db_name

rows, err := database.DB.Query(sqlString)
if err != nil {
http.Error(res, err.Error(), 400)
return
}
defer rows.Close()

for rows.Next() {
model := u.GetModelStructs(db_name)
err = rows.Scan(&model)
if err != nil {
http.Error(res, err.Error(), 400)
return
}
data.Array = append(data.Array, model)
}
err = rows.Err()
if err != nil {
http.Error(res, err.Error(), 400)
return
}

out, err := json.Marshal(models)
if err != nil {
http.Error(res, err.Error(), 500)
return
}

resp := u.Message(true, "Array of dictionaries")
resp["Dictionaries"] = out

u.Respond(res, resp)
}

我的路由器是:

func Use(router *mux.Router) {

router.HandleFunc("/api/test/new", controllers.TestFunc).Methods("POST")
router.HandleFunc("/api/dictionaries/getdata", controllers.GetData).Methods("GET")
}

但是在 GetData 处理程序中我有一个错误:

data.Array undefined (type interface {} is interface with no methods)

最佳答案

你不能那样做。但是您有两个选择:

  1. 返回一个 interface{},就像您正在做的那样,然后转换为具体类型。这可能违背了您的目的。

  2. 将您的目的地作为指针传递,并就地修改它。所以像这样:

    func GetArrayOfModelStructs(table_name string, dst interface{}) error {

    然后让您的函数将值放入dst。这确实要求作为 dst 传递的值是一个指针。这是一种非常常见的模式,参见 json.Unmarshal() , 在 sql's Rows.Scan ,以及标准库和其他地方的许多其他地方。

关于go - 如何制作接受字符串参数的函数,并根据它返回不同的结构类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54435454/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com