如何将字段作为参数传递

huangapple go评论85阅读模式
英文:

How to pass field as parameter

问题

我想将字段作为参数传递给函数来返回值。

package main

import (
	"fmt"
)

type s struct {
	a int
	b int
}

func c(s s, field string) int {
	var t int
	if field == "a" {
		t = s.a
	} else if field == "b" {
		t = s.b
	}
	return t
}

func main() {
	fmt.Println(c(s{5, 8}, "b"))
}

有时我想让t = s.a,有时我想让t = s.b来返回值8,问题是如何将它作为参数传递。

英文:

i want to pass field as parameter to return value from function

package main

import (
	"fmt"
)

type s struct {
	a int
	b int
}

func c(s s) int {
	var t int
	t = s.a // how to change this to t=s.b just by pass parameter
	return t
}
func main() {
	fmt.Println(c(s{5, 8}))
}

some times i want to make t = s.a and other time i wanted t = s.b to return value 8 the question is how to pass it like parameter

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

答案1

得分: 2

你可以添加第二个参数来指示你想要的字段,例如:

func c2(s s, field int) int {
    var t int
    switch field {
    case 0:
        t = s.a
    case 1:
        t = s.b
    }
    return t
}

或者更方便的方法是传递字段的名称,并使用反射来获取该字段:

func c3(s s, fieldName string) int {
    var t int
    t = int(reflect.ValueOf(s).FieldByName(fieldName).Int())
    return t
}

或者你可以传递字段的地址,并赋值指向的值:

func c4(f *int) int {
    var t int
    t = *f
    return t
}

测试上述解决方案:

x := s{5, 8}

fmt.Println("c2 with a:", c2(x, 0))
fmt.Println("c2 with b:", c2(x, 1))

fmt.Println("c3 with a:", c3(x, "a"))
fmt.Println("c3 with b:", c3(x, "b"))

fmt.Println("c4 with a:", c4(&x.a))
fmt.Println("c4 with b:", c4(&x.b))

输出结果为:

c2 with a: 5
c2 with b: 8
c3 with a: 5
c3 with b: 8
c4 with a: 5
c4 with b: 8

你可以在Go Playground上尝试运行以上代码。

英文:

You may add a 2nd parameter to signal which field you want, for example:

func c2(s s, field int) int {
	var t int
	switch field {
	case 0:
		t = s.a
	case 1:
		t = s.b
	}
	return t
}

Or a more convenient way is to pass the name of the field, and use reflection to get that field:

func c3(s s, fieldName string) int {
	var t int
	t = int(reflect.ValueOf(s).FieldByName(fieldName).Int())
	return t
}

Or you may pass the address of the field, and assign the pointed value:

func c4(f *int) int {
	var t int
	t = *f
	return t
}

Testing the above solutions:

x := s{5, 8}

fmt.Println("c2 with a:", c2(x, 0))
fmt.Println("c2 with b:", c2(x, 1))

fmt.Println("c3 with a:", c3(x, "a"))
fmt.Println("c3 with b:", c3(x, "b"))

fmt.Println("c4 with a:", c4(&x.a))
fmt.Println("c4 with b:", c4(&x.b))

Which will output (try it on the Go Playground):

c2 with a: 5
c2 with b: 8
c3 with a: 5
c3 with b: 8
c4 with a: 5
c4 with b: 8

huangapple
  • 本文由 发表于 2021年11月11日 00:32:24
  • 转载请务必保留本文链接:https://go.coder-hub.com/69916911.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定