当前位置: 首页 > 面试题库 >

Golang:结构切片之间的类型转换

杨学真
2023-03-14
问题内容

我在以下测试代码中尝试转换res为a ListSociete时并没有完全理解问题所在:

import (
    "errors"
    "fmt"
    "github.com/jmcvetta/neoism"
)

type Societe struct {
    Name string
}

type ListSociete []Societe

func loadListSociete(name string) (ListSociete, error) {
    db, err := neoism.Connect("http://localhost:7474/db/data")
    if err != nil {
        return nil, err
    }
    res := []struct {
        Name string `json:"a.name"`
    }{}
    cq := neoism.CypherQuery{
        Statement: `
            MATCH (a:Societe)
            WHERE a.name = {name}
            RETURN a.name
            `,
        Parameters: neoism.Props{"name": name},
        Result:     &res,
    }
    db.Cypher(&cq)
    if len(res) == 0 {
        return nil, errors.New("Page duz not exists")
    }
    r := res[0]
    return ListSociete(res), nil
}

[]struct{Name string}有所不同[]struct{Name string json:"a.name" }吗?

还是ListSociete与ListSociete不同[]struct{Name string}

谢谢。


问题答案:

您当前正在处理两种不同的类型:

type Societe struct {
    Name string
}

和匿名的:

struct {
    Name string `json:"a.name"`
}

如果不是标记,那么这两个将是相同的。在
围棋规格
的状态(我的重点):

如果两个struct类型具有相同的字段序列,并且对应的字段具有相同的名称,相同的类型 和相同的tag ,则它们是 相同的
。两个匿名字段被认为具有相同的名称。来自不同软件包的小写字段名称始终是不同的。

因此,您无法在两者之间进行简单的转换。另外,转换两种类型的 切片 的事实使转换成为问题。我可以为您看到两个选择:

通过迭代复制:

这是安全且推荐的解决方案,但它也比较冗长和缓慢。

ls := make(ListSociete, len(res))
for i := 0; i < len(res); i++ { 
    ls[i].Name = res[i].Name
}
return ls, nil

不安全的转换:

由于两种类型都具有相同的基础数据结构,因此可能会进行不安全的转换。
但是,这可能稍后会炸掉。 被警告!

return *(*ListSociete)(unsafe.Pointer(&res)), nil

游乐场示例: http //play.golang.org/p/lfk7qBp2Gb



 类似资料:
  • 问题内容: 我从UDP套接字获取了一个字节片(),并希望将其视为整数片(),而无需更改基础数组,反之亦然。在C(++)中,我只是在指针类型之间进行转换;我将如何在Go中执行此操作? 问题答案: 正如其他人所说,在Go中强制转换指针被认为是错误的形式。这是正确的Go方式示例以及与C数组转换等效的示例。 警告:所有代码未经测试。 在此示例中,我们使用包将每组4个字节转换为。这样更好,因为我们指定了字节

  • 问题内容: 假设我有两种类似的类型设置为: 知道它们具有相同的字段,是否有直接的方法将值从类型1写入类型2?(除了编写将所有字段从源复制到目标的循环外) 谢谢。 问题答案: 对于您的特定示例,您可以轻松地将其转换:

  • 问题内容: 我正在使用反射包来获取任意数组的类型,但是 如何从数组中获取类型?我知道如何从价值中获取价值。 http://play.golang.org/p/sNw8aL0a5f 问题答案: 更改: 至: 顺便说一句,不是一个数组而是一个整数 切片 。

  • String转换到Byte数组时,每个byte(byte类型其实就是uint8)保存字符串对应字节的数值。 注意Go的字符串是UTF-8编码的,每个字符长度是不确定的,一些字符可能是1、2、3或者4个字节结尾。 示例1: package main import "fmt" func main() { s1 := "abcd" b1 := []byte(s1) fmt.Pri

  • 本文向大家介绍golang修改结构体中的切片值方法,包括了golang修改结构体中的切片值方法的使用技巧和注意事项,需要的朋友参考一下 golang修改结构体中的切片值,直接传结构体地址就可以 到此这篇关于golang修改结构体中的切片值方法的文章就介绍到这了,更多相关golang 修改结构体切片值内容请搜索呐喊教程以前的文章或继续浏览下面的相关文章希望大家以后多多支持呐喊教程!

  • 问题内容: 我有以下几种类型: 我可以使用use ,但是我 不能 使用 似乎可以嵌入语法,但是使用它无效吗? 问题答案: 嵌入式类型是(未命名的)字段,由不合格的类型名称引用。 规格:结构类型: 使用类型但没有显式字段名称声明的字段是 匿名字段 ,也称为 嵌入式 字段或该类型在结构中的嵌入。必须将嵌入式类型指定为类型名称或指向非接口类型名称的指针,并且本身不能为指针类型。 非限定类型名称充当字段名