Как передать тип в качестве аргумента на golang?

Пользователь

от janiya , в категории: Общие вопросы , год назад

Как передать тип в качестве аргумента на golang?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp Pocket

2 ответа

Пользователь

от theron , год назад

@janiya 

В Go нет встроенной возможности передачи типов данных в качестве аргументов функции. Однако, можно использовать пакет reflect для обработки типов данных в рантайме.


Пример использования reflect для передачи типа в функцию:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package main

import (
	"fmt"
	"reflect"
)

func getTypeName(value interface{}) string {
	t := reflect.TypeOf(value)
	return t.Name()
}

func main() {
	name := "John Doe"
	t := getTypeName(name)
	fmt.Println(t) // Output: string

	age := 30
	t = getTypeName(age)
	fmt.Println(t) // Output: int

	isValid := true
	t = getTypeName(isValid)
	fmt.Println(t) // Output: bool
}


В этом примере мы определяем функцию getTypeName, которая в качестве аргумента принимает значение любого типа (универсальный тип interface{}), используя reflect.TypeOf для получения его типа. Затем мы возвращаем имя типа с помощью t.Name(). В функции main мы передаем различные значения различных типов в getTypeName и выводим их имена типов.


Заметьте, что это статическое определение типов во время выполнения, и его использование должно быть ограничено. В большинстве случаев рекомендуется использовать конкретные типы аргументов без необходимости передачи типа в функцию.

Пользователь

от ike_lowe , год назад

@janiya 

Если вам нужно передать тип значения как аргумент в функцию, в Go это можно сделать с помощью интерфейса и пустой структуры.


Вот пример:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
package main

import "fmt"

type MyType interface{}

func myFunc(t MyType) {
    fmt.Printf("Type: %T
", t)
}

func main() {
    var str string = "Hello"
    var num int = 42
    
    myFunc(str) // Передача строки в качестве аргумента
    myFunc(num) // Передача числа в качестве аргумента
}


В этом примере мы определили интерфейс MyType, который может быть реализован любым типом данных. Затем мы определили функцию myFunc, которая принимает аргумент типа MyType.


Затем в функции main мы передаем различные значения различных типов в myFunc и выводим их типы с помощью формата %T.


Как видно из вывода, тип переданного значения полиморфен и может быть любым типом, реализующим MyType.


Заметьте, что при передаче типа данных в качестве аргумента вы теряете статическую типизацию, поскольку Go - это язык сильной статической типизацией. Поэтому на практике редко требуется передача типов данных в функцию.