drsl90685154 2017-08-02 16:46
浏览 79
已采纳

从main访问Inner Scope中的Struct数据并在Golang中将其保存到csv

appendStruct function is designed to run in multiple threads in order to collect and append DataItem into DataContainer. So far I can print the result from inner appendStruct Q1: how to access and print container from main, Q2: save that struct data type to csv from main ?

package main

import "fmt"

type DataItem struct {
    name string
}

type DataContainer struct {
    Items []DataItem
}

func (box *DataContainer) AddItem(item DataItem) []DataItem {
    box.Items = append(box.Items, item)
    return box.Items
}

func appendStruct() {
    items := []DataItem{}
    container := DataContainer{items}

    item1 := DataItem{name: fmt.Sprintf("Item1")}
    item2 := DataItem{name: fmt.Sprintf("Item2")}

    container.AddItem(item1)
    container.AddItem(item2)

    var ss = fmt.Sprintf("", container)
    fmt.Println(ss)
}

func main() {

    appendStruct()

}

OUTPUT from go run test.go is:

%!(EXTRA main.DataContainer={[{Item1} {Item2}]})

re Q1. "encoding/csv" has to implement string interface [][]string there is a hint how to approach it in Write struct to csv file but lacks implementation example.

  • 写回答

2条回答 默认 最新

  • duanbarong4617 2017-08-02 16:59
    关注

    In appendStruct, container is a local variable, so it's not accessible outside that function call. You could return it, which would make it accessible from the caller (in this case, main):

    func appendStruct() DataContainer {
        //...
        return container
    }
    
    func main() {
        container := appendStruct()
    }
    

    The answer you linked is an excellent starting point. A code example shouldn't really be necessary - they're basically recommending that you create a helper method/function that takes all the fields of the struct and puts them into a slice in whatever order you want them to appear in the CSV, e.g.:

    func (c DataItem) ToSlice() []string {
        row := make([]string, 1, 1) // Since you only have 1 field in the struct
        row[0] = c.name
        return row
    }
    

    Then you can loop over these to write them to a CSV file.

    The error output you're getting is because you're using Sprintf, which expects a format string as the first parameter with a reference for each other argument. You're passing an empty format string, which would only work with no other arguments (and be pointless). Perhaps you meant Sprintf("%v", container) or just Sprint(container)?

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 GDI处理通道视频时总是带有白色锯齿
  • ¥20 用雷电模拟器安装百达屋apk一直闪退
  • ¥15 算能科技20240506咨询(拒绝大模型回答)
  • ¥15 自适应 AR 模型 参数估计Matlab程序
  • ¥100 角动量包络面如何用MATLAB绘制
  • ¥15 merge函数占用内存过大
  • ¥15 Revit2020下载问题
  • ¥15 使用EMD去噪处理RML2016数据集时候的原理
  • ¥15 神经网络预测均方误差很小 但是图像上看着差别太大
  • ¥15 单片机无法进入HAL_TIM_PWM_PulseFinishedCallback回调函数