package main
import (
"fmt"
"net/http"
)
func helloHandler(w http.ResponseWriter, req *http.Request) {
fmt.Fprintf(w, "hello\n")
}
func main() {
http.HandleFunc("/hello", helloHandler)
http.ListenAndServe(":8081", nil)
}
const req = new XMLHttpRequest();
const url='http://127.0.0.1:8081/hello';
req.open("GET", url);
req.send();
req.onreadystatechange=(e)=>{
console.log(req.responseText)
}
func MainPage((w http.ResponseWriter, req *http.Request) {
//**код
var := func Random(struct) struct {}
.ExecuteTemplate(w, "main", var)
}
// а получится так?
func helloHandler(w http.ResponseWriter, req *http.Request) {
func Random(struct) struct {} // не передать аргументом и не вернуть результат в функцию MainPage
}
<input type="button" onClick="return myHandler()" />
<script>
function myHandler() {
// тут делаете всё, что вам нужно
return false;
}
</script>
http://127.0.0.1:8081/hello?param1=value1¶m2=value2
func helloHandler(w http.ResponseWriter, req *http.Request) {
param1 := r.URL.Query().Get(`param1`)
fmt.Fprintf(w, "hello: %s\n", param1)
}
func MainPage(w http.ResponseWriter, r *http.Request) {
m, _ := template.ParseFiles("html/main.html", "html/header.html", "html/footer.html")
res, err := database.Query(fmt.Sprintf("SELECT * FROM `words` WHERE freq > 0"))
if err != nil {
panic(err)
}
defer res.Close()
wordsarray := []WordsStruct{}
for res.Next() {
var sw WordsStruct
err := res.Scan(&sw.Id, &sw.Fword, &sw.Sword, &sw.Freq)
if err != nil {
fmt.Println(err)
continue
}
wordsarray = append(wordsarray, sw)
}
show := Next(wordsarray)
m.ExecuteTemplate(w, "main", show)
//m.ExecuteTemplate(w, "main", Next(wordsarray))
}
func Next(st []WordsStruct) WordsStruct {
rand.Seed(time.Now().Unix())
shw := st[rand.Intn(len(st))]
return shw
}
package main
import (
"database/sql"
"fmt"
"html/template"
//"log"
_ "github.com/go-sql-driver/mysql"
"github.com/gorilla/mux"
"math/rand"
"net/http"
"time"
)
type WordsStruct struct { // выгрузка БД
Id int
Fword string
Sword string
Freq int
}
var database *sql.DB
// глобальные переменные - это плохо, с ними будет трудно работать в будущем,
// особенно при покрытии кода тестами
// но сейчас мы её используем, чтобы не усложнять код.
var words []WordsStruct
// LoadWords вычитывает все данные из таблицы words
func LoadWords() ([]WordsStruct, error) {
res, err := database.Query(fmt.Sprintf("SELECT * FROM `words`"))
if err != nil {
return nil, err
}
defer res.Close()
wordsarray := []WordsStruct{}
for res.Next() {
var sw WordsStruct
err := res.Scan(&sw.Id, &sw.Fword, &sw.Sword, &sw.Freq)
if err != nil {
fmt.Println(err)
continue
}
wordsarray = append(wordsarray, sw)
}
return wordsarray, nil
}
func MainPage(w http.ResponseWriter, r *http.Request) {
m, _ := template.ParseFiles("html/main.html", "html/header.html", "html/footer.html")
// берём данные из глобальной переменной words,
// которая уже хранит вычитанные данные из базы
show := Next(words)
m.ExecuteTemplate(w, "main", show)
}
func Next(st []WordsStruct) WordsStruct {
shw := st[rand.Intn(len(st))]
return shw
}
func List(w http.ResponseWriter, r *http.Request) {
m, _ := template.ParseFiles("html/list.html", "html/header.html", "html/footer.html")
// берём данные из глобальной переменной words,
// которая уже хранит вычитанные данные из базы
m.ExecuteTemplate(w, "list", words)
}
func AddWords(w http.ResponseWriter, r *http.Request) {
// тут вы пишите новое слово в базу
// после записи в базу нужно будет перечитать данные заново (простой вариант)
// или модифицировать структуру (правильный вариант, т.к. снижает нагрузку на базу)
// пойдём простым путём
words, err = LoadWords()
if err != nil {
// ответ об ошибке
return
}
// ответ когда все хорошо
}
// *****************************************************************************************************************************************************************
func StartFunc() {
rtr := mux.NewRouter()
http.Handle("/", rtr)
http.Handle("/css/", http.StripPrefix("/css/", http.FileServer(http.Dir("./css/"))))
http.Handle("/js/", http.StripPrefix("/js/", http.FileServer(http.Dir("./js/"))))
http.Handle("/html/", http.StripPrefix("/html/", http.FileServer(http.Dir("./html/"))))
rtr.HandleFunc("/", MainPage)
rtr.HandleFunc("/list", List)
rtr.HandleFunc("/addwords", AddWords).Methods("POST")
http.ListenAndServe(":5500", nil)
}
func main() {
// лучше вызывать rand.Seed один раз при запуске, а не каждый раз,
// иначе можно будет просчитать результат.
rand.Seed(time.Now().Unix())
db, err := sql.Open("mysql", "root:@tcp(127.0.0.1:3306)/wordcard")
if err != nil {
//log.Println(err)
panic(err)
}
database = db
defer db.Close()
// вычитываем данные из базы и сохраняем их в структуру,
// чтобы потом могли их использовать в ответе
words, err = LoadWords()
if err != nil {
panic(err)
}
StartFunc()
}
db.Query(fmt.Sprintf("INSERT INTO `words` (`firstword`, `secondword`, `freq`) VALUES ('%s', '%s', '%d')", firstWord, secondWord, frequens))
db.Exec("INSERT INTO `words` (`firstword`, `secondword`, `freq`) VALUES (?, ?, ?)", firstWord, secondWord, frequens))
func main () {
// код
words, err = LoadWords()
if err != nil {
panic(err)
}
}
package main
import (
"database/sql"
"fmt"
"html/template"
_ "github.com/go-sql-driver/mysql"
"github.com/gorilla/mux"
"math/rand"
"net/http"
"time"
)
type WordsStruct struct { // выгрузка БД
Id int
Fword string
Sword string
Freq int
}
var database *sql.DB
// глобальные переменные - это плохо, с ними будет трудно работать в будущем,
// особенно при покрытии кода тестами
// но сейчас мы её используем, чтобы не усложнять код.
var words []WordsStruct
var err error
// LoadWords вычитывает все данные из таблицы words
func LoadWords() ([]WordsStruct, error) {
res, err := database.Query(fmt.Sprintf("SELECT * FROM `words`"))
if err != nil {
return nil, err
}
defer res.Close()
wordsarray := []WordsStruct{}
for res.Next() {
var sw WordsStruct
err := res.Scan(&sw.Id, &sw.Fword, &sw.Sword, &sw.Freq)
if err != nil {
fmt.Println(err)
continue
}
wordsarray = append(wordsarray, sw)
}
return wordsarray, nil
}
func MainPage(w http.ResponseWriter, r *http.Request) {
m, _ := template.ParseFiles("html/main.html", "html/header.html", "html/footer.html")
// берём данные из глобальной переменной words,
// которая уже хранит вычитанные данные из базы
show := Next(words)
m.ExecuteTemplate(w, "main", show)
}
func Next(st []WordsStruct) WordsStruct {
shw := st[rand.Intn(len(st))]
return shw
}
func List(w http.ResponseWriter, r *http.Request) {
m, _ := template.ParseFiles("html/list.html", "html/header.html", "html/footer.html")
// берём данные из глобальной переменной words,
// которая уже хранит вычитанные данные из базы
m.ExecuteTemplate(w, "list", words)
}
func AddWords(w http.ResponseWriter, r *http.Request) {
// тут вы пишите новое слово в базу
// после записи в базу нужно будет перечитать данные заново (простой вариант)
// или модифицировать структуру (правильный вариант, т.к. снижает нагрузку на базу)
// пойдём простым путём
words, err = LoadWords()
if err != nil {
// ответ об ошибке
return
}
// ответ когда все хорошо
}
// *****************************************************************************************************************************************************************
func StartFunc() {
rtr := mux.NewRouter()
http.Handle("/", rtr)
http.Handle("/css/", http.StripPrefix("/css/", http.FileServer(http.Dir("./css/"))))
http.Handle("/js/", http.StripPrefix("/js/", http.FileServer(http.Dir("./js/"))))
http.Handle("/html/", http.StripPrefix("/html/", http.FileServer(http.Dir("./html/"))))
rtr.HandleFunc("/", MainPage)
rtr.HandleFunc("/list", List)
rtr.HandleFunc("/addwords", AddWords).Methods("POST")
http.ListenAndServe(":5500", nil)
}
func main() {
// лучше вызывать rand.Seed один раз при запуске, а не каждый раз,
// иначе можно будет просчитать результат.
rand.Seed(time.Now().Unix())
db, err := sql.Open("mysql", "root:@tcp(127.0.0.1:3306)/wordcard")
if err != nil {
//log.Println(err)
panic(err)
}
database = db
defer db.Close()
// вычитываем данные из базы и сохраняем их в структуру,
// чтобы потом могли их использовать в ответе
words, err = LoadWords()
if err != nil {
panic(err)
}
StartFunc()
}