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

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

如何在不指定類型的情況下修改函數輸入參數?

如何在不指定類型的情況下修改函數輸入參數?

Go
忽然笑 2022-06-13 17:33:11
我正在嘗試創建一個接受 2 個參數的函數,并將第二個參數的值設置為第一個參數,它可能看起來像(我不確定):func set(a interface{}, b interface{}) {  // do something to make a = b}它是這樣工作的:a := 0b := 10set(&a, b)// here a should be 10s1 := ""s2 := "what"set(&s1, s2)// here s1 should be "what"它預計適用于所有基本類型,如整數、浮點數、字符串、布爾...我怎樣才能做到這一點?
查看完整描述

1 回答

?
qq_花開花謝_0

TA貢獻1835條經驗 獲得超7個贊

這可以使用反射:


func set(a interface{}, b interface{}) {

    reflect.ValueOf(a).Elem().Set(reflect.ValueOf(b))

}

請注意,此代碼不檢查是否a是指針及其元素類型是否與 中的值的類型匹配b。另請注意,使用反射速度較慢,并且您會失去編譯時類型安全性。上面的代碼比給一個變量賦值單個int值int或者給一個變量賦值string要慢很多string。


測試它:


a := 0

b := 10

set(&a, b)

fmt.Println(a)


s1 := ""

s2 := "what"

set(&s1, s2)

fmt.Println(s1)

輸出(在Go Playground上試試):


10

what

這是一個添加檢查以避免運行時恐慌的版本:


func set(a interface{}, b interface{}) error {

    v1 := reflect.ValueOf(a)

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

        return errors.New("a must be pointer")

    }

    if v1.IsZero() {

        return errors.New("a must not be a nil pointer")

    }


    v1 = v1.Elem()

    v2 := reflect.ValueOf(b)

    if v1.Type() != v2.Type() {

        return errors.New("a's element type must match b's type")

    }


    if !v1.CanSet() {

        return errors.New("unsettable value in a")

    }


    v1.Set(v2)

    return nil

}

測試它:


a := 0

b := 10

err := set(a, b)

fmt.Printf("set(a, b): a=%v, err: %v\n", a, err)

err = set(&a, b)

fmt.Printf("set(&a, b): a=%v, err: %v\n", a, err)

err = set((*int)(nil), b)

fmt.Printf("set((*int)(nil), b): a=%v, err: %v\n", a, err)


s1 := ""

s2 := "what"

err = set(&s1, s2)

fmt.Printf("set(&s1, s2): s1=%v, err: %v\n", s1, err)

err = set(&s1, b)

fmt.Printf("set(&s1, s2): s1=%v, err: %v\n", s1, err)

輸出(在Go Playground上試試):


set(a, b): a=0, err: a must be pointer

set(&a, b): a=10, err: <nil>

set((*int)(nil), b): a=10, err: a must not be a nil pointer

set(&s1, s2): s1=what, err: <nil>

set(&s1, s2): s1=what, err: a's element type must match b's type


查看完整回答
反對 回復 2022-06-13
  • 1 回答
  • 0 關注
  • 123 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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