Skip to content

Instantly share code, notes, and snippets.

@dron247
Last active September 1, 2018 03:18
Show Gist options
  • Save dron247/f8b5b85aa86f98be147b9bd7e16e8b4f to your computer and use it in GitHub Desktop.
Save dron247/f8b5b85aa86f98be147b9bd7e16e8b4f to your computer and use it in GitHub Desktop.
How to send data via interface declared channel by ref
package main
import "fmt"
import "time"
// не обязательно явно реализовывать интерфейс, но по хорошему явно надо, ибо поддерживаемость
type testData struct {
name string
}
type testInterface interface {
printValue()
}
// важно, именно рессивер метода должен принимать поинтер
// короче как передаваться будем решает именно реализация метода
func (td *testData) printValue() {
fmt.Println(td.name)
}
// симулируем долгую операцию,
// заметь ни о каких ссылках здесь не идет речь
func test(objects <-chan testInterface) {
obj := <-objects
obj.printValue()
time.Sleep(time.Second)
obj.printValue()
}
func main() {
fmt.Println("Press ENTER to exit")
var td = testData{name: "Simple name"}
// создаем канал, о ссылках опять не говорим
var objects = make(chan testInterface)
go test(objects)
objects <- &td
td.name = "Name 2" // меняем данные, подтверждая передачу по ссылке
fmt.Scanln()
}
Press ENTER to exit
Simple name
Name 2
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment