Sync
This commit is contained in:
parent
cfd7ab8a0b
commit
cd080ddda2
12
tour_of_go/l5/3
Normal file
12
tour_of_go/l5/3
Normal file
@ -0,0 +1,12 @@
|
||||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
func main() {
|
||||
var i interface{} = "hello"
|
||||
|
||||
s := i.(string)
|
||||
fmt.Println(s)
|
||||
|
||||
fmt.Printf("%v- %T\n", s, s)
|
||||
}
|
18
tour_of_go/l5/empty-interface.go
Normal file
18
tour_of_go/l5/empty-interface.go
Normal file
@ -0,0 +1,18 @@
|
||||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
func describe(i interface{}) {
|
||||
fmt.Printf("(%v, %T)\n", i, i)
|
||||
}
|
||||
|
||||
func main() {
|
||||
var i interface{}
|
||||
describe(i)
|
||||
|
||||
i = 42
|
||||
describe(i)
|
||||
|
||||
i = "hello"
|
||||
describe(i)
|
||||
}
|
28
tour_of_go/l5/error.go
Normal file
28
tour_of_go/l5/error.go
Normal file
@ -0,0 +1,28 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
)
|
||||
|
||||
type MyError struct {
|
||||
When time.Time
|
||||
What string
|
||||
}
|
||||
|
||||
func (e *MyError) Error() string {
|
||||
return fmt.Sprintf("at %v, %s", e.When, e.What)
|
||||
}
|
||||
|
||||
func run() error {
|
||||
return &MyError {
|
||||
time.Now(),
|
||||
"it didn't work",
|
||||
}
|
||||
}
|
||||
|
||||
func main() {
|
||||
if err := run(); err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
}
|
16
tour_of_go/l5/ex-reader/exercise-reader.go
Normal file
16
tour_of_go/l5/ex-reader/exercise-reader.go
Normal file
@ -0,0 +1,16 @@
|
||||
package main
|
||||
|
||||
import "golang.org/x/tour/reader"
|
||||
|
||||
type MyReader struct{}
|
||||
|
||||
func (r MyReader) Read(b []byte) (int, error) {
|
||||
for i := range(b) {
|
||||
b[i] = 'A'
|
||||
}
|
||||
return len(b), nil
|
||||
}
|
||||
|
||||
func main() {
|
||||
reader.Validate(MyReader{})
|
||||
}
|
30
tour_of_go/l5/ex-reader/exercise-rot-reader.go
Normal file
30
tour_of_go/l5/ex-reader/exercise-rot-reader.go
Normal file
@ -0,0 +1,30 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"io"
|
||||
"os"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type rot13Reader struct {
|
||||
r io.Reader
|
||||
}
|
||||
|
||||
func (r rot13Reader) Read(b []byte) (int, error) {
|
||||
n, err := r.r.Read(b)
|
||||
for i := 0; i < n; i++ {
|
||||
switch {
|
||||
case 'A' <= b[i] && 'Z' >= b[i]:
|
||||
b[i] = 'A' + (b[i]-'A'+13)%26
|
||||
case 'a' <= b[i] && 'z' >= b[i]:
|
||||
b[i] = 'a' + (b[i]-'a'+13)%26
|
||||
}
|
||||
}
|
||||
return n, err
|
||||
}
|
||||
|
||||
func main() {
|
||||
s := strings.NewReader("Lbh penpxrq gur pbqr!")
|
||||
r := rot13Reader{s}
|
||||
io.Copy(os.Stdout, &r)
|
||||
}
|
5
tour_of_go/l5/ex-reader/go.mod
Normal file
5
tour_of_go/l5/ex-reader/go.mod
Normal file
@ -0,0 +1,5 @@
|
||||
module exercies-reader.go
|
||||
|
||||
go 1.24.5
|
||||
|
||||
require golang.org/x/tour v0.1.0
|
2
tour_of_go/l5/ex-reader/go.sum
Normal file
2
tour_of_go/l5/ex-reader/go.sum
Normal file
@ -0,0 +1,2 @@
|
||||
golang.org/x/tour v0.1.0 h1:OWzbINRoGf1wwBhKdFDpYwM88NM0d1SL/Nj6PagS6YE=
|
||||
golang.org/x/tour v0.1.0/go.mod h1:DUZC6G8mR1AXgXy73r8qt/G5RsefKIlSj6jBMc8b9Wc=
|
41
tour_of_go/l5/exercise-errors.go
Normal file
41
tour_of_go/l5/exercise-errors.go
Normal file
@ -0,0 +1,41 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
type ErrNegativeSqrt float64
|
||||
|
||||
func (e ErrNegativeSqrt) Error() string {
|
||||
return fmt.Sprintf("cannot Sqrt negative number: %v", float64(e))
|
||||
}
|
||||
|
||||
func Sqrt(x float64) (float64, error) {
|
||||
if x < 0 {
|
||||
return 0, ErrNegativeSqrt(x)
|
||||
}
|
||||
precision := 0.00001
|
||||
old_z := 0.0
|
||||
z := x
|
||||
iter := 0
|
||||
for (z - old_z) > precision {
|
||||
iter += 1
|
||||
old_z := z
|
||||
z -= (z*z - x) / (2*z)
|
||||
if old_z - z < 0 {
|
||||
if ((old_z - z) * -1) < precision {
|
||||
fmt.Println("Required precision has been reached after", iter, "iterations! Square root of", x , "is", z)
|
||||
return z, nil
|
||||
}
|
||||
} else if (old_z - z) < precision {
|
||||
fmt.Println("Required precision has been reached after", iter, "iterations! Square root of", x , "is", z)
|
||||
return z, nil
|
||||
}
|
||||
}
|
||||
return z, nil
|
||||
}
|
||||
|
||||
func main() {
|
||||
fmt.Println(Sqrt(2))
|
||||
fmt.Println(Sqrt(-2))
|
||||
}
|
19
tour_of_go/l5/exercise-stringer.go
Normal file
19
tour_of_go/l5/exercise-stringer.go
Normal file
@ -0,0 +1,19 @@
|
||||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
type IPAddr [4]byte
|
||||
|
||||
func (i IPAddr) String() string {
|
||||
return fmt.Sprintf("%d.%d.%d.%d", i[0], i[1], i[2], i[3])
|
||||
}
|
||||
|
||||
func main() {
|
||||
hosts := map[string]IPAddr{
|
||||
"loopback": {127, 0, 0, 1},
|
||||
"googleDNS": {8, 8, 8, 8},
|
||||
}
|
||||
for name, ip := range hosts {
|
||||
fmt.Printf("%v: %v\n", name, ip)
|
||||
}
|
||||
}
|
30
tour_of_go/l5/indirection.go
Normal file
30
tour_of_go/l5/indirection.go
Normal file
@ -0,0 +1,30 @@
|
||||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
type Vertex struct {
|
||||
X, Y float64
|
||||
}
|
||||
|
||||
func (v *Vertex) Scale(f float64) {
|
||||
v.X = v.X * f
|
||||
v.Y = v.Y * f
|
||||
}
|
||||
|
||||
func ScaleFunc(v *Vertex, f float64) {
|
||||
v.X = v.X * f
|
||||
v.Y = v.Y * f
|
||||
}
|
||||
|
||||
func main() {
|
||||
v := Vertex{3, 4}
|
||||
v.Scale(2)
|
||||
ScaleFunc(&v, 10)
|
||||
|
||||
p := &Vertex{4, 3}
|
||||
p.Scale(3)
|
||||
ScaleFunc(p, 8)
|
||||
|
||||
fmt.Println(v, p)
|
||||
}
|
||||
|
51
tour_of_go/l5/interfaces-continued.go
Normal file
51
tour_of_go/l5/interfaces-continued.go
Normal file
@ -0,0 +1,51 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math"
|
||||
)
|
||||
|
||||
type I interface {
|
||||
M()
|
||||
}
|
||||
|
||||
type T struct {
|
||||
S string
|
||||
}
|
||||
|
||||
func (t *T) M() {
|
||||
if t == nil {
|
||||
fmt.Println("<nil>")
|
||||
return
|
||||
}
|
||||
fmt.Println(t.S)
|
||||
}
|
||||
|
||||
type F float64
|
||||
|
||||
func (f F) M() {
|
||||
fmt.Println(f)
|
||||
}
|
||||
func describe(i I) {
|
||||
fmt.Printf("(%v, %T)\n", i, i)
|
||||
}
|
||||
|
||||
func main() {
|
||||
var i I
|
||||
// These lines will cause a run-time error due to nil pointer dereferencing
|
||||
// describe(i)
|
||||
// i.M()
|
||||
|
||||
var t *T
|
||||
i = t
|
||||
describe(i)
|
||||
i.M()
|
||||
|
||||
i = &T{"hello"}
|
||||
describe(i)
|
||||
i.M()
|
||||
|
||||
i = F(math.Pi)
|
||||
describe(i)
|
||||
i.M()
|
||||
}
|
40
tour_of_go/l5/interfaces.go
Normal file
40
tour_of_go/l5/interfaces.go
Normal file
@ -0,0 +1,40 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math"
|
||||
)
|
||||
|
||||
type MyFloat float64
|
||||
|
||||
type Vertex struct {
|
||||
X, Y float64
|
||||
}
|
||||
|
||||
type Abser interface {
|
||||
Abs() float64
|
||||
}
|
||||
|
||||
func (f MyFloat) Abs() float64 {
|
||||
if f < 0 {
|
||||
return float64(-f)
|
||||
}
|
||||
return float64(f)
|
||||
}
|
||||
|
||||
func (v *Vertex) Abs() float64 {
|
||||
return math.Sqrt(v.X*v.X + v.Y*v.Y)
|
||||
}
|
||||
|
||||
func main() {
|
||||
var a Abser
|
||||
f := MyFloat(-math.Sqrt2)
|
||||
v := Vertex{3, 4}
|
||||
|
||||
a = f
|
||||
a = &v
|
||||
|
||||
// a = v
|
||||
|
||||
fmt.Println(a.Abs())
|
||||
}
|
20
tour_of_go/l5/methods-continued.go
Normal file
20
tour_of_go/l5/methods-continued.go
Normal file
@ -0,0 +1,20 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math"
|
||||
)
|
||||
|
||||
type MyFloat float64
|
||||
|
||||
func (f MyFloat) Abs() float64 {
|
||||
if f < 0 {
|
||||
return float64(-f)
|
||||
}
|
||||
return float64(f)
|
||||
}
|
||||
|
||||
func main() {
|
||||
f := MyFloat(-math.Sqrt2)
|
||||
fmt.Println(f.Abs())
|
||||
}
|
25
tour_of_go/l5/methods-pointers.go
Normal file
25
tour_of_go/l5/methods-pointers.go
Normal file
@ -0,0 +1,25 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math"
|
||||
)
|
||||
|
||||
type Vertex struct {
|
||||
X, Y float64
|
||||
}
|
||||
|
||||
func (v Vertex) Abs() float64 {
|
||||
return math.Sqrt(v.X*v.X + v.Y*v.Y)
|
||||
}
|
||||
|
||||
func (v *Vertex) Scale(f float64) {
|
||||
v.X = v.X * f
|
||||
v.Y = v.Y * f
|
||||
}
|
||||
|
||||
func main() {
|
||||
v := Vertex{3, 4}
|
||||
v.Scale(10)
|
||||
fmt.Println(v.Abs())
|
||||
}
|
29
tour_of_go/l5/methods.go
Normal file
29
tour_of_go/l5/methods.go
Normal file
@ -0,0 +1,29 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math"
|
||||
)
|
||||
|
||||
type Vertex struct {
|
||||
X, Y float64
|
||||
}
|
||||
|
||||
// This is a method - a function that implements a receiver (the part between "func" and "Abs()")
|
||||
|
||||
func (v Vertex) Abs() float64 {
|
||||
return math.Sqrt(v.X*v.X + v.Y*v.Y)
|
||||
}
|
||||
|
||||
// The method above has the same functionality as the function below
|
||||
|
||||
func Abs(v Vertex) float64 {
|
||||
return math.Sqrt(v.X*v.X + v.Y*v.Y)
|
||||
}
|
||||
|
||||
func main() {
|
||||
v := Vertex{3,4}
|
||||
fmt.Println(v.Abs())
|
||||
w := Vertex{3,4}
|
||||
fmt.Println(Abs(w))
|
||||
}
|
25
tour_of_go/l5/pointers-functions.go
Normal file
25
tour_of_go/l5/pointers-functions.go
Normal file
@ -0,0 +1,25 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math"
|
||||
)
|
||||
|
||||
type Vertex struct {
|
||||
X, Y float64
|
||||
}
|
||||
|
||||
func Abs(v Vertex) float64 {
|
||||
return math.Sqrt(v.X*v.X + v.Y*v.Y)
|
||||
}
|
||||
|
||||
func Scale(v Vertex, f float64) {
|
||||
v.X = v.X * f
|
||||
v.Y = v.Y * f
|
||||
}
|
||||
|
||||
func main() {
|
||||
v := Vertex{3, 4}
|
||||
Scale(v, 10)
|
||||
fmt.Println(Abs(v))
|
||||
}
|
21
tour_of_go/l5/reader.go
Normal file
21
tour_of_go/l5/reader.go
Normal file
@ -0,0 +1,21 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func main() {
|
||||
r := strings.NewReader("Hello, Reader!")
|
||||
|
||||
b := make([]byte, 8)
|
||||
for {
|
||||
n, err := r.Read(b)
|
||||
fmt.Printf("n = %v err = %v b = %v\n", n, err, b)
|
||||
fmt.Printf("b[:n] = %q\n", b[:n])
|
||||
if err == io.EOF {
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
18
tour_of_go/l5/stringer.go
Normal file
18
tour_of_go/l5/stringer.go
Normal file
@ -0,0 +1,18 @@
|
||||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
type Person struct {
|
||||
Name string
|
||||
Age int
|
||||
}
|
||||
|
||||
func (p Person) String() string {
|
||||
return fmt.Sprintf("%v (%v years)\n", p.Name, p.Age)
|
||||
}
|
||||
|
||||
func main() {
|
||||
a := Person{"Arthur The King", 51}
|
||||
b := Person{"Darth Vader", 49}
|
||||
fmt.Println(a, b)
|
||||
}
|
22
tour_of_go/l5/type-assertions.go
Normal file
22
tour_of_go/l5/type-assertions.go
Normal file
@ -0,0 +1,22 @@
|
||||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
func main() {
|
||||
var i interface{} = "hello"
|
||||
|
||||
s := i.(string)
|
||||
fmt.Println(s)
|
||||
|
||||
s, ok := i.(string)
|
||||
fmt.Println(s, ok)
|
||||
|
||||
f, ok := i.(float64)
|
||||
fmt.Println(f, ok)
|
||||
|
||||
// This will cause a panic
|
||||
// f = i.(float64)
|
||||
// fmt.Println(f)
|
||||
|
||||
fmt.Printf("Type info: %v- %T\n", s, s)
|
||||
}
|
20
tour_of_go/l5/type-switches.go
Normal file
20
tour_of_go/l5/type-switches.go
Normal file
@ -0,0 +1,20 @@
|
||||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
func do(i interface{}) {
|
||||
switch v := i.(type) {
|
||||
case int:
|
||||
fmt.Printf("Twice %v is %v\n", v, v*2)
|
||||
case string:
|
||||
fmt.Printf("%q is %v bytes long\n", v, len(v))
|
||||
default:
|
||||
fmt.Printf("I don't know about this type %T!\n", v)
|
||||
}
|
||||
}
|
||||
|
||||
func main() {
|
||||
do(21)
|
||||
do("Golang")
|
||||
do(true)
|
||||
}
|
Loading…
Reference in New Issue
Block a user