Thank you V.
I'v read this before, but it doesn't answer my question.
Thank you anyway!

在 2017年5月5日星期五 UTC+8下午7:46:42,Volker Dobler写道:
>
> See https://golang.org/doc/faq#convert_slice_of_interface
>
> V.
>
> On Friday, 5 May 2017 13:35:42 UTC+2, eZio Pan wrote:
>>
>> Hi, I'm a newbie in Golang. I get stuck in a problem that I can't 
>> understand why. I wish someone could help me out. Thanks!
>>
>> There are 2 struct type *S1* and *S2*. Both of them implement interface 
>> type *StringI*.
>> I write a function called *run* which use *StringI* interface as input, 
>> and run all method *StringI* signatured.
>>
>> Then I write a test file, in which I declare a **S1* variable as *s1*, 
>> and a **S2* variable as *s2*.
>> I create a slice *[]interface{}{s1,s2}*, the I use for loop to get item 
>> in it.
>>
>> But when I use *run*(*LoopedItem*), I got an error 
>>
>> *cannot use item (type interface {}) as type StringI in argument to run*
>>
>> And I use fmt.Printf("%T", *LoopedItem*), Golang does print right type -- 
>> **S1* and **S2*
>>
>> Then I try type switch
>>
>> switch *LoopedItem*.(type){
>> case *S1:
>>     run(*LoopedItem*.(*S1))
>> case *S2:
>>     run(*LoopedItem*.(*S2))
>> }
>>
>> Everything goes on well.
>>
>>
>> *I wonder why I can't use *LoopedItem* (as StringI interface) as run 
>> function's argument,but *LoopedItem*.(*TypePointer*) (as struct type 
>> pointer) to the run function.*
>>
>>
>>
>> Here is the source code
>>
>>
>> #### firstInter.go ####
>>
>> /*my first interface*/
>> package firstInter
>>
>> import (
>> "fmt"
>> "strconv"
>> )
>>
>> // interface with Get() and Push() method
>> type StringI interface {
>> Get() string
>> Push(string)
>> String() string
>> }
>>
>> // type S1, store a int value
>> type S1 struct {
>> I int
>> }
>>
>> // S1's Get method 
>> // return the int value it stored
>> func (s *S1) Get() string {
>> return strconv.Itoa(s.I)
>> }
>>
>> // S1's Push method
>> // put new value into S1
>> func (s *S1) Push(a string) {
>> num, err := strconv.Atoi(a)
>> if err == nil {
>> s.I = num
>> }
>> }
>>
>> // S1's String method
>> // for fmt
>> func (s *S1) String() string {
>> return strconv.Itoa(s.I)
>> }
>>
>> // type S2, store a string value
>> type S2 struct {
>> S string
>> }
>>
>> // S2's Get method 
>> // return the string value it stored
>> func (s *S2) Get() string {
>> return s.S
>> }
>>
>> // S2's Push method
>> // put new value into S2
>> func (s *S2) Push(a string) {
>> s.S = a
>> }
>>
>> // S2's String method
>> // for fmt
>> func (s *S2) String() string {
>> return s.S
>> }
>>
>> // function to run every method
>> // StringI interface signatured
>> func run(tI StringI) {
>> fmt.Printf("%v\n", tI.Get())
>> tI.Push("3")
>> fmt.Printf("%v\n", tI.Get())
>> }
>>
>>
>> #### firstInter_test.go ####
>>
>> // firstInter package Unit Testing
>> package firstInter
>>
>> import (
>> //"fmt"
>> )
>>
>> var tI StringI
>>
>> var s1 *S1 = &S1{1}
>> var s2 *S2 = &S2{"???"}
>> var l []interface{} = []interface{}{s1, s2}
>>
>> func Example_InterFace() {
>> for _, item := range l {
>> // something wrong here
>> // run(item)
>> // fmt.Printf("%T\n", item)
>> switch item.(type) {
>> case *S1:
>> run(item.(*S1))
>> case *S2:
>> run(item.(*S2))
>> }
>> }
>> // Output:
>> // 1
>> // 3
>> // ???
>> // 3
>> }
>>
>>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to