a buttload of new experiments
This commit is contained in:
		
							parent
							
								
									c11748bf06
								
							
						
					
					
						commit
						3859176a52
					
				
							
								
								
									
										30
									
								
								channel-close.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								channel-close.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,30 @@
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import "fmt"
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
	jobs := make(chan int, 5)
 | 
			
		||||
	done := make(chan bool)
 | 
			
		||||
 | 
			
		||||
	go func() {
 | 
			
		||||
		for {
 | 
			
		||||
			j, more := <-jobs
 | 
			
		||||
			if more {
 | 
			
		||||
				fmt.Println("received job", j)
 | 
			
		||||
			} else {
 | 
			
		||||
				fmt.Println("received all jobs")
 | 
			
		||||
				done <- true
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}()
 | 
			
		||||
 | 
			
		||||
	for j := 1; j <= 3; j++ {
 | 
			
		||||
		jobs <- j
 | 
			
		||||
		fmt.Println("sent job", j)
 | 
			
		||||
	}
 | 
			
		||||
	close(jobs)
 | 
			
		||||
	fmt.Println("sent all jobs")
 | 
			
		||||
 | 
			
		||||
	<-done
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										20
									
								
								channel-directions.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								channel-directions.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,20 @@
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import "fmt"
 | 
			
		||||
 | 
			
		||||
func ping(pings chan<- string, msg string) {
 | 
			
		||||
	pings <- msg
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func pong(pings <-chan string, pongs chan<- string) {
 | 
			
		||||
	msg := <-pings
 | 
			
		||||
	pongs <- msg
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
	pings := make(chan string, 1)
 | 
			
		||||
	pongs := make(chan string, 1)
 | 
			
		||||
	ping(pings, "passed message")
 | 
			
		||||
	pong(pings, pongs)
 | 
			
		||||
	fmt.Println(<-pongs)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										34
									
								
								channel-sync.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								channel-sync.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,34 @@
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"time"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func signal() chan bool {
 | 
			
		||||
	return make(chan bool, 1)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func worker(done chan bool, wkrnum int) {
 | 
			
		||||
	fmt.Println("BEGIN: ", wkrnum)
 | 
			
		||||
	fmt.Println("Wait 5 seconds...", wkrnum)
 | 
			
		||||
	time.Sleep(time.Duration(5 * time.Second))
 | 
			
		||||
	fmt.Printf("%d plus %d equals %d\n", wkrnum, 5, 5+wkrnum)
 | 
			
		||||
	time.Sleep(time.Duration(5000))
 | 
			
		||||
	fmt.Println("END: ", wkrnum)
 | 
			
		||||
 | 
			
		||||
	done <- true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
 | 
			
		||||
	done1 := signal()
 | 
			
		||||
	go worker(done1, 1)
 | 
			
		||||
	<-done1
 | 
			
		||||
	done2 := signal()
 | 
			
		||||
	go worker(done2, 2)
 | 
			
		||||
	<-done2
 | 
			
		||||
	done3 := signal()
 | 
			
		||||
	go worker(done3, 3)
 | 
			
		||||
	<-done3
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										49
									
								
								channels.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								channels.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,49 @@
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func simpleping() {
 | 
			
		||||
	messages := make(chan string)
 | 
			
		||||
	go func() {
 | 
			
		||||
		messages <- "ping"
 | 
			
		||||
	}()
 | 
			
		||||
	msg := <-messages
 | 
			
		||||
	fmt.Println(msg)
 | 
			
		||||
	if msg == "ping" {
 | 
			
		||||
		fmt.Println("pong")
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func snd(msgchan chan string, msgs []string) {
 | 
			
		||||
	for i := 0; i < len(msgs); i++ {
 | 
			
		||||
		msgchan <- msgs[i]
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func rcv(msgchan chan string) string {
 | 
			
		||||
	var sentence []string
 | 
			
		||||
	var msglen int = len(msgchan)
 | 
			
		||||
	for v := range msgchan {
 | 
			
		||||
		fmt.Println(len(sentence), sentence)
 | 
			
		||||
		if len(sentence) == msglen-1 { // when we reach next to last in the array, do the last.
 | 
			
		||||
			sentence = append(sentence, v)
 | 
			
		||||
			break
 | 
			
		||||
		} else {
 | 
			
		||||
			sentence = append(sentence, v)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return strings.Join(sentence, " ")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
	simpleping()
 | 
			
		||||
 | 
			
		||||
	var words = []string{"buffered", "channel", "one", "two", "three", "four", "five", "six"}
 | 
			
		||||
	msgchan := make(chan string, len(words))
 | 
			
		||||
	snd(msgchan, words)
 | 
			
		||||
	fmt.Println(rcv(msgchan))
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								check-versions
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								check-versions
									
									
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										40
									
								
								check-versions.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								check-versions.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,40 @@
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"os"
 | 
			
		||||
	"os/exec"
 | 
			
		||||
	"runtime"
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func validateos() {
 | 
			
		||||
	if runtime.GOOS == "windows" {
 | 
			
		||||
		fmt.Println("Can't Execute this on a windows machine")
 | 
			
		||||
		os.Exit(1)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func execute(cmdstr string) {
 | 
			
		||||
 | 
			
		||||
	validateos()
 | 
			
		||||
 | 
			
		||||
	var cmdargs = strings.Split(cmdstr, " ")      // string arrayified
 | 
			
		||||
	var cmd = cmdargs[0]                          // command
 | 
			
		||||
	cmdargs = append(cmdargs[:0], cmdargs[1:]...) // argument array sans cmd
 | 
			
		||||
	out, err := exec.Command(cmd, cmdargs...).CombinedOutput()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		fmt.Println(err)
 | 
			
		||||
	}
 | 
			
		||||
	output := string(out[:])
 | 
			
		||||
	fmt.Println(output)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
	execute("/usr/sbin/lsof -iTCP -sTCP:LISTEN")
 | 
			
		||||
	execute("gcc --version")
 | 
			
		||||
	execute("java -version")
 | 
			
		||||
	execute("python3 --version")
 | 
			
		||||
	execute("php --version")
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										57
									
								
								handlers.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								handlers.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,57 @@
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
    "errors"
 | 
			
		||||
    "fmt"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func f1(arg int) (int, error) {
 | 
			
		||||
    if arg == 42 {
 | 
			
		||||
 | 
			
		||||
        return -1, errors.New("can't work with 42")
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return arg + 3, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type argError struct {
 | 
			
		||||
    arg  int
 | 
			
		||||
    prob string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (e *argError) Error() string {
 | 
			
		||||
    return fmt.Sprintf("%d - %s", e.arg, e.prob)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func f2(arg int) (int, error) {
 | 
			
		||||
    if arg == 42 {
 | 
			
		||||
 | 
			
		||||
        return -1, &argError{arg, "can't work with it"}
 | 
			
		||||
    }
 | 
			
		||||
    return arg + 3, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
 | 
			
		||||
    for _, i := range []int{7, 42} {
 | 
			
		||||
        if r, e := f1(i); e != nil {
 | 
			
		||||
            fmt.Println("f1 failed:", e)
 | 
			
		||||
        } else {
 | 
			
		||||
            fmt.Println("f1 worked:", r)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    for _, i := range []int{7, 42} {
 | 
			
		||||
        if r, e := f2(i); e != nil {
 | 
			
		||||
            fmt.Println("f2 failed:", e)
 | 
			
		||||
        } else {
 | 
			
		||||
            fmt.Println("f2 worked:", r)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _, e := f2(42)
 | 
			
		||||
    if ae, ok := e.(*argError); ok {
 | 
			
		||||
        fmt.Println(ae.arg)
 | 
			
		||||
        fmt.Println(ae.prob)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										49
									
								
								interfaces.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								interfaces.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,49 @@
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"math"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// I have changed the names of the types and interface methods because they conflict with
 | 
			
		||||
// the go native library
 | 
			
		||||
 | 
			
		||||
type geometry interface {
 | 
			
		||||
	areaa() float64
 | 
			
		||||
	perimm() float64
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type recta struct {
 | 
			
		||||
	width, height float64
 | 
			
		||||
}
 | 
			
		||||
type circle struct {
 | 
			
		||||
	radius float64
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r recta) areaa() float64 {
 | 
			
		||||
	return r.width * r.height
 | 
			
		||||
}
 | 
			
		||||
func (r recta) perimm() float64 {
 | 
			
		||||
	return 2*r.width + 2*r.height
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c circle) areaa() float64 {
 | 
			
		||||
	return math.Pi * c.radius * c.radius
 | 
			
		||||
}
 | 
			
		||||
func (c circle) perimm() float64 {
 | 
			
		||||
	return 2 * math.Pi * c.radius
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func measure(g geometry) {
 | 
			
		||||
	fmt.Println(g)
 | 
			
		||||
	fmt.Println(g.areaa())
 | 
			
		||||
	fmt.Println(g.perimm())
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
	r := recta{width: 3, height: 4}
 | 
			
		||||
	c := circle{radius: 5}
 | 
			
		||||
	measure(r)
 | 
			
		||||
	measure(c)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										32
									
								
								non-blocks.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								non-blocks.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,32 @@
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import "fmt"
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
	messages := make(chan string)
 | 
			
		||||
	signals := make(chan bool)
 | 
			
		||||
 | 
			
		||||
	select {
 | 
			
		||||
	case msg := <-messages:
 | 
			
		||||
		fmt.Println("received message", msg)
 | 
			
		||||
	default:
 | 
			
		||||
		fmt.Println("no message received")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	msg := "hi"
 | 
			
		||||
	select {
 | 
			
		||||
	case messages <- msg:
 | 
			
		||||
		fmt.Println("sent message", msg)
 | 
			
		||||
	default:
 | 
			
		||||
		fmt.Println("no message sent")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	select {
 | 
			
		||||
	case msg := <-messages:
 | 
			
		||||
		fmt.Println("received message", msg)
 | 
			
		||||
	case sig := <-signals:
 | 
			
		||||
		fmt.Println("received signal", sig)
 | 
			
		||||
	default:
 | 
			
		||||
		fmt.Println("no activity")
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										30
									
								
								select-switch.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								select-switch.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,30 @@
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"time"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
 | 
			
		||||
	c1 := make(chan string)
 | 
			
		||||
	c2 := make(chan string)
 | 
			
		||||
 | 
			
		||||
	go func() {
 | 
			
		||||
		time.Sleep(1 * time.Second)
 | 
			
		||||
		c1 <- "one"
 | 
			
		||||
	}()
 | 
			
		||||
	go func() {
 | 
			
		||||
		time.Sleep(2 * time.Second)
 | 
			
		||||
		c2 <- "two"
 | 
			
		||||
	}()
 | 
			
		||||
 | 
			
		||||
	for i := 0; i < 2; i++ {
 | 
			
		||||
		select {
 | 
			
		||||
		case msg1 := <-c1:
 | 
			
		||||
			fmt.Println("received", msg1)
 | 
			
		||||
		case msg2 := <-c2:
 | 
			
		||||
			fmt.Println("received", msg2)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										34
									
								
								timeouts.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								timeouts.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,34 @@
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"time"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
 | 
			
		||||
	c1 := make(chan string, 1)
 | 
			
		||||
	go func() {
 | 
			
		||||
		time.Sleep(5 * time.Second)
 | 
			
		||||
		c1 <- "channel 1 response!"
 | 
			
		||||
	}()
 | 
			
		||||
 | 
			
		||||
	select {
 | 
			
		||||
	case res := <-c1:
 | 
			
		||||
		fmt.Println(res)
 | 
			
		||||
	case <-time.After(3 * time.Second):
 | 
			
		||||
		fmt.Println("channel 1 timeout!")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	c2 := make(chan string, 1)
 | 
			
		||||
	go func() {
 | 
			
		||||
		time.Sleep(2 * time.Second)
 | 
			
		||||
		c2 <- "channel 2 response!"
 | 
			
		||||
	}()
 | 
			
		||||
	select {
 | 
			
		||||
	case res := <-c2:
 | 
			
		||||
		fmt.Println(res)
 | 
			
		||||
	case <-time.After(3 * time.Second):
 | 
			
		||||
		fmt.Println("timeout 2")
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user