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

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

如何在不指定類型的情況下修改函數(shù)輸入?yún)?shù)?

如何在不指定類型的情況下修改函數(shù)輸入?yún)?shù)?

Go
忽然笑 2022-06-13 17:33:11
我正在嘗試創(chuàng)建一個(gè)接受 2 個(gè)參數(shù)的函數(shù),并將第二個(gè)參數(shù)的值設(shè)置為第一個(gè)參數(shù),它可能看起來像(我不確定):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"它預(yù)計(jì)適用于所有基本類型,如整數(shù)、浮點(diǎn)數(shù)、字符串、布爾...我怎樣才能做到這一點(diǎn)?
查看完整描述

1 回答

?
qq_花開花謝_0

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

這可以使用反射:


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

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

}

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


測(cè)試它:


a := 0

b := 10

set(&a, b)

fmt.Println(a)


s1 := ""

s2 := "what"

set(&s1, s2)

fmt.Println(s1)

輸出(在Go Playground上試試):


10

what

這是一個(gè)添加檢查以避免運(yùn)行時(shí)恐慌的版本:


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

}

測(cè)試它:


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


查看完整回答
反對(duì) 回復(fù) 2022-06-13
  • 1 回答
  • 0 關(guān)注
  • 134 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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