亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

變量可以用作函數調用的占位符嗎?

變量可以用作函數調用的占位符嗎?

Go
三國紛爭 2023-08-07 11:12:15
我正在編寫一個程序,它有幾個結構和函數來以不同的方式處理這些結構。我有一個通用函數,它根據輸入調用所需的函數。是否有通用方法來使用getStruct()返回的值?package mainvar X func(s []string) Avar Y func(s []string) Btype A struct {? ? Name? string? ? Place string}type B struct {? ? Name? string? ? Place string? ? Value string}func newA(s []string) A {? ? a := A{? ? ? ? Name:? s[0],? ? ? ? Place: s[1],? ? }? ? return a}func newB(s []string) B {? ? a := B{? ? ? ? Name:? s[0],? ? ? ? Place: s[1],? ? ? ? Value: s[2],? ? }? ? return a}func getStruct(t string) interface{} {? ? switch {? ? case t == "A":? ? ? ? return X? ? case t == "B":? ? ? ? return Y? ? default:? ? ? ? return //someStruct? ? }}func main() {? ? buildNewStruct := getStruct("A") //Lets assume "A" here is got as an argument? ? var strSlice = []string{"Bob", "US"}? ? buildNewStruct(strSlice) //How to do this operation??? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//I am hoping to use buildNewStruct(strSlice) to dynamically call?? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//either of newA(strSlice) or newB(strSlice) function}由于我是新手,我不確定這樣的事情是否可能。
查看完整描述

2 回答

?
慕慕森

TA貢獻1856條經驗 獲得超17個贊

您可以使用該reflect包將結構屬性設置為[]interface{}切片中的等效索引定位值。


package main


import (

    "fmt"

    "log"

    "reflect"

)


func main() {

    var a A

    err := decode(&a, []interface{}{"Name", "Place"})

    log.Println(err)

    log.Println(a)

}


func decode(dst interface{}, values []interface{}) error {

    rvptr := reflect.ValueOf(dst)

    if rvptr.Kind() != reflect.Ptr {

        return fmt.Errorf("value must be ptr")

    }

    rv := rvptr.Elem()

    if rv.NumField() < len(values) {

        return fmt.Errorf("too many values")

    }

    if rv.NumField() > len(values) {

        return fmt.Errorf("too few values")

    }

    rvalues := reflect.ValueOf(values)

    for i := range values {

        f := rv.FieldByIndex([]int{i})

        f.Set(rvalues.Index(i).Elem())

    }

    return nil

}


type A struct {

    Name  string

    Place string

}


type B struct {

    Name  string

    Place string

    Value string

}

印刷


$ go run main.go 

2019/11/21 17:00:17 <nil>

2019/11/21 17:00:17 {Name Place}


查看完整回答
反對 回復 2023-08-07
?
肥皂起泡泡

TA貢獻1829條經驗 獲得超6個贊

問題在于函數的返回類型。


func newA(in []string) interface{} {...}

func newB(in []string) interface{} {...}


func getStruct(name string) func([]string) interface{} {

  switch name {

     case "A": return newA

     case "B": return newB

  }

  return nil

}


func main() {

  buildNewStruct := getStruct("A") 

  var strSlice = []string{"Bob", "US"}

  str:=buildNewStruct(strSlice)

  if a, ok:=str.(A); ok {

     ...

  }

}

使用這種方法,即使您通過調用統一節省了一些代碼buildNewStruct(),您也必須使用類型斷言來確定該函數返回的內容,因此這可能沒有多大意義。但這取決于您的具體用例。


查看完整回答
反對 回復 2023-08-07
  • 2 回答
  • 0 關注
  • 128 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號