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

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

Golang 泛型 - 簡(jiǎn)單用例

Golang 泛型 - 簡(jiǎn)單用例

Go
人到中年有點(diǎn)甜 2023-05-15 10:36:22
假設(shè)我有 3 個(gè)結(jié)構(gòu):type A struct{   Foo map[string]string}type B struct{   Foo map[string]string}type C struct{   Foo map[string]string}然后我想創(chuàng)建一個(gè)可以接受任何這些結(jié)構(gòu)的函數(shù):func handleFoo (){}有什么辦法可以用 Golang 做到這一點(diǎn)嗎?就像是:type ABC = A | B | Cfunc handleFoo(v ABC){   x: = v.Foo["barbie"] // this would be nice!}好的,讓我們嘗試一個(gè)界面:type FML interface {  Bar() string}func handleFoo(v FML){   z := v.Bar() // this will compile   x: = v.Foo["barbie"] // this won't compile - can't access properties like Foo from v}在一種鼓勵(lì)/強(qiáng)制組合的語(yǔ)言中,我不明白為什么你不能訪(fǎng)問(wèn)像 Foo 這樣的屬性。
查看完整描述

3 回答

?
侃侃爾雅

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

您可以以這種方式使用接口,添加一個(gè)方法GetFoo來(lái)獲取每個(gè)結(jié)構(gòu)的 foo。


type A struct{

    Foo map[string]string

}


func(a *A) GetFoo() map[string]string {

    return a.Foo

}


type B struct{

    Foo map[string]string

}


func(b *B) GetFoo() map[string]string {

    return b.Foo

}


type C struct{

    Foo map[string]string

}


func(c *C) GetFoo() map[string]string {

    return c.Foo

}


type ABC interface {

    GetFoo() map[string][string]

}


func handleFoo (v ABC){

    foo := v.GetFoo()

    x:=foo["barbie"]

}


查看完整回答
反對(duì) 回復(fù) 2023-05-15
?
拉風(fēng)的咖菲貓

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

因?yàn)?A、B 和 C 都可分配給相同的底層類(lèi)型,所以您可以使用帶有該底層類(lèi)型參數(shù)的函數(shù):func handleFoo(v struct{ Foo map[string]string })

在操場(chǎng)上運(yùn)行它。

這種方法的一個(gè)限制是 A、B 和 C 上的方法(即使具有相同的名稱(chēng)和簽名)在handleFoo.


查看完整回答
反對(duì) 回復(fù) 2023-05-15
?
拉丁的傳說(shuō)

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

你可以嘗試reflect傳遞interface{}handleFoo

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

https://golang.org/pkg/reflect/

package main


import (

    "fmt"

    "reflect"

)


func main() {

    type A struct {

        Foo map[string]string

    }

    type B struct {

        Foo map[string]int

    }

    type C struct {

        Foo map[string]uint

    }

    a := A{

        Foo: map[string]string{"a":"1"},

    }


    b := B{

        Foo: map[string]int{"a":2},

    }


    c := C {

        Foo: map[string]uint{"a":3},

    }



    fmt.Println(a, b, c)


    handleFoo(a)

    handleFoo(b)

    handleFoo(c)


    fmt.Println(a, b, c)

}




func handleFoo(s interface{}) {

    v := reflect.ValueOf(s)

    foo := v.FieldByName("Foo")

    if !foo.IsValid(){

        fmt.Println("not valid")

        return

    }


    switch foo.Type() {

    case reflect.TypeOf(map[string]string{}):

        fmt.Println("is a map[string]string")

        foo.Interface().(map[string]string)["a"] = "100"

    case reflect.TypeOf(map[string]int{}):

        fmt.Println("is a map[string]int")

        foo.Interface().(map[string]int)["a"] =  200

    case reflect.TypeOf(map[string]uint{}):

        fmt.Println("is a map[string]uint")

        foo.Interface().(map[string]uint)["a"] =  300

    }

}


查看完整回答
反對(duì) 回復(fù) 2023-05-15
  • 3 回答
  • 0 關(guān)注
  • 155 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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