英文:
How to pass generic type of array as the parameter for the function in Golang
问题
我是你的中文翻译助手,以下是你要翻译的内容:
我对Golang还不熟悉,我的问题是如何使函数接受泛型类型的参数。以下是我最近遇到的具体问题:
我定义了一个包含函数的结构体:
type TestArgs struct {
	name string
    ...
	customAssertForTypeA func(array []*pb.TypeA)
    customAssertForTypeB func(array []*pb.TypeB)
}
// 使用TestArgs定义测试用例。
tests := []TestArgs{
		{
			name: "Test A",
			customAssertForTypeA: func(array []*pb.TypeA) {
				// 一些代码
			}
		},
		{
			name: "Test B",
			customAssertForTypeB: func(array []*pb.TypeB) {
				// 一些代码
			}
		},
}
我的问题是如何使customAssert函数接受泛型类型的参数?我看到一些类似的问题有解决方案是使用interface{},所以我尝试了以下代码:
customAssert func(array interface{})
但是它没有起作用。
英文:
I'm new to Golang, My question is how to make function accept generic type of parameter. Here is the specific problem I met recently:
I defined a struct which contains a function
type TestArgs struct {
	name string
    ...
	customAssertForTypeA func(array []*pb.TypeA)
    customAssertForTypeB func(array []*pb.TypeB)
}
// Define the test case with TestArgs.
tests := []TestArgs{
		{
			name: "Test A",
			customAssertForTypeA: func(array []*pb.TypeA) {
				// Some code
			}
		},
		{
			name: "Test B",
			customAssertForTypeB: func(array []*pb.TypeB) {
				// Some code
			}
		},
}
My question is how to make customerAssert function accept generic type of parameter?
I saw some similar question with solution interface{}, so I tried
customAssert func(array interface{})
and it doesn't work.
答案1
得分: 3
类型断言(https://tour.golang.org/methods/15)是在你拥有一个interface{}类型的变量并且想要访问具体值时使用的。
type TestArgs struct {
    name         string
    customAssert func(interface{})
}
// 使用TestArgs定义测试用例。
tests := []TestArgs{
    {
        name: "Test A",
        customAssert: func(param interface{}) {
            // 一些代码
            array, ok := param.([]*pb.TypeA)
            if !ok {
                t.Fatal("断言错误 TypeA")
            }
            // 使用array
        },
    },
    {
        name: "Test B",
        customAssert: func(param interface{}) {
            // 一些代码
            array, ok := param.([]*pb.TypeB)
            if !ok {
                t.Fatal("断言错误 TypeB")
            }
            // 使用array
        },
    },
}
以上是你需要的翻译内容。
英文:
Type assertions ( https://tour.golang.org/methods/15 )  is what you need when you have an interface{} and want to access to the concrete value:
type TestArgs struct {
	name         string
	customAssert func(interface{})
}
// Define the test case with TestArgs.
tests := []TestArgs{
	{
		name: "Test A",
		customAssert: func(param interface{}) {
			// Some code
			array, ok := param.([]*pb.TypeA)
			if !ok {
				t.Fatal("assertion error TypeA")
			}
			// use array
		},
	},
	{
		name: "Test B",
		customAssert: func(param interface{}) {
			// Some code
			array, ok := param.([]*pb.TypeB)
			if !ok {
				t.Fatal("assertion error TypeB")
			}
			// use array
		},
	},
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论