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