第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

變量可以用作函數(shù)調(diào)用的占位符嗎?

變量可以用作函數(shù)調(diào)用的占位符嗎?

Go
三國紛爭 2023-08-07 11:12:15
我正在編寫一個(gè)程序,它有幾個(gè)結(jié)構(gòu)和函數(shù)來以不同的方式處理這些結(jié)構(gòu)。我有一個(gè)通用函數(shù),它根據(jù)輸入調(diào)用所需的函數(shù)。是否有通用方法來使用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貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超17個(gè)贊

您可以使用該reflect包將結(jié)構(gòu)屬性設(shè)置為[]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}


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

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超6個(gè)贊

問題在于函數(shù)的返回類型。


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 {

     ...

  }

}

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


查看完整回答
反對 回復(fù) 2023-08-07
  • 2 回答
  • 0 關(guān)注
  • 138 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號