2016-07-16 39 views
0

我是比較新的,只是試圖找出正確的模式是從一​​個函數中返回一個結構集合。請參閱下面的代碼,我已經返回了一小部分結構,然後在嘗試迭代它時遇到問題,因爲我必須使用接口類型。看到例子:在golang中返回函數結構片段的正確模式

package main 

import (
    "fmt" 
) 

type SomeStruct struct { 
    Name  string 
    URL  string 
    StatusCode int 
} 

func main() { 
    something := doSomething() 
    fmt.Println(something) 

    // iterate over things here but not possible because can't range on interface{} 
    // would like to do something like 
    //for z := range something { 
    // doStuff(z.Name) 
    //} 

} 

func doSomething() interface{} { 
    ServicesSlice := []interface{}{} 
    ServicesSlice = append(ServicesSlice, SomeStruct{"somename1", "someurl1", 200}) 
    ServicesSlice = append(ServicesSlice, SomeStruct{"somename2", "someurl2", 500}) 
    return ServicesSlice 
} 

從我讀過的東西,似乎都使用類型開關或ValueOf與反射來獲得具體的價值。我想我在這裏只是錯過了一些東西,因爲我覺得來回傳遞數據應該是相當直接的。

回答

1

你只需要返回正確的類型。現在,你回來interface{},所以你需要使用一個類型斷言,回到你想要的實際類型,但你可以改變函數簽名和返回[]SomeStruct(的SomeStruct個切片):

package main 

import (
    "fmt" 
) 

type SomeStruct struct { 
    Name  string 
    URL  string 
    StatusCode int 
} 

func main() { 
    something := doSomething() 
    fmt.Println(something) 

    for _, thing := range something { 
     fmt.Println(thing.Name) 
    } 
} 

func doSomething() []SomeStruct { 
    ServicesSlice := make([]SomeStruct, 0, 2) 
    ServicesSlice = append(ServicesSlice, SomeStruct{"somename1", "someurl1", 200}) 
    ServicesSlice = append(ServicesSlice, SomeStruct{"somename2", "someurl2", 500}) 
    return ServicesSlice 
} 

https://play.golang.org/p/TdNQTYciTk