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