# Κατεβάστε Go 1.23+: https://go.dev/dl/
go version # πρέπει να είναι go1.23.4
mkdir go-api-2025 && cd go-api-2025
go mod init github.com/kullanicin/go-api-2025
go get github.com/gofiber/fiber/v2
go get github.com/golang-jwt/jwt/v5
go get gorm.io/gorm
go get gorm.io/driver/postgres
go get github.com/joho/godotenvgo-api-2025/
|-- cmd/
| |-- api/
| |-- main.go
|-- internal/
| |-- handlers/
| |-- middleware/
| |-- models/
| |-- routes/
|-- database/
|-- pkg/
| |-- go.mod
|-- Dockerfile
|-- .env// cmd/api/main.go
package main
import (
"log"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/cors"
"github.com/kullanicin/go-api-2025/internal/routes"
"github.com/joho/godotenv"
)
func main() {
godotenv.Load()
app := fiber.New(fiber.Config{
Prefork: false, // στην παραγωγή κάντε true
CaseSensitive: true,
StrictRouting: true,
ServerHeader: "GoAPI2025",
})
// CORS
app.Use(cors.New(cors.Config{
AllowOrigins: "*",
AllowHeaders: "Origin, Content-Type, Accept, Authorization",
AllowMethods: "GET,POST,PUT,DELETE",
}))
// Routes
routes.SetupRoutes(app)
log.Fatal(app.Listen(":3000"))
}// internal/models/user.go
package models
import "gorm.io/gorm"
type User struct {
gorm.Model
Name string `json:"name" gorm:"size:255"`
Email string `json:"email" gorm:"unique;size:255"`
Password string `json:"-" gorm:"size:255"`
IsAdmin bool `json:"is_admin" gorm:"default:false"`
}// internal/middleware/auth.go
package middleware
import (
"strings"
"github.com/gofiber/fiber/v2"
"github.com/golang-jwt/jwt/v5"
)
func AuthRequired() fiber.Handler {
return func(c *fiber.Ctx) error {
authHeader := c.Get("Authorization")
if !strings.HasPrefix(authHeader, "Bearer ") {
return c.Status(401).JSON(fiber.Map{"error": "Μη εξουσιοδοτημένη πρόσβαση"})
}
tokenStr := strings.Split(authHeader, " ")[1]
token, err := jwt.Parse(tokenStr, func(token *jwt.Token) (interface{}, error) {
return []byte("super-secret-key-2025"), nil
})
if err != nil || !token.Valid {
return c.Status(401).JSON(fiber.Map{"error": "Άκυρο token"})
}
claims := token.Claims.(jwt.MapClaims)
c.Locals("userId", claims["id"])
c.Locals("isAdmin", claims["isAdmin"])
return c.Next()
}
}// internal/handlers/auth.go
package handlers
import (
"time"
"github.com/gofiber/fiber/v2"
"golang.org/x/crypto/bcrypt"
"github.com/golang-jwt/jwt/v5"
"github.com/kullanicin/go-api-2025/internal/models"
"gorm.io/gorm"
)
var db *gorm.DB
func InitDB(database *gorm.DB) {
db = database
}
func Login(c *fiber.Ctx) error {
type LoginRequest struct {
Email string `json:"email"`
Password string `json:"password"`
}
var req LoginRequest
if err := c.BodyParser(&req); err != nil {
return c.Status(400).JSON(fiber.Map{"error": "Άκυρα δεδομένα"})
}
var user models.User
if err := db.Where("email = ?", req.Email).First(&user).Error; err != nil {
return c.Status(401).JSON(fiber.Map{"error": "Ο χρήστης δεν βρέθηκε"})
}
if err := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(req.Password)); err != nil {
return c.Status(401).JSON(fiber.Map{"error": "Λάθος κωδικός"})
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
"id": user.ID,
"isAdmin": user.IsAdmin,
"exp": time.Now().Add(time.Hour * 24 * 30).Unix(),
})
tokenString, _ := token.SignedString([]byte("super-secret-key-2025"))
return c.JSON(fiber.Map{
"message": "Επιτυχής είσοδος",
"token": tokenString,
"user": user,
})
}# Dockerfile
FROM golang:1.23-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o main ./cmd/api
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /app/main .
EXPOSE 3000
CMD ["./main"]k6 run script.js
# Αποτέλεσμα: 120.000+ req/s (1 CPU)dotnet new webapp -o MyIdentityApp
cd MyIdentityAppdotnet add package Microsoft.AspNetCore.Identity.EntityFrameworkCoreusing Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
namespace MyIdentityApp.Data
{
public class ApplicationDbContext : IdentityDbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
}
}var builder = WebApplication.CreateBuilder(args);
// Προσθήκη υπηρεσιών Identity
builder.Services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));
builder.Services.AddIdentity<IdentityUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
// Ρύθμιση Razor Pages
builder.Services.AddRazorPages();
var app = builder.Build();
// Middleware
app.UseAuthentication();
app.UseAuthorization();
app.MapRazorPages();
app.Run();{
"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=MyIdentityDb;Trusted_Connection=True;MultipleActiveResultSets=true"
}
}dotnet add package Microsoft.EntityFrameworkCore.Design
dotnet ef migrations add CreateIdentitySchema
dotnet ef database updatedotnet aspnet-codegenerator identity -dc MyIdentityApp.Data.ApplicationDbContextusing Microsoft.AspNetCore.Identity;
namespace MyIdentityApp.Models
{
public class ApplicationUser : IdentityUser
{
public string FullName { get; set; }
}
}// ApplicationDbContext.cs
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
// ...
}
// Program.cs
builder.Services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();<?php
$αριθμός = 10;
echo $αριθμός; // Εμφανίζει: 10
?><?php
$αριθμός = 5;
$αριθμός += 3; // $αριθμός γίνεται 8
echo $αριθμός; // Εμφανίζει: 8
?><?php
$αριθμός = 10;
$αριθμός -= 4; // $αριθμός γίνεται 6
echo $αριθμός; // Εμφανίζει: 6
?><?php
$αριθμός = 3;
$αριθμός *= 2; // $αριθμός γίνεται 6
echo $αριθμός; // Εμφανίζει: 6
?><?php
$αριθμός = 20;
$αριθμός /= 5; // $αριθμός γίνεται 4
echo $αριθμός; // Εμφανίζει: 4
?><?php
$αριθμός = 17;
$αριθμός %= 5; // $αριθμός γίνεται 2
echo $αριθμός; // Εμφανίζει: 2
?><?php
$κείμενο = "Γειά ";
$κείμενο .= "σου!"; // $κείμενο γίνεται "Γειά σου!"
echo $κείμενο; // Εμφανίζει: Γειά σου!
?><?php
$σύνολο = 100; // Αρχική τιμή
$σύνολο += 20; // Προσθέτουμε 20
$σύνολο -= 10; // Αφαιρούμε 10
$σύνολο *= 2; // Διπλασιάζουμε το αποτέλεσμα
echo "Το τελικό σύνολο είναι: " . $σύνολο; // Εμφανίζει: Το τελικό σύνολο είναι: 220
?>