GoCasts آموزش Go به زبان ساده

بیش از ۱۰۰۰ شرکت‌کننده یادگیری Go و Backend رو از امروز شروع کن
ثبت‌نام دوره + تیم‌سازی

گولنگ در مقابل C# - مقایسه Go و C#

C# زبان اصلی اکوسیستم مایکروسافت است و Go (گولنگ) محبوب‌ترین زبان Cloud-native. در این مقاله، گولنگ و C# را از جنبه‌های مختلف مقایسه می‌کنیم.

نگاه کلی

ویژگی Go C#
سال معرفی 2009 2000
طراح Google Microsoft
نوع کامپایلی (Native) کامپایلی (CLR/Native)
پارادایم Procedural + Concurrent Object-Oriented
کاربرد اصلی Cloud، DevOps، Microservices Enterprise، Games، Windows

تاریخچه و فلسفه

C# - قدرت مایکروسافت

C# در سال ۲۰۰۰ توسط Anders Hejlsberg (طراح Turbo Pascal و TypeScript) ساخته شد. هدف: زبانی شبیه Java ولی بهتر، برای اکوسیستم Windows.

تحول بزرگ: .NET Core (2016) و .NET 5+ زبان را cross-platform کرد.

Go - سادگی Google

Go توسط Rob Pike، Ken Thompson و Robert Griesemer در Google ساخته شد. هدف: حل مشکلات مقیاس‌پذیری در سیستم‌های بزرگ با سادگی.

سینتکس و خوانایی

C# - شیءگرا و قدرتمند

using System;
using System.Collections.Generic;
using System.Linq;

namespace MyApp
{
    public class User
    {
        public string Name { get; set; }
        public int Age { get; set; }

        public string Info() => $"{Name} - {Age} سال";
    }

    public class Program
    {
        public static void Main()
        {
            var users = new List<User>
            {
                new User { Name = "علی", Age = 25 },
                new User { Name = "سارا", Age = 30 }
            };

            // LINQ
            var adults = users.Where(u => u.Age >= 18)
                              .Select(u => u.Info());

            foreach (var info in adults)
            {
                Console.WriteLine(info);
            }
        }
    }
}

گولنگ - ساده و صریح

package main

import "fmt"

type User struct {
    Name string
    Age  int
}

func (u User) Info() string {
    return fmt.Sprintf("%s - %d سال", u.Name, u.Age)
}

func main() {
    users := []User{
        {Name: "علی", Age: 25},
        {Name: "سارا", Age: 30},
    }

    // Filter manually (Go is explicit)
    for _, u := range users {
        if u.Age >= 18 {
            fmt.Println(u.Info())
        }
    }
}

مقایسه:

  • C#: LINQ قدرتمند، سینتکس غنی، OOP کامل
  • گولنگ: سادگی، بدون magic، کد صریح

ویژگی‌های زبان

C# - زبان غنی

// Async/Await
async Task<string> FetchDataAsync()
{
    using var client = new HttpClient();
    return await client.GetStringAsync("https://api.example.com");
}

// Pattern Matching (C# 11)
string Describe(object obj) => obj switch
{
    int n when n > 0 => "Positive",
    int n when n < 0 => "Negative",
    string s => $"String: {s}",
    null => "Null",
    _ => "Unknown"
};

// Records (Immutable types)
public record Person(string Name, int Age);

// Nullable reference types
string? nullableName = null;

// Extension methods
public static class StringExtensions
{
    public static bool IsNullOrEmpty(this string? s)
        => string.IsNullOrEmpty(s);
}

Go - زبان کوچک و متمرکز

// Goroutines برای async
func fetchData() (string, error) {
    resp, err := http.Get("https://api.example.com")
    if err != nil {
        return "", err
    }
    defer resp.Body.Close()

    body, err := io.ReadAll(resp.Body)
    return string(body), err
}

// Type switch (مشابه pattern matching)
func describe(v interface{}) string {
    switch x := v.(type) {
    case int:
        if x > 0 {
            return "Positive"
        }
        return "Non-positive"
    case string:
        return "String: " + x
    case nil:
        return "Nil"
    default:
        return "Unknown"
    }
}

// Generics (از Go 1.18)
func Filter[T any](slice []T, predicate func(T) bool) []T {
    var result []T
    for _, v := range slice {
        if predicate(v) {
            result = append(result, v)
        }
    }
    return result
}

مقایسه ویژگی‌ها

ویژگی C# گولنگ
Generics عالی پایه (از 1.18)
LINQ
Async/Await Goroutines
Pattern Matching عالی محدود
Inheritance ❌ (Composition)
Interfaces Explicit Implicit
Nullable Types ❌ (zero values)
Properties ❌ (fields + methods)

سرعت اجرا

بنچمارک مقایسه‌ای

تست گولنگ C# (.NET 8)
JSON Serialization ~80K req/s ~75K req/s
HTTP Hello World ~100K req/s ~95K req/s
Database Query ~60K req/s ~55K req/s
Startup Time <10ms 50-100ms
Memory (Hello API) 10 MB 50-80 MB

توجه: .NET 8 بسیار بهینه شده و در بسیاری از سناریوها با گولنگ رقابت می‌کند. منبع: TechEmpower Benchmarks

تحلیل سرعت

گولنگ سریع‌تر است در:

  • Startup time (بدون runtime)
  • Memory usage
  • Cold start در serverless

C# رقابتی است (یا گاهی سریع‌تر) در:

  • JIT optimizations در long-running apps
  • SIMD و vectorization
  • ASP.NET Core بسیار بهینه شده
  • Throughput در برنامه‌های پیچیده

برنده سرعت: تقریباً برابر - گولنگ در startup/memory، C# در throughput پیچیده

همزمانی (Concurrency)

گولنگ - Goroutines

package main

import (
    "fmt"
    "sync"
)

func worker(id int, jobs <-chan int, results chan<- int) {
    for j := range jobs {
        results <- j * 2
    }
}

func main() {
    jobs := make(chan int, 100)
    results := make(chan int, 100)

    // Start 10 workers
    for w := 1; w <= 10; w++ {
        go worker(w, jobs, results)
    }

    // Send 50 jobs
    go func() {
        for j := 1; j <= 50; j++ {
            jobs <- j
        }
        close(jobs)
    }()

    // Collect results
    for a := 1; a <= 50; a++ {
        fmt.Println(<-results)
    }
}

C# - async/await و Tasks

using System;
using System.Linq;
using System.Threading.Channels;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        var jobs = Channel.CreateBounded<int>(100);
        var results = Channel.CreateBounded<int>(100);

        // Start 10 workers
        var workers = Enumerable.Range(1, 10)
            .Select(_ => Worker(jobs.Reader, results.Writer))
            .ToArray();

        // Send 50 jobs
        var producer = Task.Run(async () =>
        {
            for (int j = 1; j <= 50; j++)
            {
                await jobs.Writer.WriteAsync(j);
            }
            jobs.Writer.Complete();
        });

        // Wait and collect
        await producer;
        await Task.WhenAll(workers);
        results.Writer.Complete();

        await foreach (var result in results.Reader.ReadAllAsync())
        {
            Console.WriteLine(result);
        }
    }

    static async Task Worker(ChannelReader<int> jobs, ChannelWriter<int> results)
    {
        await foreach (var job in jobs.ReadAllAsync())
        {
            await results.WriteAsync(job * 2);
        }
    }
}

مقایسه

ویژگی گولنگ C#
سینتکس go func() Task.Run()
Channels ✅ داخلی System.Threading.Channels
سادگی بیشتر کمتر
کنترل کمتر بیشتر
Async I/O Goroutines async/await

برنده همزمانی: گولنگ - ساده‌تر و طبیعی‌تر

اکوسیستم

C# - غنی و Enterprise

فریمورک‌ها:

  • ASP.NET Core: Web API و MVC
  • Blazor: Web UI با C#
  • MAUI: Cross-platform mobile/desktop
  • WPF/WinForms: Windows desktop

Gaming:

  • Unity: موتور بازی‌سازی شماره ۱

Cloud:

  • Azure Functions
  • Azure SDK

ابزارها:

  • Visual Studio: بهترین IDE
  • Entity Framework: ORM قدرتمند
  • NuGet: Package manager

گولنگ - تخصصی و Cloud-native

فریمورک‌ها:

  • Gin, Echo, Fiber: Web frameworks
  • gRPC: RPC پرسرعت

DevOps/Cloud:

  • Docker
  • Kubernetes
  • Terraform
  • Prometheus

ابزارها:

  • VS Code + Go extension
  • GORM, sqlx: Database
  • Cobra: CLI tools

شرکت‌های استفاده‌کننده

C#:

  • Microsoft (Azure، Office)
  • Stack Overflow
  • Unity games
  • بانک‌ها و Enterprise

گولنگ:

  • Google
  • Uber
  • Twitch
  • Docker
  • Kubernetes

برنده اکوسیستم:

  • C# برای Enterprise و Gaming
  • گولنگ برای Cloud و DevOps

Cross-Platform

C# با .NET 8

# Build for different platforms
dotnet publish -r linux-x64
dotnet publish -r osx-arm64
dotnet publish -r win-x64

# Self-contained (بدون نیاز به runtime)
dotnet publish -r linux-x64 --self-contained

# Native AOT (جدید - مشابه Go)
dotnet publish -r linux-x64 -p:PublishAot=true

Go

# Build for different platforms
GOOS=linux GOARCH=amd64 go build -o app-linux
GOOS=darwin GOARCH=arm64 go build -o app-mac
GOOS=windows GOARCH=amd64 go build -o app.exe

# همیشه self-contained!

مقایسه Deployment

معیار گولنگ C# (Framework-dependent) C# (AOT)
Binary Size 10-20 MB 5 MB + Runtime 30-100 MB
Runtime نیاز
Startup <10ms 50-100ms <50ms
Cross-compile بسیار آسان آسان آسان

برنده Deployment: گولنگ (کمی) - ولی .NET AOT رقابتی است

بازار کار

آمار جهانی (2024)

معیار گولنگ C#
استفاده 14% 28%
میانگین حقوق (US) $125,000-135,000 $100,000-115,000
تعداد شغل متوسط بسیار زیاد
رشد بالا متوسط

بازار کار ایران

C#:

  • فرصت‌های فراوان
  • شرکت‌های Enterprise
  • بانک‌ها و سازمان‌ها
  • بازی‌سازی (Unity)

گولنگ:

  • استارتاپ‌های فناوری
  • شرکت‌های Cloud-native
  • حقوق بالاتر
  • رقابت کمتر

موارد استفاده

گولنگ بهترین انتخاب است برای:

میکروسرویس‌ها - Kubernetes، Docker

API‌های پرترافیک - عملکرد بالا

DevOps Tools - CLI، automation

Cloud-Native - AWS، GCP، Azure

Real-time Systems - WebSocket، streaming

C# بهترین انتخاب است برای:

Enterprise Applications - ERP، CRM

Game Development - Unity

Windows Development - Desktop، Services

Full-stack .NET - Blazor، MAUI

Azure Integration - Functions، Services

مقایسه کد: REST API

C# با ASP.NET Core

using Microsoft.AspNetCore.Mvc;

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

var users = new List<User>
{
    new(1, "علی", "ali@example.com")
};

app.MapGet("/users", () => users);

app.MapGet("/users/{id}", (int id) =>
    users.FirstOrDefault(u => u.Id == id) is User user
        ? Results.Ok(user)
        : Results.NotFound());

app.MapPost("/users", (User user) =>
{
    var newUser = user with { Id = users.Count + 1 };
    users.Add(newUser);
    return Results.Created($"/users/{newUser.Id}", newUser);
});

app.Run();

record User(int Id, string Name, string Email);

Go با Gin

package main

import (
    "net/http"
    "strconv"
    "github.com/gin-gonic/gin"
)

type User struct {
    ID    int    `json:"id"`
    Name  string `json:"name"`
    Email string `json:"email"`
}

var users = []User{
    {ID: 1, Name: "علی", Email: "ali@example.com"},
}

func main() {
    r := gin.Default()

    r.GET("/users", func(c *gin.Context) {
        c.JSON(http.StatusOK, users)
    })

    r.GET("/users/:id", func(c *gin.Context) {
        id, _ := strconv.Atoi(c.Param("id"))
        for _, u := range users {
            if u.ID == id {
                c.JSON(http.StatusOK, u)
                return
            }
        }
        c.JSON(http.StatusNotFound, gin.H{"error": "Not found"})
    })

    r.POST("/users", func(c *gin.Context) {
        var user User
        if err := c.ShouldBindJSON(&user); err != nil {
            c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
            return
        }
        user.ID = len(users) + 1
        users = append(users, user)
        c.JSON(http.StatusCreated, user)
    })

    r.Run(":8080")
}

مقایسه:

  • C#: کد کمتر، Minimal APIs، Records
  • گولنگ: سینتکس ساده‌تر، error handling صریح

جدول تصمیم‌گیری

گولنگ را انتخاب کنید اگر:

شرط  
Cloud-native می‌سازید
به عملکرد بالا نیاز دارید
DevOps tools می‌سازید
از پیچیدگی خسته شدید
روی Linux deploy می‌کنید
Kubernetes استفاده می‌کنید

C# را انتخاب کنید اگر:

شرط  
Enterprise می‌سازید
بازی با Unity می‌سازید
Windows development دارید
Azure استفاده می‌کنید
تیم .NET دارید
Full-stack با Blazor می‌خواهید

مهاجرت از C# به گولنگ

شباهت‌ها (آسان)

  • هر دو Statically typed
  • Struct‌ها مشابه
  • Interface‌ها (با تفاوت)

تفاوت‌ها (نیاز به یادگیری)

  • بدون Inheritance → Composition
  • بدون Exceptions → Error returns
  • بدون LINQ → Manual loops یا Generics
  • Implicit interfaces در گولنگ

نکات مهاجرت

  1. با یک سرویس کوچک شروع کنید
  2. از Gin استفاده کنید - مشابه ASP.NET
  3. Error handling یاد بگیرید - مهم!
  4. Goroutines را درک کنید - متفاوت از async/await

نتیجه‌گیری

جنبه برنده
سادگی گولنگ
ویژگی‌های زبان C#
سرعت تقریباً برابر
همزمانی ساده گولنگ
اکوسیستم Enterprise C#
اکوسیستم Cloud گولنگ
Gaming C#
DevOps گولنگ
بازار کار (تعداد) C#
بازار کار (رشد) گولنگ

خلاصه:

  • گولنگ: برای Cloud-native، میکروسرویس‌ها و DevOps
  • C#: برای Enterprise، Gaming و اکوسیستم مایکروسافت

هر دو زبان عالی و مدرن هستند. انتخاب به نیازهای پروژه و تیم شما بستگی دارد.


شروع یادگیری Go

مقایسه‌های مرتبط

منابع

بیش از ۱۰۰۰ شرکت‌کننده یادگیری Go و Backend رو از امروز شروع کن
ثبت‌نام دوره + تیم‌سازی