fgdfg
This commit is contained in:
parent
00b9ce122d
commit
23931220bb
3
book_with_bridge/flag/go.mod
Normal file
3
book_with_bridge/flag/go.mod
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
module main
|
||||
|
||||
go 1.25.5
|
||||
31
book_with_bridge/flag/main.go
Normal file
31
book_with_bridge/flag/main.go
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
type Kek interface {
|
||||
lol()
|
||||
azaza()
|
||||
}
|
||||
|
||||
type Test struct {
|
||||
x,y string
|
||||
}
|
||||
|
||||
func(t Test) lol() {
|
||||
fmt.Printf("I am lol method - %s\n",t.x)
|
||||
}
|
||||
|
||||
func(t Test) azaza() {
|
||||
fmt.Printf("I am azaza method %s\n",t.y)
|
||||
}
|
||||
|
||||
var _ Kek = (&Test{})
|
||||
|
||||
func main() {
|
||||
t := Test{
|
||||
x: "one",
|
||||
y: "two",
|
||||
}
|
||||
t.lol()
|
||||
t.azaza()
|
||||
}
|
||||
3
book_with_bridge/http/go.mod
Normal file
3
book_with_bridge/http/go.mod
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
module main
|
||||
|
||||
go 1.25.5
|
||||
96
book_with_bridge/http/main.go
Normal file
96
book_with_bridge/http/main.go
Normal file
|
|
@ -0,0 +1,96 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
"net/http"
|
||||
"strconv"
|
||||
"html/template"
|
||||
)
|
||||
|
||||
type rub float64
|
||||
|
||||
func (r rub) String() string {
|
||||
return fmt.Sprintf("%.2f",r)
|
||||
}
|
||||
|
||||
var tmpl *template.Template
|
||||
|
||||
|
||||
func Render(w http.ResponseWriter, req *http.Request) {
|
||||
err := tmpl.Execute(w,req)
|
||||
if err != nil {
|
||||
http.Error(w,err.Error(),http.StatusInternalServerError)
|
||||
}
|
||||
}
|
||||
|
||||
type database map[string]rub
|
||||
|
||||
type List struct {
|
||||
Items database
|
||||
}
|
||||
|
||||
func (db *database) list(w http.ResponseWriter, req *http.Request) {
|
||||
data := List{
|
||||
Items: *db,
|
||||
}
|
||||
|
||||
err := tmpl.ExecuteTemplate(w,"template.html",data)
|
||||
if err != nil {
|
||||
http.Error(w,err.Error(),http.StatusInternalServerError)
|
||||
}
|
||||
}
|
||||
|
||||
func (db *database) price(w http.ResponseWriter,req *http.Request) {
|
||||
item := req.URL.Query().Get("item")
|
||||
v,ok := (*db)[item]
|
||||
if !ok {
|
||||
w.WriteHeader(http.StatusNotFound)
|
||||
fmt.Fprintf(w,"%s not found in goods list",item)
|
||||
return
|
||||
}
|
||||
fmt.Fprintf(w,"Price of %s is %s",item,v)
|
||||
}
|
||||
|
||||
func (db *database) update(w http.ResponseWriter, req *http.Request) {
|
||||
item := req.URL.Query().Get("item")
|
||||
price := req.URL.Query().Get("price")
|
||||
f,err := strconv.ParseFloat(price,2)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
(*db)[item] = rub(f)
|
||||
fmt.Fprintf(w,"item %s and price %s",item,(*db)[item])
|
||||
}
|
||||
|
||||
// func (db database) ServeHTTP(w http.ResponseWriter, r *http.Request ) {
|
||||
// switch r.URL.Path {
|
||||
// case "/list":
|
||||
// for k,v := range db {
|
||||
// fmt.Fprintf(w,"%s costs %s rub\n",k,v)
|
||||
// }
|
||||
// case "/price":
|
||||
// item := r.URL.Query().Get("item")
|
||||
// v,ok := db[item]
|
||||
// if !ok {
|
||||
// w.WriteHeader(http.StatusNotFound)
|
||||
// fmt.Fprintf(w,"%s not found in goods list",item)
|
||||
// return
|
||||
// }
|
||||
// fmt.Fprintf(w,"Price of %s is %s",item,v)
|
||||
// }
|
||||
// }
|
||||
|
||||
func main() {
|
||||
db := database{
|
||||
"sneakers": 10.0,
|
||||
"boots": 20,
|
||||
}
|
||||
// mux.Handle("/list",http.HandlerFunc(db.list))
|
||||
// mux.Handle("/price",http.HandlerFunc(db.price))
|
||||
tmpl = template.Must(template.ParseFiles("template.html"))
|
||||
http.HandleFunc("/list",db.list)
|
||||
http.HandleFunc("/price",db.price)
|
||||
http.HandleFunc("/update",db.update)
|
||||
log.Fatal(http.ListenAndServe(":9090",nil))
|
||||
}
|
||||
34
book_with_bridge/http/template.html
Normal file
34
book_with_bridge/http/template.html
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>TABLE</title>
|
||||
<style>
|
||||
body { font-family: Arial, sans-serif; margin: 40px; }
|
||||
.header { background: #3498db; color: white; padding: 20px; border-radius: 8px; }
|
||||
.content { margin: 20px 0; }
|
||||
table { width: 100%; border-collapse: collapse; }
|
||||
th, td { padding: 10px; border: 1px solid #ddd; text-align: left; }
|
||||
th { background: #f4f4f4; }
|
||||
.price { text-align: right; font-weight: bold; color: #27ae60; }
|
||||
.total { background: #ecf0f1; font-weight: bold; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div class="content">
|
||||
<h2>Items</h2>
|
||||
<table>
|
||||
<tr>
|
||||
<th>Item Name</th>
|
||||
<th>Price</th>
|
||||
</tr>
|
||||
{{range $key, $value := .Items}}
|
||||
<tr>
|
||||
<td>{{$key}}</td>
|
||||
<td class="price">{{$value.String}}</td>
|
||||
</tr>
|
||||
{{end}}
|
||||
</table>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -2,10 +2,12 @@ package main
|
|||
|
||||
import (
|
||||
"bufio"
|
||||
"flag"
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
type ByteCount int
|
||||
|
|
@ -86,7 +88,16 @@ func LimitReader(r io.Reader,n int) io.Reader {
|
|||
}
|
||||
}
|
||||
|
||||
// Проверка, что ByteCount действительно соответствует интерфейсу io.Writer
|
||||
var _ io.Writer = new(ByteCount)
|
||||
|
||||
var period = flag.Duration("period",1 * time.Second,"sleep period")
|
||||
|
||||
func main() {
|
||||
flag.Parse()
|
||||
fmt.Printf("Waiting %v...",period)
|
||||
time.Sleep(*period)
|
||||
fmt.Println()
|
||||
// var bc ByteCount
|
||||
// bc.Write([]byte("Hello dodik"))
|
||||
// fmt.Println(bc)
|
||||
|
|
@ -99,14 +110,14 @@ func main() {
|
|||
// writer.Write([]byte("Hello Baga"))
|
||||
// fmt.Printf("Bytes %d",*count)
|
||||
|
||||
str := "hello"
|
||||
buf := make([]byte,100)
|
||||
reader := LimitReader(strings.NewReader(str),3)
|
||||
// str := "hello"
|
||||
// buf := make([]byte,100)
|
||||
// reader := LimitReader(strings.NewReader(str),3)
|
||||
// // n,_ := reader.Read(buf)
|
||||
// // reader := strings.NewReader(str)
|
||||
// n,_ := reader.Read(buf)
|
||||
// reader := strings.NewReader(str)
|
||||
n,_ := reader.Read(buf)
|
||||
fmt.Printf("Result is %d\n",n)
|
||||
fmt.Printf("String is %s",string(buf))
|
||||
// fmt.Printf("Result is %d\n",n)
|
||||
// fmt.Printf("String is %s",string(buf))
|
||||
|
||||
|
||||
}
|
||||
|
|
|
|||
3
book_with_bridge/tabwriter/go.mod
Normal file
3
book_with_bridge/tabwriter/go.mod
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
module main
|
||||
|
||||
go 1.25.5
|
||||
80
book_with_bridge/tabwriter/main.go
Normal file
80
book_with_bridge/tabwriter/main.go
Normal file
|
|
@ -0,0 +1,80 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"html/template"
|
||||
// "log"
|
||||
"os"
|
||||
"sort"
|
||||
"text/tabwriter"
|
||||
"time"
|
||||
)
|
||||
|
||||
type Track struct {
|
||||
Title string
|
||||
Artist string
|
||||
Album string
|
||||
Year int
|
||||
Length time.Duration
|
||||
}
|
||||
|
||||
var tracks = []*Track{
|
||||
{"Go", "Delilah", "From the Roots Up", 2012, length("3m38s")},
|
||||
{"Go", "Moby", "Moby", 1992, length("3m37s")},
|
||||
{"Go Ahead", "Alicia Keys", "As I Am", 2007, length("4m36s")},
|
||||
{"Ready 2 Go", "Martin Solveig", "Smash", 2011, length("4m24s")},
|
||||
}
|
||||
|
||||
var issueList = template.Must(template.New("tracklist").Parse(`
|
||||
<table>
|
||||
<tr style='text-align: left'>
|
||||
<th>#</th>
|
||||
<th>Title</th>
|
||||
<th>Artist</th>
|
||||
<th>Album</th>
|
||||
</tr>
|
||||
{{range .}}
|
||||
<tr>
|
||||
<td>{{.Title}}</td>
|
||||
<td>{{.Artist}}</td>
|
||||
<td>{{.Album}}</td>
|
||||
</tr>
|
||||
{{end}}
|
||||
</table>
|
||||
`))
|
||||
|
||||
|
||||
func length(s string) time.Duration {
|
||||
d, err := time.ParseDuration(s)
|
||||
if err != nil {
|
||||
panic(s)
|
||||
}
|
||||
return d
|
||||
}
|
||||
|
||||
func PrintTracks(tracks []*Track) {
|
||||
const format = "%v\t%v\t%v\t%v\t%v\n"
|
||||
tw := tabwriter.NewWriter(os.Stdout,0,8,2,' ',0)
|
||||
fmt.Fprintf(tw,format,"Title","Artist","Album","Year","Length")
|
||||
fmt.Fprintf(tw, format, "-----", "------", "-----", "----", "------")
|
||||
for _, t := range tracks {
|
||||
fmt.Fprintf(tw,format,t.Title,t.Artist,t.Album,t.Year,t.Length)
|
||||
}
|
||||
tw.Flush()
|
||||
}
|
||||
|
||||
type byArtists []*Track
|
||||
|
||||
func (x byArtists) Len() int {return len(x)}
|
||||
func (x byArtists) Less(i,j int) bool {return x[i].Artist < x[j].Artist}
|
||||
func (x byArtists) Swap(i,j int) { x[i],x[j] = x[j],x[i]}
|
||||
|
||||
func main() {
|
||||
PrintTracks(tracks)
|
||||
fmt.Println()
|
||||
sort.Sort(byArtists(tracks))
|
||||
PrintTracks(tracks)
|
||||
// if err := issueList.Execute(os.Stdout,tracks); err != nil {
|
||||
// log.Fatal(err)
|
||||
// }
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user