_(had a look, couldn't recall this having been discussed or raised before)_ Consider the following code: ```go package main import ( "fmt" ) type S struct { Name string } func (s S) SetName(n string) { s.Name = n } type NameSet interface { SetName(n string) } func main() { s1 := S{} var s2 NameSet = s1 s1.Name = "Rob" fmt.Printf("s1: %v, s2: %v\n", s1, s2) s2.SetName("Pike") fmt.Printf("s1: %v, s2: %v\n", s1, s2) } ``` Per [the Go Playground](https://play.golang.org/p/LNldeawtHJ), this should output: ``` s1: {Rob}, s2: {} s1: {Rob}, s2: {} ``` But per [the GopherJS Playground](https://gopherjs.github.io/playground/#/qWZCc7PNyD) we get: ``` s1: {Rob}, s2: {Rob} s1: {Pike}, s2: {Pike} ``` Reason being the assignment to `s2` is not [`$clone`](https://github.com/gopherjs/gopherjs/blob/96e2b0e61b742f88faa02813d1b1c657d9a7f798/compiler/prelude/prelude.go#L290)-ing the value from `s1`. Similarly, in the call `s2.SetName` we are not `$clone`-ing. If the type of `s2` is changed to `S` then everything works as expected. Will look into this a bit more later, just logging here for now.