2016-11-30 4 views
0

Я пытаюсь достичь утверждения типа, передавая тип в функцию. Другими словами, я пытаюсь добиться чего-то вроде этого:Golang: Передача переменной типа в функцию

// Note that this is pseudocode, because Type isn't the valid thing to use here 
func myfunction(mystring string, mytype Type) { 
    ... 

    someInterface := translate(mystring) 
    object, ok := someInterface.(mytype) 

    ... // Do other stuff 
} 

func main() { 
    // What I want the function to be like 
    myfunction("hello world", map[string]string) 
} 

Что собственно объявление функции нужно использовать в myfunction, чтобы успешно выполнить утверждение типа в myfunction?

+1

Тип утверждения требует определенного типа. Опишите проблему более высокого уровня, которую вы пытаетесь решить. Что такое «Делать другие вещи»? –

ответ

2

Написать это так:

func myfunction(jsonString string, v interface{}) { 
    err := json.Unmarshal([]byte(jsonString), v) 
    ... do other stuff 
} 

func main() { 
    var v map[string]string 
    myfunction("{'hello': 'world'}", &v) 
} 

В этом примере текст JSON будет unmarshaled на карте [строка] строки. Нет необходимости в утверждениях типа.

+1

Спасибо. Я сделал пост более общим, поэтому он не содержит ничего о json marshalling. Мне все еще интересно узнать, как можно было бы передать утверждение типа в Go, поэтому я отредактировал сообщение, чтобы отразить это. – hlin117

1

@ hlin117,

Эй, если я правильно понял ваш вопрос и вам нужно сравнить типы, вот что вы можете сделать:

package main 

import (
    "fmt" 
    "reflect" 
) 

func myfunction(v interface{}, mytype interface{}) bool { 
    return reflect.TypeOf(v) == reflect.TypeOf(mytype) 
} 

func main() { 

    assertNoMatch := myfunction("hello world", map[string]string{}) 

    fmt.Printf("%+v\n", assertNoMatch) 

    assertMatch := myfunction("hello world", "stringSample") 

    fmt.Printf("%+v\n", assertMatch) 

} 

подхода заключается в использовании образца типа вы хотите совместить.

 Смежные вопросы

  • Нет связанных вопросов^_^