【问题标题】:Assigning value in Golang在 Golang 中赋值
【发布时间】:2015-03-12 10:57:58
【问题描述】:

我创建了一个 var 类型

var RespData   []ResponseData

ResponseData 结构如下:

type ResponseData struct {
    DataType       string      
    Component      string      
    ParameterName  string      
    ParameterValue string      
    TableValue     *[]Rows 
}
type TabRow struct {
    ColName     string 
    ColValue    string 
    ColDataType string 
}
type Rows *[]TabRow

我想填写TableValue 类型的*[]Rows

您能否通过在TableValue 中分配任何值来举例说明。

【问题讨论】:

  • 指向切片的指针 (*[]TabRow) 很少有用,通常表明作者不理解 slices(类似地图已经是引用类型)。此外,TableValue 最终成为一个指向切片的指针,这似乎并不理想。

标签: pointers go composite-literals


【解决方案1】:

TableValue 是指向[]Rows 的指针(Rows 的切片)。

Rows 是指向[]TabRow 的指针(TabRow 的切片)。因此,您可以使用slice literal 创建一个Rows 值,并获取its address with &,这样您就有一个指向[]TabRow 的指针——这将是Rows 类型。

您可以通过使用另一个切片文字(创建一个[]Rows)获取指向[]Rows 的指针,并获取其地址类型为*[]Rows,即TableValue 的类型,因此您可以直接将此分配给ResponseData.TableValue

所以你可以这样做:

var tv1 Rows = &[]TabRow{TabRow{"name11", "value11", "type11"},
    TabRow{"name12", "value12", "type12"}}
var tv2 Rows = &[]TabRow{TabRow{"name21", "value21", "type21"},
    TabRow{"name22", "value22", "type22"}}

var TableValue *[]Rows = &[]Rows{tv1, tv2}

fmt.Println(TableValue)
for _, v := range *TableValue {
    fmt.Println(v)
}

输出:

&[0x10436180 0x10436190]
&[{name11 value11 type11} {name12 value12 type12}]
&[{name21 value21 type21} {name22 value22 type22}]

Go Playground 上试试。

在你指定元素(类型为TabRow)的切片文字中,你甚至可以省略类型,它变成这样:

var tv1 Rows = &[]TabRow{{"name11", "value11", "type11"},
    {"name12", "value12", "type12"}}
var tv2 Rows = &[]TabRow{{"name21", "value21", "type21"},
    {"name22", "value22", "type22"}}

如果你使用Short variable declaration,你甚至可以进一步缩短它(试试Playground):

tv1 := &[]TabRow{{"name11", "value11", "type11"}, {"name12", "value12", "type12"}}
tv2 := &[]TabRow{{"name21", "value21", "type21"}, {"name22", "value22", "type22"}}
TableValue := &[]Rows{tv1, tv2}

【讨论】:

  • 这里 TableValue 的类型是 *[]Rows 。如何为 TableValue 分配值?
  • @susheelchaudhary 你说得对,我编辑了答案以准确创建该类型。
【解决方案2】:
func main() {

    rowsList := []TabRow{
        TabRow{
            ColName:     "col1",
            ColValue:    "col1v",
            ColDataType: "string",
        },
        TabRow{
            ColName:     "col2",
            ColValue:    "col2v",
            ColDataType: "int",
        }}

    rows := Rows(&rowsList)

    resp := ResponseData{
        DataType:       "json",
        Component:      "backend",
        ParameterName:  "test",
        ParameterValue: "cases",
        TableValue:     &rows,
    }

    fmt.Printf("%v", resp)
}

【讨论】:

  • 在 ResponseData 中,TableValue 的类型是 *[]Rows,而不是 *Rows。
【解决方案3】:

你可以这样简化你的结构:

type ResponseData struct {
    DataType       string      
    Component      string      
    ParameterName  string      
    ParameterValue string      
    TableValue     []*TabRow 
}
type TabRow struct {
    ColName     string 
    ColValue    string 
    ColDataType string 
}

然后您可以使用以下内容填充它:

resp := ResponseData {
    DataType: "",
    Component: "",
    ParameterName: "",
    ParameterValue: "",
    TableValue: []*TabRow{
      &TabRow{"","",""},
      &TabRow{"","",""},
      &TabRow{"","",""},
    },
}

并添加一个新的 TabRow:

resp.TableValue = append(resp.TableValue, &TabRow{"","",""})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-17
    • 2014-08-04
    • 2017-05-11
    • 1970-01-01
    • 2020-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多