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