Last active
September 1, 2018 03:18
-
-
Save dron247/f8b5b85aa86f98be147b9bd7e16e8b4f to your computer and use it in GitHub Desktop.
How to send data via interface declared channel by ref
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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() | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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