<link rel="stylesheet" href="/static/style.css"/>
<img src="/static/sob2.jpg" />
// добавьте эти строки
fs := http.FileServer(http.Dir("./static"))
http.Handle("/static/", http.StripPrefix("/static/", fs))
// перед этой строкой
http.HandleFunc("/", viewHandler)
server {
listen *:80;
server_name localhost;
# root /тут_путь_к_вашей_папке/static;
# для Windows будет что-то типа такого
root D:/GoExam/static;
location / {
try_files $uri @process;
}
location @process {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_send_timeout 30;
proxy_read_timeout 30;
}
}
http {
# тут идут настройки Nginx
....
# тут дописываете код, что я выше написал, грубо перед закрывающей "}"
}
db1, err := sql.Open("mysql", DSN1) // Сначала к одной БД подключение.
db2, err := sql.Open("mysql", DSN2) // Ниже к другой БД подключение.
// настраиваете пулы как вам нужно
db1.SetMaxIdleConns(10)
db1.SetMaxOpenConns(100)
db2.SetMaxIdleConns(10)
db2.SetMaxOpenConns(100)
package main
import (
"database/sql"
"log"
_ "github.com/go-sql-driver/mysql"
)
func main() {
db1, err := sql.Open("mysql", `user1:password1@/dbname1`) // Сначала к одной БД подключение.
if err != nil {
log.Fatal(err)
}
db2, err := sql.Open("mysql", `user2:password2@/dbname2`) // Ниже к другой БД подключение.
if err != nil {
log.Fatal(err)
}
// настраиваете пулы как вам нужно
db1.SetMaxIdleConns(10)
db1.SetMaxOpenConns(100)
db2.SetMaxIdleConns(10)
db2.SetMaxOpenConns(100)
}
как сервер за столь короткое время умеет прошерстить базу данных, найти сообщения конкретного пользователя и отдать их
type Event struct {
EventID int `json:"eventId"`
Type string `json:"type"`
....
}
// канал создаёте вот так, т.к. вы хотите по одному событию передавать данные, а не целыми слайсами сразу
EventsCh = make(chan Event, 100)
go mailing(EventsCh)
// делаете HTTP запрос
response, responseErr := http.PostForm(...)
// создаёте decoder
decoder := json.NewDecoder(response.Body)
for {
event := Event{}
decoderErr := decoder.Decode(&event) // если данных нет - тут выполнение программы блокируется
if decodeErr != nil { // тут может быть ошибка io.EOF (просто данные закончились, сервер корректно закрыл соединение)
break
}
EventsCh <- event // отправляете данные в канал, из которого их читает горутина
}
func mailing(eventsCh chan Event){ //Получает события из канала
for{
event, ok := <- eventsChan
if !ok {
// канал закрыт
break
}
log.Print("Получено ", event)
}
}
// AddUserRequest структура с параметрами запроса.
type AddUserRequest struct {
Name string `json:"name"`
Login string `json:"login"`
Password string `json:"password"`
}
func AddUserHandlerFunc(w http.ResponseWriter, r *http.Request) {
var req AddUserRequest
err := json.NewDecoder(r.Body).Decode(&req);
if err != nil {
/// ....
}
// тут у вас будет заполненная структура req
}
{
"name": "Иван",
"login": "Ivan",
"password": "123"
}
type twoValue struct {
x int
y int
expected int
}
var tests = []twoValue{
{ 1,2, 1 },
{ 2,1, 2 },
{ 2,2, 0 },
}
func TestQuestion(t *testing.T) {
for _, value := range tests {
res := Question(value.x, value.y)
if res != value.expected {
t.Errorf("при сравнении %v с %v получили, %v, а должно быть %v", value.x, value.y, res, value.expected)
}
}
}
import "time"
rate := time.Second / 10
throttle := time.Tick(rate)
for req := range requests {
<-throttle // rate limit our Service.Method RPCs
go client.Call("Service.Method", req, ...)
}
import "time"
rate := time.Second / 10
burstLimit := 100
tick := time.NewTicker(rate)
defer tick.Stop()
throttle := make(chan time.Time, burstLimit)
go func() {
for t := range tick.C {
select {
case throttle <- t:
default:
}
} // does not exit after tick.Stop()
}()
for req := range requests {
<-throttle // rate limit our Service.Method RPCs
go client.Call("Service.Method", req, ...)
}
tx.Begin()
for {
DB.Create
}
tx.Commit()
netstat -n|grep -i postmaster
tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN 2414/postmaster
psql -h 127.0.0.1 -p 5432