golang book 13

480 html шаблоны формы отправки html/template 481 func check(err error) { if err != nil { log.Fatal(err) } view.html import "html/template" html, err := template.ParseFiles("view.html") запись содержимого в writer err := html.Execute(writer, nil) 485 text/template тоже самое, но более опасен text := "ttttttt" tmpl, err := template.New("test").Parse(text) err := tmpl.Execute(os.Stdout, nil) вместо записи в вывод браузера, записывает в вывод консоли os.Stdout работает как файл, но он сразу выводится count, err := os.Stdout.Write([]byte("hello")) {{}} tmpl, err := template.New("test").Parse("123{{.}}456") err := tmpl.Execute(os.Stdout, 42) условие в шаблонах "start{{if .}}123{{end}}555" "{{range .}}({{.}}){{end}}" выводит все элементы массива []string("do", "re","mi") Для структур "Name: {{.Name}}" так же можно условие {{if .Active}} чтение из файла записи 492 execute может передать только один аргумент, чтоб передать несколько, создавайте структуру потом поля структуры в шаблон ставятся так {{.count}} {{range .list}} {{end}} html, err := template.ParseFiles("index.html") data := myStruct{ name : "aaaa" } err := html.Execute(os.Stdout, data) 498 ввод данных в формах func createHandler(writer http.ResponseWriter, request *http.Request) { text := request.FormValue("inputName") _, err := writer.Write([]byte(text) } переписать код с 504 func createHandler(writer http.ResponseWriter, request *http.Request) { singature := request.FormValue("singature") options := os.O_WRONLY | os.O_APPEND | os.O_CREATE file, err := os.OpenFile("singatures.txt", options, os.FileMode(0600)) checkErr(err) _, err = fmt.Frintln(file, singature) checkErr(err) err = file.Close() checkErr(err) } при отправку данных на отдельной странице принимаем их, после делаем редирект 302 http.Redirect(writer, request, "/books", http.StatusFond) Переписать весь код 508 и 509 открыть файл go doc os OpenFile go doc os O_RDONLY func main() { file, err := os.OpenFile("file.txt", os.O_WRONLY, os.FileMode(0600)) checkErr(err) _, err = file.Write([]byte("text1\n")) checkErr(err) err = file.Close() checkErr(err) os.O_WRONLY переписать часть файла os.O_APPEND дописать в конце файла для просмотра двоичного представления данных fmt.Printf("%3d: %08b\n", 7, 7) побитовые операторы & | fmt.Printf("true && false == %t\n", true && false) fmt.Printf("%b & %b == %b\n", 0, 1, 0&1) fmt.Printf("%08b\n", 170) fmt.Printf("%08b\n", 15) fmt.Printf("%08b\n", 170&15) fmt.Println( os.O_RDONLY, os.O_WRONLY, os.O_RDWR, os.O_CREATE, os.O_APPEND ) они все инт 0,1,2,64,1024 fmt.Printf("%016b\n", os.O_CREATE|os.O_APPEND) надо использовать константы а не int, права и доступы 0 нет разрешений 1 исполнение 2 запись 3 запись и исполнение 4 чтение 5 чтение исполнение 6 запись и чтение 7 запись чтение исполнение - файл d каталог это в начале прав узнать какие права fileInfo, err := os.Stat("dir") checkErr(err) fmt.Println(fileInfo.Mode()) drwxr-xr-x для логов os.O_WRONLY | os.O_APPEND | os.O_CREATE можно проще os.Open os.Create они проще, чем os.OpenFile 530