Go언어 함수 매개변수 전달에서
조회수 696회
type Brand struct {
Idx string `json:"idx"`
Code int `json:"code"`
Name string `json:"name"`
}
brands := make([]*Brand, 0)
r.DB.Raw(query).Scan(&brands)
위 와 같은 구조체를 가진 brands 변수에 DB 데이터를 넣어서
배열 형식의 구조체를 만들어 함수로 전달하고자 합니다.
func Test(brands interface{}){
for i := range brands {
fmt.Println(brands[i])
}
}
여기서 직접 구조체를 명시해주는 방법도 있겠지만... 예시이며,
하고자 하는것은 어떤 타입의 구조체가 올지 모르는 상황이라
함수로 넘긴 배열형식의 구조체를 반복문을 사용하고 싶은데 brands가 interface 형식이라
반복문을 실행할 수 없네요...
func Test(brands []interface{}){
for i := range brands {
fmt.Println(brands[i])
}
}
위 처럼 작성할 경우엔 매개변수 전달할때 에러가 나타납니다.
Cannot use 'brands' (type []*model.Brand) as type []interface{}
3 답변
-
package main import "fmt" func Test(brands []interface{}){ for i := range brands { fmt.Println(brands[i]) } } type Brand struct { Idx string Code int Name string } func main() { parsed := []Brand{Brand{"1", 1, "one"}, Brand{"2", 2, "two"}} brands := make([]interface{}, len(parsed)) for i, v := range parsed { brands[i] = v } Test(brands) }
https://golang.org/doc/faq#convert_slice_of_interface https://stackoverflow.com/questions/27689058/convert-string-to-interface
-
크게 2가지 방법을 소개하겠습니다.
1. Type Assertion
func Test(brands interface{}) { brandsSlice, ok := brands.([]interface{}) if !ok { // error } for i := range brandsSlice { fmt.Println(brandsSlice[i]) } }
이렇게 인자가 Slice인지 체크한 뒤 원하는 것을 하는 방법입니다.
2.
reflect
func Test(brands interface{}) { switch reflect.TypeOf(brands).Kind() { case reflect.Slice: value := reflect.ValueOf(brands) for i := 0; i < value.Len(); i++ { fmt.Println(value.Index(i)) } } }
두번째 방법은
reflect
를 쓰는 방법입니다. 이 방법은reflect
를 임포트 하셔야 합니다. -
댓글 입력