为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Go 中创建一个变量类型的切片?

如何在 Go 中创建一个变量类型的切片?

Go
侃侃无极 2022-03-07 22:52:50
我有一个功能。func doSome(v interface{}) {}  如果我通过指针将结构切片传递给函数,则函数必须填充切片。type Color struct {}type Brush struct {}var c []ColordoSome(&c) // after с is array contains 3 elements type Colorvar b []BrushdoSome(&b) // after b is array contains 3 elements type Brush也许我需要使用反射,但是如何?
查看完整描述

3 回答

?
MM们

TA贡献1886条经验 获得超2个赞

func doSome(v interface{}) {


    s := reflect.TypeOf(v).Elem()

    slice := reflect.MakeSlice(s, 3, 3)

    reflect.ValueOf(v).Elem().Set(slice)


}  


查看完整回答
反对 回复 2022-03-07
?
杨魅力

TA贡献1811条经验 获得超6个赞

类型开关!!


package main

import "fmt"


func doSome(v interface{}) {

  switch v := v.(type) {

  case *[]Color:

    *v = []Color{Color{0}, Color{128}, Color{255}}

  case *[]Brush:

    *v = []Brush{Brush{true}, Brush{true}, Brush{false}}

  default:

    panic("unsupported doSome input")

  }

}  


type Color struct {

    r uint8

}

type Brush struct {

    round bool

}


func main(){

    var c []Color

    doSome(&c) // after с is array contains 3 elements type Color


    var b []Brush

    doSome(&b) // after b is array contains 3 elements type Brush


    fmt.Println(b)

    fmt.Println(c)


}


查看完整回答
反对 回复 2022-03-07
?
忽然笑

TA贡献1806条经验 获得超5个赞

Go 没有泛型。你的可能性是:


接口调度


type CanTraverse interface {

    Get(int) interface{}

    Len() int

}

type Colours []Colour


func (c Colours) Get(i int) interface{} {

    return c[i]

}

func (c Colours) Len() int {

    return len(c)

}

func doSome(v CanTraverse) {

    for i := 0; i < v.Len; i++ {

        fmt.Println(v.Get(i))

    }

}

按照@Plato 的建议输入 switch


func doSome(v interface{}) {

  switch v := v.(type) {

  case *[]Colour:

    //Do something with colours

  case *[]Brush:

    //Do something with brushes

  default:

    panic("unsupported doSome input")

  }

}

像 fmt.Println() 一样进行反射。反射非常强大但非常昂贵,代码可能很慢。最小的例子


func doSome(v interface{}) {

    value := reflect.ValueOf(v)

    if value.Kind() == reflect.Slice {

        for i := 0; i < value.Len(); i++ {

            element := value.Slice(i, i+1)

            fmt.Println(element)

        }

    } else {

        fmt.Println("It's not a slice")

    }

}


查看完整回答
反对 回复 2022-03-07
  • 3 回答
  • 0 关注
  • 158 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信