在Go语言中,可以使用接口嵌套和类型断言来实现根据参数返回不同的数据结构。

首先,定义一个包含所有可能字段的接口UserData

type UserData interface {
    GetUserID() string
    GetUserName() string
}

然后,实现不同的数据结构,分别满足不同的UserData接口:

type User1 struct {
    UserID   string
    UserName string
}

func (u User1) GetUserID() string {
    return u.UserID
}

func (u User1) GetUserName() string {
    return u.UserName
}

type User2 struct {
    UserID   string
    UserName string
    DepIDs   string
}

func (u User2) GetUserID() string {
    return u.UserID
}

func (u User2) GetUserName() string {
    return u.UserName
}

type User3 struct {
    UserID   string
    UserName string
    Rights   []string
}

func (u User3) GetUserID() string {
    return u.UserID
}

func (u User3) GetUserName() string {
    return u.UserName
}

接下来,根据req_type的不同值返回不同的数据结构:

func GetUserData(reqType int) UserData {
    switch reqType {
    case 1:
        return User1{
            UserID:   "123",
            UserName: "John",
        }
    case 2:
        return User2{
            UserID:   "456",
            UserName: "Doe",
            DepIDs:   "789",
        }
    case 3:
        return User3{
            UserID:   "789",
            UserName: "Smith",
            Rights:   []string{"read", "write"},
        }
    default:
        return nil
    }
}

使用时,可以根据返回的UserData接口类型进行类型断言,获取具体的字段值:

func main() {
    userData := GetUserData(1)
    if user1, ok := userData.(User1); ok {
        fmt.Println(user1.GetUserID(), user1.GetUserName())
    }

    userData = GetUserData(2)
    if user2, ok := userData.(User2); ok {
        fmt.Println(user2.GetUserID(), user2.GetUserName(), user2.DepIDs)
    }

    userData = GetUserData(3)
    if user3, ok := userData.(User3); ok {
        fmt.Println(user3.GetUserID(), user3.GetUserName(), user3.Rights)
    }
}

这样就可以根据req_type的不同值返回不同的数据结构,并在使用时根据具体的数据结构进行处理

golang中同一个接口需要支持根据参数req_type返回不同的数据结构:当req_type=1时返回user_id stringuser_name string;当req_type=2时返回 user_id string user_name string depids string;当req_type=3时返回user_id stringuser_name stringrights 如何写

原文地址: https://www.cveoy.top/t/topic/ig2K 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录