
A bitcast was inserted when the receiver of the call wasn't a *i8. This is a pretty common case, and did not play well with goroutines. Avoid this bitcast by changing each call to a direct call, after unpacking the receiver type from the *i8 parameter. This might also fix some undefined behavior in the resulting program, as it is technically not allowed to call a function with a different signature (even if the signature is compatible).
56 строки
1 005 Б
Go
56 строки
1 005 Б
Go
package main
|
|
|
|
import "time"
|
|
|
|
func main() {
|
|
println("main 1")
|
|
go sub()
|
|
time.Sleep(1 * time.Millisecond)
|
|
println("main 2")
|
|
time.Sleep(2 * time.Millisecond)
|
|
println("main 3")
|
|
|
|
// Await a blocking call. This must create a new coroutine.
|
|
println("wait:")
|
|
wait()
|
|
println("end waiting")
|
|
|
|
// Run a non-blocking call in a goroutine. This should be turned into a
|
|
// regular call, so should be equivalent to calling nowait() without 'go'
|
|
// prefix.
|
|
go nowait()
|
|
time.Sleep(time.Millisecond)
|
|
println("done with non-blocking goroutine")
|
|
|
|
var printer Printer
|
|
printer = &myPrinter{}
|
|
printer.Print()
|
|
}
|
|
|
|
func sub() {
|
|
println("sub 1")
|
|
time.Sleep(2 * time.Millisecond)
|
|
println("sub 2")
|
|
}
|
|
|
|
func wait() {
|
|
println(" wait start")
|
|
time.Sleep(time.Millisecond)
|
|
println(" wait end")
|
|
}
|
|
|
|
func nowait() {
|
|
println("non-blocking goroutine")
|
|
}
|
|
|
|
type Printer interface {
|
|
Print()
|
|
}
|
|
|
|
type myPrinter struct{
|
|
}
|
|
|
|
func (i *myPrinter) Print() {
|
|
time.Sleep(time.Millisecond)
|
|
println("async interface method call")
|
|
}
|