将数组 varchar (psql) 转换为数组字符串 (golang)

3
我希望了解如何将我在psql数据库中的数组varchar转换为go中的数组字符串,以便在JSON中呈现。实际上,我是这样做的:在创建表时,我创建了以下列:
tags varchar(50)[] default NULL

当我在golang中使用select请求获取数据时:
var rowtags []uint8
err = rows.Scan(&rowtags)
if err != nil {
    log.Fatal(err)
}

我尝试编写一个函数,将 uint8[] 转换为 string[]。

func Uint8toString(array []uint8) []string {

    var ret = make([]string, len(array))
    for i := 0; i < len(array); i++{
        ret[i] = string(array[i])
    }
    return (ret)
}

所以我应用了我的变量rowstag的函数。
var tags := Uint8toString(rowtags)

当我渲染具有var标签的结构体时,会得到这个结果。
  "Tags": [
    "{",
    "#",
    "c",
    ",",
    "#",
    "c",
    ",",
    "#",
    "c",
    "o",
    "u",
    "c",
    "o",
    "u",
    ",",
    "#",
    "c",
    "d",
    "}"
  ],

当然,我很喜欢它。
  "Tags": [
    "#c",
    "#c",
    "#coucou",
    "#cd"
  ],

感谢您的帮助,我学习Go语言还不久,但是我找不到解决方案。

1个回答

0
首先,为什么你有一个包含多个标签值的标签列?难道不应该有另一个表,其中包含对当前标签列的外键,以便每个标签值都是它自己的行吗?如果你有这个,你应该能够做一些非常简单的事情,比如:
rows := db.QueryRow("SELECT tag from tags_table where foreign_key = 123")
var asSlice []string
err := row.Scan(&asSlice) 

如果必须将所有内容放在一个列中,那么将其存储为JSON是否可行?然后您可以使用"encoding/json"包执行一些简单的操作,例如:
func Uint8toString(array []uint8) []string {
     var stringArray []string
     json.Unmarshal(array, &stringArray)
     return stringArray
}

虽然我认为你应该重新考虑实现上述标签列的方式,但你也可以使用以下逻辑将其解析为字符串,但它假定格式始终类似于你发布的内容:

func Uint8toString(array []uint8) []string {
    stringNoBrackets := string(array[1:len(array)-1])
    return strings.Split(stringNoBrackets,",")
}

是的,我也认为我需要重新考虑实现标签列的方式,但我真的很想知道将varchar数组转换为字符串数组的最佳方法,感谢您的回答。 - Fantasim
底部的代码示例应该会得到一个字符串数组作为结果...也许有更简单的方法,但我不知道你的查询是什么样子的,你是否尝试过将一个[]string的引用传递给Scan而不是[]unit8的引用?(见第一个代码片段)...这仍然可能有效,但不确定你的查询或表是什么样子的。 - JD D
如果您尝试扫描到*[]string,您将会收到以下错误信息:sql: Scan error on column index 0: unsupported Scan, storing driver.Value type []uint8 into type *[]string。Scan将从数据库读取的列转换为仅包含Go常见类型的子集,其中不包括[]string。 - Ludi Rehak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接