<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>نوشته های سعید فراهانی</title><link>https://virgool.ir/feed/@svfnix</link><description></description><language>fa</language><pubDate>2026-11-11 07:03:45</pubDate><image><url>https://files.virgool.ir/upload/users/2895195/avatar/mfiGG1.jpg</url><title>سعید فراهانی</title><link>https://virgool.ir/@svfnix</link></image><item><title>ثابت ها (Constants) در زبان برنامه نویسی Go</title><link>https://virgool.ir/@svfnix/ثابت-ها-constants-در-زبان-برنامه-نویسی-go-vshgq6ixz0ur</link><description>ثابت (Constant) چیزی است که مقدار آن تغییر نمیکند. یک ثابت در  زبان برنامه نویسی Go می تواند از نوع رشته، عددی، بولی و کاراکتر باشد.یک ثابت را می توان با استفاده از کلمه کلیدی const اعلام کرد. نکته مهمی که باید به آن توجه داشت این است که مقدار باید در حین اعلام یک ثابت تخصیص داده شود. بر خلاف متغیرهایی است که می توان بعداً مقدار را به آن اختصاص داد.اعلام یک ثابت همراه با تعیین نوع: با یک کلمه کلیدی const شروع می شود، سپس نام و سپس نوع. مقدار نیز باید تخصیص داده شود:const c string = &#34;circle&#34;اعلام یک ثابت بدون تعیین نوع: یک ثابت تعریف شده بدون اینکه نوع آن مشخص شود، یک ثابت بدون نوع (untyped) است. در ادامه بیشتر با ثابت دارای نوع و بدون نوع آشنا خواهیم شد. در حال حاضر، مهم است بدانید که ثابت بدون نوع اعلام شده دارای یک نوع پنهان پیش فرض است. زمانی که به هر طریقی به متغیری اختصاص داده شود، با توجه به مقدار آن یک نوع داده به آن اختصاص می یابد (مقدار دهی اولیه مستقیم، ارسال به یک تابع و غیره).const c = &#34;circle&#34;اعلان چند ثابت با هم:const (&#xA;   c = &#34;circle&#34;&#xA;   s = &#34;square&#34;&#xA;)نکات مهمیک ثابت پس از اعلان، مجددا قابل تخصیص نیست. به عنوان مثال کد زیر یک خطای کامپایل ایجاد می کندpackage main&#xA;func main() {&#xA;    const a int = 8&#xA;    a = 9&#xA;}خطا:main.go:5:4: cannot assign to aمقدار ثابت باید در زمان کامپایل حتما مشخص باشد. بنابراین نمی توان به یک ثابت، یک مقدار حاصل از فراخوانی تابع (که در زمان اجرا ارزیابی می شود) را اختصاص داد. همانطور که در برنامه زیر a یک ثابت است و مقدار آن باید در زمان کامپایل در دسترس باشد، اما تابع getValue فقط در زمان اجرا فراخوانی می‌شود، بنابراین در حین کامپایل خطا ایجاد می‌کند.package main&#xA;const name = &#34;test&#34;&#xA;func main() {&#xA;    const a = getValue()&#xA;}&#xA;func getValue() int {&#xA;    return 1&#xA;}خطا:const initializer getValue() is not a constantیک ثابت اعلام شده در یک محدوده (scope) داخلی که نامی مشابه با ثابت اعلام شده در محدوده بیرونی دارد، ثابت در محدوده بیرونی را تحت الشعاع قرار می دهد.package main&#xA;import &#34;fmt&#34;&#xA;const a = 123&#xA;func main() {&#xA;    const a = 456&#xA;    fmt.Println(a)&#xA;}خروجی:456ثابت های دارای نوع  (typed) و بدون نوع (untyped)در Go با ثابت ها به روشی متفاوت از هر زبان دیگری رفتار می شود. GO یک سیستم نوع بسیار قوی دارد که اجازه تبدیل ضمنی بین هیچ یک از انواع را نمی دهد. حتی با انواع عددی یکسان، هیچ عملیاتی بدون تبدیل صریح مجاز نیست. به عنوان مثال شما نمی توانید مقدار int32 و int64 را جمع (+) کنید. برای جمع کردن آن‌ها، باید int32 به طور صریح به int64 تبدیل شود یا برعکس. به هر حال ثابت های  بدون نوع دارای انعطاف پذیری موقت هستند که در این مقاله خواهیم دید.ثابت های دارای نوعیک ثابت که نوع آن در اعلان مشخص شده است یک ثابت دارای نوع است. به عنوان مثال در زیر ما یک ثابت از نوع int32 را اعلام می کنیمconst num int32 = 8ثابت num را فقط می توان به متغیری از نوع int32 نسبت داد. اگر آن را به متغیری از هر نوع دیگری اختصاص دهید، یک خطا ایجاد می کند. برای تصویر برنامه زیر را ببینید.package main&#xA;&#xA;func main() {&#xA;    const a int32 = 8&#xA;&#xA;    var i1 int32&#xA;    var i2 int64&#xA;&#xA;    i1 = a&#xA;    i2 = a&#xA;}خروجی:cannot use a (type int32) as type int64 in assignmentثابت های بدون نوعثابت بدون نوع ثابتی است که نوع آن مشخص نشده باشد. یک ثابت بدون نوع در GO می تواند با نام یا بدون نام باشد. در هر دو حالت هیچ نوع مرتبطی با آن وجود ندارد.نمونه هایی از ثابت بی نام و بدون نوع123        //Default hidden type is int&#xA;&#34;circle&#34;   //Default hidden type is string&#xA;5.6.       //Default hidden type is float64&#xA;true       //Default hidden type is bool&#xA;&#39;a&#39;        //Default hidden type is rune&#xA;3+5i       //Default hidden type is complex128نمونه هایی از ثابت دارای نام ولی بدون نوعconst a = 123        //Default hidden type is int&#xA;const b = &#34;circle&#34;   //Default hidden type is string&#xA;const c = 5.6       //Default hidden type is float64&#xA;const d = true       //Default hidden type is bool&#xA;const e = &#39;a&#39;        //Default hidden type is rune&#xA;const f = 3+5i       //Default hidden type is complex128ثابت بدون نوع، یک نوع پنهان پیش فرض دارد. به عنوان مثال جدول زیر انواع پیش فرض پنهان برای اعداد، رشته ها، کاراکترها و بولی را نشان می دهد.وقتی هر ثابت بدون نوع را با استفاده از fmt.Printf چاپ می کنید، نوع پنهان پیش فرض را چاپ می کند. برنامه و خروجی زیر را برای ثابت بی نام و بدون نام مشاهده کنید.package main&#xA;&#xA;import &#34;fmt&#34;&#xA;&#xA;func main() {&#xA;    //Unanamed untyped constant&#xA;    fmt.Printf(&#34;Type: %T Value: %v\n&#34;, 123, 123)&#xA;    fmt.Printf(&#34;Type: %T Value: %v\n&#34;, &#34;circle&#34;, &#34;circle&#34;)&#xA;    fmt.Printf(&#34;Type: %T Value: %v\n&#34;, 5.6, 5.6)&#xA;    fmt.Printf(&#34;Type: %T Value: %v\n&#34;, true, true)&#xA;    fmt.Printf(&#34;Type: %T Value: %v\n&#34;, &#39;a&#39;, &#39;a&#39;)&#xA;    fmt.Printf(&#34;Type: %T Value: %v\n&#34;, 3+5i, 3+5i)&#xA;&#xA;    //Named untyped constant&#xA;    const a = 123      //Default hidden type is int&#xA;    const b = &#34;circle&#34; //Default hidden type is string&#xA;    const c = 5.6      //Default hidden type is float64&#xA;    const d = true     //Default hidden type is bool&#xA;    const e = &#39;a&#39;      //Default hidden type is rune&#xA;    const f = 3 + 5i   //Default hidden type is complex128&#xA;&#xA;    fmt.Println(&#34;&#34;)&#xA;    fmt.Printf(&#34;Type: %T Value: %v\n&#34;, a, a)&#xA;    fmt.Printf(&#34;Type: %T Value: %v\n&#34;, b, b)&#xA;    fmt.Printf(&#34;Type: %T Value: %v\n&#34;, c, c)&#xA;    fmt.Printf(&#34;Type: %T Value: %v\n&#34;, d, d)&#xA;    fmt.Printf(&#34;Type: %T Value: %v\n&#34;, e, e)&#xA;    fmt.Printf(&#34;Type: %T Value: %v\n&#34;, f, f)&#xA;}خروجی:Type: int Value: 123&#xA;Type: string Value: circle&#xA;Type: float64 Value: 5.6&#xA;Type: bool Value: true&#xA;Type: int32 Value: 97&#xA;Type: complex128 Value: (3+5i)&#xA;&#xA;Type: int Value: 123&#xA;Type: string Value: circle&#xA;Type: float64 Value: 5.6&#xA;Type: bool Value: true&#xA;Type: int32 Value: 97&#xA;Type: complex128 Value: (3+5i)برنامه فوق int32 را به جای Rune چاپ می کند زیرا Rune نام مستعار int32 استنوع پیش‌فرض یک نوع ثابت با نام یا بدون نام، به نوع متغیری تبدیل می‌شود که به آن اختصاص داده می‌شود. به عنوان مثال در متغیر کد زیر a نوع خود را از نوع پیش فرض ثابت بی نام 123 دریافت می کند که int است.var a = 123بیایید برنامه ای را ببینیم که همه ثابت های نوع بی نام نشان می دهد:package main&#xA;import &#34;fmt&#34;&#xA;func main() {&#xA;    //Untyped&#xA;    var u = 123      //Default hidden type is int&#xA;    var v = &#34;circle&#34; //Default hidden type is string&#xA;    var w = 5.6      //Default hidden type is float64&#xA;    var x = true     //Default hidden type is bool&#xA;    var y = &#39;a&#39;      //Default hidden type is rune&#xA;    var z = 3 + 5i   //Default hidden type is complex128&#xA;    fmt.Printf(&#34;Type: %T Value: %v\n&#34;, u, u)&#xA;    fmt.Printf(&#34;Type: %T Value: %v\n&#34;, v, v)&#xA;    fmt.Printf(&#34;Type: %T Value: %v\n&#34;, w, w)&#xA;    fmt.Printf(&#34;Type: %T Value: %v\n&#34;, x, x)&#xA;    fmt.Printf(&#34;Type: %T Value: %v\n&#34;, y, y)&#xA;    fmt.Printf(&#34;Type: %T Value: %v\n&#34;, z, z)&#xA;}خروجی:Type: int Value: 123&#xA;Type: string Value: circle&#xA;Type: float64 Value: 5.6&#xA;Type: bool Value: true&#xA;Type: int32 Value: 97&#xA;Type: complex128 Value: (3+5i)حال سوالی که به ذهن خطور می کند این است که ثابت بدون نوع چه کاربردی دارد. استفاده از ثابت بدون نوع  این است که نوع ثابت بسته به نوع متغیری که به آن اختصاص داده می شود، تعیین می شود. گیج کننده به نظر می رسد؟ با یک مثال ببینیم :مقدار ثابت عدد پی (Pi) در پکیج math به صورت زیر اعلام شده است.const Pi = 3.14159265358979323846264338327950288419716939937510582097494459توجه داشته باشید که نوع آن مشخص نشده است و فقط یک نوع پیش فرض پنهان دارد (که در اینجا float64 است). بیایید یک کد ببینیمpackage main&#xA;import (&#xA;    &#34;fmt&#34;&#xA;    &#34;math&#34;&#xA;)&#xA;func main() {&#xA;    var f1 float32&#xA;    var f2 float64&#xA;    f1 = math.Pi&#xA;    f2 = math.Pi&#xA;&#xA;    fmt.Printf(&#34;Type: %T Value: %v\n&#34;, math.Pi, math.Pi)&#xA;    fmt.Printf(&#34;Type: %T Value: %v\n&#34;, f1, f1)&#xA;    fmt.Printf(&#34;Type: %T Value: %v\n&#34;, f2, f2)&#xA;}خروجی: Type: float64 Value: 3.141592653589793&#xA;Type: float32 Value: 3.1415927&#xA;Type: float64 Value: 3.141592653589793به برنامه بالا توجه کنید.با توجه به ماهیت نامشخص ثابت math.Pi می توان آن را به متغیری از نوع float32 و همچنین float64 نسبت داد. در غیر این صورت انجام این کار در GO ممکن نیست.وقتی نوع math.Pi را چاپ می کنیم، نوع پیش فرض را که float64 است چاپ می کندبسته به مورد استفاده، یک ثابت بدون نوع را می توان به یک نوع با دقت کم (float32) یا یک نوع با دقت بالا (float64) اختصاص داد.قراردادهای نامگذاریقراردادهای نامگذاری برای یک ثابت مانند قراردادهای نامگذاری برای متغیرها است.یک نام ثابت فقط می تواند با یک حرف یا زیرخط شروع شود. بعد از آن می توان هر تعداد حروف، اعداد یا زیرخط را دنبال کردثابت سراسریمانند هر متغیر دیگری، یک ثابت در یک بسته اگر در بالای یک فایل خارج از محدوده هر تابعی اعلان شود، سراسری خواهد بود. به عنوان مثال، در نام برنامه زیر یک ثابت سراسری در سراسر بسته اصلی در هر تابع موجود است. توجه داشته باشید که نام یک ثابت برای اینکه خارج از بسته اصلی در دسترس باشد باید با حرف بزرگ شروع شود.کد زیر یک ثابت محلی را در یک بسته نشان می دهد.package main&#xA;&#xA;import &#34;fmt&#34;&#xA;&#xA;const name = &#34;test&#34;&#xA;&#xA;func main() {&#xA;    const a = 8&#xA;    fmt.Println(a)&#xA;    testGlobal()&#xA;}&#xA;&#xA;func testGlobal() {&#xA;    fmt.Println(name)&#xA;    //The below line will give compiler error as a is a local constant&#xA;    //fmt.Println(a)&#xA;}انواع ثابت هاثابت می تواند چهار نوع باشد:رشته ایعددیبولیکاراکترثابت رشته ایدر go ثابت رشته به دو صورت نمایش داده می شودهر مقداری که بین دو گیومه محصور شده باشدهر مقدار محصور بین نقل قول های عقببرنامه زیر نمونه ای است از یک:ثابت رشته دارای نوعثابت رشته بدون نام بدون نوعثابت رشته با نام بدون نوعpackage main&#xA;&#xA;import &#34;fmt&#34;&#xA;&#xA;func main() {&#xA;&#x9;type myString string&#xA;&#xA;&#x9;//Typed String constant&#xA;&#x9;const aa string = &#34;abc&#34;&#xA;&#x9;var uu = aa&#xA;&#x9;fmt.Println(&#34;Untyped named string constant&#34;)&#xA;&#x9;fmt.Printf(&#34;uu: Type: %T Value: %v\n\nn&#34;, uu, uu)&#xA;&#xA;&#x9;//Below line will raise a compilation error&#xA;&#x9;//var v myString = aa&#xA;&#xA;&#x9;//Untyped named string constant&#xA;&#x9;const bb = &#34;abc&#34;&#xA;&#x9;var ww myString = bb&#xA;&#x9;var xx = bb&#xA;&#x9;fmt.Println(&#34;Untyped named string constant&#34;)&#xA;&#x9;fmt.Printf(&#34;ww: Type: %T Value: %v\n&#34;, ww, ww)&#xA;&#x9;fmt.Printf(&#34;xx: Type: %T Value: %v\n\n&#34;, xx, xx)&#xA;&#xA;&#x9;//Untyped unnamed string constant&#xA;&#x9;var yy myString = &#34;abc&#34;&#xA;&#x9;var zz = &#34;abc&#34;&#xA;&#x9;fmt.Println(&#34;Untyped unnamed string constant&#34;)&#xA;&#x9;fmt.Printf(&#34;yy: Type: %T Value: %v\n&#34;, yy, yy)&#xA;&#x9;fmt.Printf(&#34;zz: Type: %T Value: %v\n&#34;, zz, zz)&#xA;&#xA;}خروجی:Untyped named string constant&#xA;uu: Type: string Value: abc&#xA;&#xA;nUntyped named string constant&#xA;ww: Type: main.myString Value: abc&#xA;xx: Type: string Value: abc&#xA;&#xA;Untyped unnamed string constant&#xA;yy: Type: main.myString Value: abc&#xA;zz: Type: string Value: abcدر برنامه فوق یک نوع جدید به نام myString در کد ایجاد کردیم.type myString stringبرنامه بالا مثالی است از :ثابت رشته دارای نوعثابت رشته بدون نام بدون نوعثابت رشته با نام بدون نوعثابت رشته دارای نوعconst aa string = &#34;abc&#34;توجه کنید که خط زیر باعث خطای کامپایل می شود. به این دلیل که ثابت aa از نوع stringاست. لذا نمی توان آن را به متغیری از نوع myString نسبت داد.var v myString = aaاما ثابت رشته دارای نوع را می توان به متغیری که با کلمه کلیدی var ایجاد شده است مانند زیر نسبت دادvar uu = aaثابت رشته با نام بدون نوعconst bb = &#34;abc&#34;ثابت رشته ای با نام بدون نوع را می توان به متغیری از نوع myString و همچنین متغیر ایجاد شده با کلمه کلیدی var نسبت داد، زیرا بدون نوع است، بنابراین نوع ثابت بسته به نوع متغیری که به آن اختصاص داده می شود، تعیین می شود.var ww myString = bbvar xx = bbثابت رشته بدون نام بدون نوعبه شکل زیر تعریف شده است:abcثابت رشته بدون نام بدون نوع را می توان به متغیری از نوع myString و همچنین متغیر ایجاد شده با کلمه کلیدی var نسبت داد، زیرا بدون نوع است، بنابراین نوع ثابت بسته به نوع متغیری که به آن اختصاص داده می شود، تعیین می شود.var yy myString = &#34;abc&#34;var zz = &#34;abc&#34;ثابت عددیثابت های عددی بیشتر به سه نوع تقسیم می شوندعدد صحیحشناورهااعداد مختلطیک ثابت عدد صحیح بدون نوع (هم با نام و هم بدون نام) را می توان به انواع int، انواع float و complex نسبت داد. این به این دلیل است که مقدار int می تواند int یا float یا complex باشد. برای مثال مقدار int 123 می تواند باشدیک int که مقدار آن 123 استیک float که مقدار آن 123.0 استیک complex که قسمت خیالی (imaginary) آن 0 استبر اساس منطق مشابه، یک ثابت float بدون نوع را می توان به همه انواع float و complex اختصاص داد، اما نه به نوع int، زیرا برای مثال یک عدد float با مقدار 5.3 نمی تواند یک عدد صحیح باشد.بر اساس منطق مشابه، یک ثابت complex بدون نوع را می توان به انواع complex اختصاص داد، اما نه int و یا float، زیرا برای مثال یک شناور 5i+3 نمی تواند یک عدد صحیح یا یک شناور باشد.برنامه زیر را ببینید که نکته فوق را نشان می دهد. این برنامه مثالی است برای :ثابت عدد صحیح دارای نوعثابت عدد صحیح بدون نام بدون نوعثابت عدد صحیح با نام بدون نوعpackage main&#xA;&#xA;import &#34;fmt&#34;&#xA;&#xA;func main() {&#xA;&#x9;//Typed int constant&#xA;&#x9;const aa int = 123&#xA;&#x9;var uu = aa&#xA;&#x9;fmt.Println(&#34;Typed named integer constant&#34;)&#xA;&#x9;fmt.Printf(&#34;uu: Type: %T Value: %v\n\n&#34;, uu, uu)&#xA;&#xA;&#x9;//Below line will raise a compilation error&#xA;&#x9;//var v int32 = aa&#xA;&#xA;&#x9;//Untyped named int constant&#xA;&#x9;const bb = 123&#xA;&#x9;var ww = bb&#xA;&#x9;var xx int32 = bb&#xA;&#x9;var yy float64 = bb&#xA;&#x9;var zz complex128 = bb&#xA;&#x9;fmt.Println(&#34;Untyped named integer constant&#34;)&#xA;&#x9;fmt.Printf(&#34;ww: Type: %T Value: %v\n&#34;, ww, ww)&#xA;&#x9;fmt.Printf(&#34;xx: Type: %T Value: %v\n&#34;, xx, xx)&#xA;&#x9;fmt.Printf(&#34;yy: Type: %T Value: %v\n&#34;, yy, yy)&#xA;&#x9;fmt.Printf(&#34;zz: Type: %T Value: %v\n\n&#34;, zz, zz)&#xA;&#xA;&#x9;//Untyped unnamed int constant&#xA;&#x9;var ll = 123&#xA;&#x9;var mm int32 = 123&#xA;&#x9;var nn float64 = 123&#xA;&#x9;var oo complex128 = 123&#xA;&#x9;fmt.Println(&#34;Untyped unnamed integer constant&#34;)&#xA;&#x9;fmt.Printf(&#34;ll: Type: %T Value: %v\n&#34;, ll, ll)&#xA;&#x9;fmt.Printf(&#34;mm: Type: %T Value: %v\n&#34;, mm, mm)&#xA;&#x9;fmt.Printf(&#34;nn: Type: %T Value: %v\n&#34;, nn, nn)&#xA;&#x9;fmt.Printf(&#34;oo: Type: %T Value: %v\n&#34;, oo, oo)&#xA;}خروجی :Typed named integer constant&#xA;uu: Type: int Value: 123&#xA;&#xA;Untyped named integer constant&#xA;ww: Type: int Value: 123&#xA;xx: Type: int32 Value: 123&#xA;yy: Type: float64 Value: 123&#xA;zz: Type: complex128 Value: (123+0i)&#xA;&#xA;Untyped unnamed integer constant&#xA;ll: Type: int Value: 123&#xA;mm: Type: int32 Value: 123&#xA;nn: Type: float64 Value: 123&#xA;oo: Type: complex128 Value: (123+0i) برنامه بالا نمونه ای از a را نشان می دهد که a -ثابت عدد صحیح دارای نوعثابت عدد صحیح بدون نام بدون نوعثابت عدد صحیح با نام بدون نوعثابت عدد صحیح دارای نوع const aa int = 123ثابت عدد صحیح دارای نوع را می توان به متغیر ایجاد شده با کلمه کلیدی var مانند زیر نسبت دادvar uu = aaهنگامی که به نوع int دیگری اختصاص داده شود، خطای کامپایل را ایجاد میکند. بنابراین در زیر خطای کامپایل را خواهیم داشت زیرا متغیر aa از نوع int استvar v int32 = aaثابت عدد صحیح با نام بدون نوعconst bb = 123ثابت عدد صحیح با نام بدون نوع را می توان به هر نوع int، هر نوع شناور و هر نوع عدد مختلط و همچنین به هر متغیری که با کلمه کلیدی var ایجاد شده است نسبت داد. بنابراین زیر کار می کندvar ww = bbvar xx int32 = bbvar yy float64 = bbvar zz complex128 = bbثابت عدد صحیح بدون نام بدون نوع123ثابت عدد صحیح با نام بدون نوع را می توان به هر نوع int، هر نوع float و هر نوع عدد complex و همچنین به هر متغیری که با کلمه کلیدی var ایجاد شده است نسبت داد. بنابراین زیر کار می کندvar ww = 123var xx int32 = 123var yy float64 = 123var zz complex128 = 123عبارات عددیبه دلیل ماهیت نامشخص ثابت های عددی ، انواع ثابت عددی مختلف را می توان با هم ترکیب کرد و یک عبارت را ایجاد کرد.package main&#xA;import &#34;fmt&#34;&#xA;func main() {&#xA;    var p = 5.2 / 3&#xA;    fmt.Printf(&#34;p: Type: %T Value: %v\n&#34;, p, p)&#xA;}خروجی:p: Type: float64 Value: 1.7333333333333334ثابت بولیدو ثابت بولی بدون نوع true و false وجود دارد. در زیر برنامه ای است که ثابت بولی را نشان می دهد.package main&#xA;&#xA;import &#34;fmt&#34;&#xA;&#xA;func main() {&#xA;&#x9;type myBool bool&#xA;&#xA;&#x9;//Typed Boolean constant&#xA;&#x9;const aa bool = true&#xA;&#x9;var uu = aa&#xA;&#x9;fmt.Println(&#34;Typed named boolean constant&#34;)&#xA;&#x9;fmt.Printf(&#34;uu: Type: %T Value: %v\n\n&#34;, uu, uu)&#xA;&#xA;&#x9;//Below line will raise a compilation error&#xA;&#x9;//var vv myBool = aa&#xA;&#xA;&#x9;//Untyped named boolean constant&#xA;&#x9;const bb = true&#xA;&#xA;&#x9;var ww myBool = bb&#xA;&#x9;var xx = bb&#xA;&#x9;fmt.Println(&#34;Untyped named boolean constant&#34;)&#xA;&#x9;fmt.Printf(&#34;ww: Type: %T Value: %v\n&#34;, ww, ww)&#xA;&#x9;fmt.Printf(&#34;xx: Type: %T Value: %v\n\n&#34;, xx, xx)&#xA;&#xA;&#x9;//Untyped unnamed boolean constant&#xA;&#x9;var yy myBool = true&#xA;&#x9;var zz = true&#xA;&#x9;fmt.Println(&#34;Untyped unnamed boolean constant&#34;)&#xA;&#x9;fmt.Printf(&#34;yy: Type: %T Value: %v\n&#34;, yy, yy)&#xA;&#x9;fmt.Printf(&#34;zz: Type: %T Value: %v\n&#34;, zz, zz)&#xA;}خروجی:Typed named boolean constant&#xA;uu: Type: bool Value: true&#xA;&#xA;Untyped named boolean constant&#xA;ww: Type: main.myBool Value: true&#xA;xx: Type: bool Value: true&#xA;&#xA;Untyped unnamed boolean constant&#xA;yy: Type: main.myBool Value: true&#xA;zz: Type: bool Value: trueدر برنامه فوق یک نوع جدید myBool ایجاد کردیمtype myBool boolهمچنین برنامه بالا مثالی است از:ثابت بولی دارای نوعثابت بولی بدون نام بدون نوعثابت بولی با نام بدون نوعثابت بولی دارای نوع const aa bool = trueتوجه کنید که خط زیر باعث خطای کامپایل می شود. این به این دلیل است که متغیر aa از ثابت بولی دارای نوع است. بنابراین خط زیر باعث خطای کامپایل می شود زیرا نمی توان آن را به متغیری از نوع myBool اختصاص داد.var v mybool = aaاما ثابت رشته دارای نوع را می توان به متغیری که با کلمه کلیدی var ایجاد شده است مانند زیر نسبت دادvar uu = aaثابت بولی با نام بدون نوعconst bb = trueثابت رشته ای با نام بدون نوع را می توان به متغیری از نوع myBool و همچنین متغیر ایجاد شده با کلمه کلیدی var اختصاص داد زیرا بدون نوع است بنابراین نوع ثابت بسته به نوع متغیری که به آن اختصاص داده می شود تعیین می شود.var ww mybool = bbvar xx = bbثابت بولی بدون نام بدون نوعtrueثابت رشته بدون نام بدون نام را می توان به متغیری از نوع myBool و همچنین متغیر ایجاد شده با کلمه کلیدی var اختصاص داد زیرا بدون نوع است بنابراین نوع ثابت بسته به نوع متغیری که به آن اختصاص داده می شود تعیین می شود.var yy mybool = true&#xA;var zz = trueثابت کاراکتریدر زیر برنامه ای است که ثابت کاراکتر را نشان می دهد.package main&#xA;&#xA;import &#34;fmt&#34;&#xA;&#xA;func main() {&#xA;&#x9;type myChar int32&#xA;&#xA;&#x9;//Typed character constant&#xA;&#x9;const aa int32 = &#39;a&#39;&#xA;&#x9;var uu = aa&#xA;&#x9;fmt.Println(&#34;Untyped unnamed character constant&#34;)&#xA;&#x9;fmt.Printf(&#34;uu: Type: %T Value: %v\n\n&#34;, uu, uu)&#xA;&#xA;&#x9;//Below line will raise a compilation error&#xA;&#x9;//var vv myBool = aa&#xA;&#xA;&#x9;//Untyped named character constant&#xA;&#x9;const bb = &#39;a&#39;&#xA;&#xA;&#x9;var ww myChar = bb&#xA;&#x9;var xx = bb&#xA;&#x9;fmt.Println(&#34;Untyped named character constant&#34;)&#xA;&#x9;fmt.Printf(&#34;ww: Type: %T Value: %v\n&#34;, ww, ww)&#xA;&#x9;fmt.Printf(&#34;xx: Type: %T Value: %v\n\n&#34;, xx, xx)&#xA;&#xA;&#x9;//Untyped unnamed character constant&#xA;&#x9;var yy myChar = &#39;a&#39;&#xA;&#x9;var zz = &#39;a&#39;&#xA;&#x9;fmt.Println(&#34;Untyped unnamed character constant&#34;)&#xA;&#x9;fmt.Printf(&#34;yy: Type: %T Value: %v\n&#34;, yy, yy)&#xA;&#x9;fmt.Printf(&#34;zz: Type: %T Value: %v\n&#34;, zz, zz)&#xA;}خروجی:Untyped unnamed character constant&#xA;uu: Type: int32 Value: 97&#xA;&#xA;Untyped named character constant&#xA;ww: Type: main.myChar Value: 97&#xA;xx: Type: int32 Value: 97&#xA;&#xA;Untyped unnamed character constant&#xA;yy: Type: main.myChar Value: 97&#xA;zz: Type: int32 Value: 97در برنامه فوق یک نوع جدید myChar ایجاد کردیمtype myChar int32همچنین برنامه بالا مثالی است از:ثابت کاراکتر دارای نوعثابت کاراکتر بدون نام بدون نوعثابت کاراکتر با نام بدون نوعثابت کاراکتر دارای نوعconst aa int32 = &#39;a&#39;توجه کنید که خط زیر باعث خطای کامپایل می شود. این به این دلیل است که متغیر aa از نوع int32 است. بنابراین خط زیر باعث خطای کامپایل می شود زیرا نمی توان آن را به متغیری از نوع myChar نسبت دادvar v myChar = aaاما ثابت رشته دارای نوع را می توان به متغیری که با کلمه کلیدی var ایجاد شده است مانند زیر نسبت دادvar uu = aaثابت کاراکتر با نام بدون نوعconst bb = &#39;a&#39;ثابت رشته ای با نام بدون نوع را می توان به متغیری از نوع myChar و همچنین متغیر ایجاد شده با کلمه کلیدی var نسبت داد، زیرا بدون نوع است، بنابراین نوع ثابت بسته به نوع متغیری که به آن اختصاص داده می شود، تعیین می شود.var ww myChar = bbvar xx = bbثابت کاراکتر بدون نام بدون نوع&#39;a&#39;ثابت رشته بدون نام را می توان به متغیری از نوع myChar و همچنین متغیر ایجاد شده با کلمه کلیدی var نسبت داد زیرا بدون نوع است بنابراین نوع ثابت بسته به نوع متغیری که به آن اختصاص داده می شود تعیین می شود.var yy myChar = &#39;a&#39;var zz = &#39;a&#39;نتیجهآنچه بیان شد همه چیز در مورد ثابت ها در زبان Go است. امیدواریم این مقاله را دوست داشته باشید. لطفا بازخورد یا بهبود یا اشتباهات را در نظرات به اشتراک بگذارید.-----------------------------------مطالب دیگر:متغیر ها در زبان گو (Go)-----------------------------------توجه: در بخشی از متن ترجمه شده به جهت خوانایی بیشتر، به نحوی که در مفهوم مطالب تغییری ایجاد نشود تغییراتی ایجاد شده است.منبع:https://golangbyexample.com/constant-golang/</description><category>سعید فراهانی</category><author>سعید فراهانی</author><pubDate>Tue, 26 Sep 2023 17:21:02 +0330</pubDate></item><item><title>متغیر ها در زبان گو (Go)</title><link>https://virgool.ir/@svfnix/متغیر-ها-در-زبان-گو-go-cxhnpfzx2syo</link><description>متغیر چیستمتغیر نام یک مکان حافظه است. آن مکان حافظه ممکن است مقداری از هر نوع را ذخیره کند. بنابراین هر متغیر دارای یک نوع است که اندازه و محدوده آن متغیر و همچنین عملیات تعریف شده روی آن متغیر را تعیین می کند.قراردادهای نامگذاری متغیر ها در زبان برنامه نویسی Goنام متغیر فقط می تواند با یک حرف یا زیرخط شروع شود.بعد از آن می توان هر تعداد حروف، اعداد یا زیرخط را استفاده کردزبان Go به حروف بزرگ و کوچک حساس است، بنابراین با حروف بزرگ و کوچک متفاوت رفتار می شود.نام متغیر نمی تواند نام هیچ کلمه کلیدی در زبان Go باشدهیچ محدودیتی در طول نام متغیر وجود ندارد. اما توصیه می شود که نام متغیر طول بهینه را داشته باشید.تعریف یک متغیردر زبان Go متغیرها با استفاده از کلمه کلیدی var اعلان می شوند، اما روش های دیگری نیز برای اعلام یک متغیر وجود دارد که در ادامه این آموزش خواهیم دید. بیایید روش های مختلف اعلام یک متغیر را بررسی کنیم.تعریف تک متغیری بدون مقدار اولیهکد زیر روش اعلان یک متغیر منفرد بدون تخصیص مقدار اولیه است که شامل اول کلمه کلیدی var، دوم نام متغیر و سوم نوع متغیر است. همچنین توجه داشته باشید زمانی که مقدار ارائه نمی شود، متغیر با مقدار پیش فرض آن نوع که به عنوان مقدار صفر (zero) آن نوع نیز شناخته می شود مقداردهی اولیه می شود. در زبان Go مقدار پیش فرض یا مقدار صفر int عدد 0 است.var &lt;variable_name&gt; &lt;type&gt;package main&#xA;&#xA;import &#34;fmt&#34;&#xA;&#xA;func main() {&#xA;    var aaa int&#xA;    fmt.Println(aaa)&#xA;}خروجی: مقدار پیش فرض int را که 0 است را چاپ می کند0تعریف تک متغیری با مقدار اولیهکد زیر فرمت یک اعلان متغیر منفرد با مقدار اولیه است. همه چیز مانند بالا است، تنها چیز اضافی این است که در پایان به متغیر مقدار اختصاص می دهیمvar &lt;variable_name&gt; &lt;type&gt; = &lt;value&gt;مثال زیر را ببینید، یک متغیر به نام aaa از نوع int را اعلام می کند و به آن مقدار 8 می دهد.package main&#xA;&#xA;import &#34;fmt&#34;&#xA;&#xA;func main() {&#xA;    var aaa int = 8&#xA;    fmt.Println(aaa)&#xA;}خروجی:8تعریف چند متغیر بدون مقدار اولیهدر زیر فرمت اعلان چند متغیر بدون تخصیص مقدار اولیه قابل مشاهده است. لطفاً توجه داشته باشید که فقط متغیرهای یک نوع را می توان با هم اعلام کرد. توجه کنید که در تعریف متغیر، نوع در پایان می آید.var &lt;name1&gt;, &lt;name2&gt;,….&lt;nameN&gt; &lt;type&gt;مثال زیر را ببینیدpackage main&#xA;&#xA;import &#34;fmt&#34;&#xA;&#xA;func main() {&#xA;    var aaa, bbb int&#xA;    fmt.Println(aaa)&#xA;    fmt.Println(bbb)&#xA;}خروجی: مقدار پیش فرض یا صفر int را چاپ می کند که برای aaa و bbb صفر است0&#xA;0تعریف چند متغیر با مقدار اولیهدر قطعه کد زیر فرمت یک اعلان متغیر چندگانه با مقدار اولیه نمایش داده شده است. لطفاً توجه داشته باشید که فقط متغیرهای یک نوع را می توان با هم اعلام کرد. var &lt;name1&gt;, &lt;name2&gt;, …..,&lt;nameN&gt; &lt;type&gt; = &lt;value1&gt;, &lt;value2&gt;, …..,&lt;valueN&gt;نمونه کد زیر را ببینید. به متغیر aaa و bbb در یک اعلان به ترتیب مقدار 8 و 9 داده می شود.package main&#xA;&#xA;import &#34;fmt&#34;&#xA;&#xA;func main() {&#xA;    var aaa, bbb int = 8, 9&#xA;    fmt.Println(aaa)&#xA;    fmt.Println(bbb)&#xA;}خروجی:8&#xA;9تعریف متغیرهایی با انواع مختلفدر زیر فرمت اعلان چندین متغیر با انواع مختلف آورده شده است. در صورت نیاز مقادیر را می توان به متغیرها نسبت داد. متغیرهایی که مقدار برای آنها تخصیص داده نشده است، مقدار پیش فرض آن نوع را دریافت می کنند. در مثال زیر سه اعلان می بینیم.package main&#xA;&#xA;import &#34;fmt&#34;&#xA;&#xA;func main() {&#xA;    var (&#xA;        aaa int&#xA;        bbb int    = 8&#xA;        ccc string = &#34;a&#34;&#xA;    )&#xA;&#xA;    fmt.Println(aaa)&#xA;    fmt.Println(bbb)&#xA;    fmt.Println(ccc)&#xA;}خروجی:0&#xA;8&#xA;aاعلان متغیر بدون نوع متغیرها را نیز می توان بدون تعیین نوع آن اعلام کرد.کامپایلر GO بر اساس مقدار تخصیص داده شده به متغیر، نوع آن را مشخص می کند. بنابراین اگر متغیر دارای مقدار اولیه باشد، می توان نوع را حذف کرد. این استنتاج نوع نیز نامیده می شود. در زیر فرمت چنین تعریفی  آمده استvar &lt;variable_name&gt; = &lt;value&gt;در زیر جدول استنتاج نوع برای انواع اساسی int، float، اعداد مختلط، رشته، بولی، کاراکترها آمده است. اساساً به این معنی است که اگر مقدار یک عدد صحیح باشد نوع متغیر استنباط شده int خواهد بود، اگر مقدار یک float باشد، نوع متغیر استنباط‌شده بر اساس جدول زیر float64 و غیره خواهد بود.برای انواع دیگر مانند Array، Pointer، Structure و غیره، نوع Inference بر اساس مقدار اتفاق می افتد. بیایید یک مثال کاربردی از نکته بالا را ببینیم. توجه داشته باشید که نوع t به درستی به عنوان int استنباط می شود زیرا مقدار اختصاص داده شده به آن 123 است که int است. به طور مشابه نوع u نیز به درستی به عنوان رشته استنباط می شود زیرا مقدار اختصاص داده شده به آن یک رشته است.همچنین توجه داشته باشید که نوع متغیر z به درستی به عنوان ساختار main.sample استنباط شده استpackage main&#xA;&#xA;import &#34;fmt&#34;&#xA;&#xA;func main() {&#xA;    var t = 123      //Type Inferred will be int&#xA;    var u = &#34;circle&#34; //Type Inferred will be string&#xA;    var v = 5.6      //Type Inferred will be float64&#xA;    var w = true     //Type Inferred will be bool&#xA;    var x = &#39;a&#39;      //Type Inferred will be rune&#xA;    var y = 3 + 5i   //Type Inferred will be complex128&#xA;    var z = sample{name: &#34;test&#34;}  //Type Inferred will be main.Sample&#xA;&#xA;    fmt.Printf(&#34;Type: %T Value: %v\n&#34;, t, t)&#xA;    fmt.Printf(&#34;Type: %T Value: %v\n&#34;, u, u)&#xA;    fmt.Printf(&#34;Type: %T Value: %v\n&#34;, v, v)&#xA;    fmt.Printf(&#34;Type: %T Value: %v\n&#34;, w, w)&#xA;    fmt.Printf(&#34;Type: %T Value: %v\n&#34;, x, x)&#xA;    fmt.Printf(&#34;Type: %T Value: %v\n&#34;, y, y)&#xA;    fmt.Printf(&#34;Type: %T Value: %v\n&#34;, z, z)&#xA;}&#xA;&#xA;type sample struct {&#xA;    name string&#xA;}خروجی:Type: int Value: 123&#xA;Type: string Value: circle&#xA;Type: float64 Value: 5.6&#xA;Type: bool Value: true&#xA;Type: int32 Value: 97&#xA;Type: complex128 Value: (3+5i)&#xA;Type: main.sample Value: اعلان متغیر کوتاهGo راه دیگری برای اعلان متغیرها ارائه می دهد که از عملگر := استفاده می کند. هنگامی که عملگر := استفاده می شود، هم کلمه کلیدی var و هم اطلاعات نوع را می توان حذف کرد. در زیر فرمت چنین اعلامیه ای آمده است:=استنتاج نوع همانطور که در بالا توضیح داده شد اتفاق می افتد. بیایید یک قطعه کد نمونه را بررسی کنیم:package main&#xA;&#xA;import &#34;fmt&#34;&#xA;&#xA;func main() {&#xA;    t := 123      //Type Inferred will be int&#xA;    u := &#34;circle&#34; //Type Inferred will be string&#xA;    v := 5.6      //Type Inferred will be float64&#xA;    w := true     //Type Inferred will be bool&#xA;    x := &#39;a&#39;      //Type Inferred will be rune&#xA;    y := 3 + 5i   //Type Inferred will be complex128&#xA;    z := sample{name: &#34;test&#34;}  //Type Inferred will be main.Sample&#xA;&#xA;    fmt.Printf(&#34;Type: %T Value: %v\n&#34;, t, t)&#xA;    fmt.Printf(&#34;Type: %T Value: %v\n&#34;, u, u)&#xA;    fmt.Printf(&#34;Type: %T Value: %v\n&#34;, v, v)&#xA;    fmt.Printf(&#34;Type: %T Value: %v\n&#34;, w, w)&#xA;    fmt.Printf(&#34;Type: %T Value: %v\n&#34;, x, x)&#xA;    fmt.Printf(&#34;Type: %T Value: %v\n&#34;, y, y)&#xA;    fmt.Printf(&#34;Type: %T Value: %v\n&#34;, z, z)&#xA;}&#xA;&#xA;type sample struct {&#xA;    name string&#xA;}خروجیType: int Value: 123&#xA;Type: string Value: circle&#xA;Type: float64 Value: 5.6&#xA;Type: bool Value: true&#xA;Type: int32 Value: 97&#xA;Type: complex128 Value: (3+5i)&#xA;Type: main.sample Value: چند نکته در مورد عملگر := قابل ذکر استعملگر := فقط درون توابع قابل استفاده است. خارج از تابع مجاز نیست.متغیری که یک بار با استفاده از := اعلام شده است را نمی توان با استفاده از عملگر := دوباره اعلام کرد. بنابراین عبارت زیر یک خطای کامپایلر را ایجاد می‌کند که “متغیر جدیدی در سمت چپ :=” وجود ندارد.a := 8&#xA;a := 16عملگر := همچنین می تواند برای اعلان چندین متغیر در یک خط استفاده شود. مثال زیر را ببینیدa,b := 1, 2در صورت اعلان چندگانه، اگر حداقل یکی از متغیرهای سمت چپ جدید باشد، := می تواند دوباره برای یک متغیر خاص استفاده شود. مثال زیر را ببینید. توجه داشته باشید که b مجدداً با استفاده از := اعلام می شود که این تنها در صورتی امکان پذیر است که حداقل یکی از متغیرها جدید باشد که متغیر c در اینجا باشد. در این مورد به عنوان یک انتساب برای متغیر b عمل می کندpackage main&#xA;&#xA;import &#34;fmt&#34;&#xA;&#xA;func main() {&#xA;    a, b := 1, 2&#xA;    b, c := 3, 4&#xA;    fmt.Println(a, b, c)&#xA;}خروجی:1, 3, 4نکات مهموجود یک متغیر استفاده نشده به عنوان یک خطای کامپایلر گزارش می شود. کامپایلر GO اجازه تعریف متغیر بدون استفاده ای را نمیدهد. این یک بهینه سازی در GO است. همانطور که در ادامه خواهیم دید، همین امر برای انواع ثابت (constant) نیز اعمال می شود. به عنوان مثال برنامه زیر یک خطای کامپایلر ایجاد می کندpackage main&#xA;&#xA;func main() {&#xA;    //a declared but not used&#xA;    var a = 1&#xA;}متغیری که در یک محدوده داخلی اعلام شده است بر روی متغیری با همان نام که در محدوده بیرونی معرفی شده است سایه می اندازد.package main&#xA;&#xA;import &#34;fmt&#34;&#xA;&#xA;var a = 123&#xA;&#xA;func main() {&#xA;    var a = 456&#xA;    fmt.Println(a)&#xA;}خروجی:456بیان متغیر — در حالی که به متغیر اعلامی می توان یک عبارت یا یک تابع فراخوانی نیز اختصاص داد. مثال زیر را ببینید.متغیر a با عبارت 5 +3 اعلام می شودمتغیر b با فراخوانی تابع math.Max(4, 5) اعلام می شود که نتیجه آن در زمان اجرا به b اختصاص داده می شود.package main&#xA;import (&#xA;    &#34;fmt&#34;&#xA;    &#34;math&#34;&#xA;)&#xA;func main() {&#xA;    a := 5 + 3&#xA;    b := math.Max(4, 5)&#xA;    fmt.Println(a)&#xA;    fmt.Println(b)&#xA;}خروجی:8&#xA;5زمانی که یک متغیر با یک نوع خاص مقداردهی اولیه شود، بعداً نمی‌توان به آن متغیر مقداری از نوع متفاوت نسبت داد. مثال زیر را ببینیدpackage main&#xA;&#xA;func main() {&#xA;    var aaa int = 1&#xA;    aaa = &#34;atest&#34;&#xA;&#xA;    bbb := 1&#xA;    bbb = &#34;btest&#34;&#xA;}خروجی:cannot use &#34;atest&#34; (type untyped string) as type int in assignment&#xA;cannot use &#34;btest&#34; (type untyped string) as type int in assignmentبه متغیر aaa یک نوع int اختصاص داده شده است، از این رو کامپایلر در اختصاص مقداری از نوع رشته به آن خطایی ایجاد می کند. برای متغیر bbb، نوع استنباط شده int است، از این رو با اختصاص مقداری از نوع رشته به آن، خطای کامپایلر را نیز ایجاد می کند.محدوده یک متغیر (متغیر محلی و سراسری)اعلان متغیر را می توان در سطح پکیج یا سطح تابع یا سطح بلوک انجام داد. محدوده یک متغیر محل دسترسی آن متغیر و همچنین عمر متغیر را مشخص می کند. متغیرهای زبان Go را می توان بر اساس دامنه به دو دسته تقسیم کردمتغیر محلیمتغیر سراسریمتغیر محلیمتغیرهای محلی متغیرهایی هستند که در یک بلوک یا یک سطح تابع تعریف می شوندنمونه ای از بلوک یک حلقه for یا یک حلقه محدوده و غیره است.این متغیرها فقط از داخل بلوک یا تابع آنها قابل دسترسی هستنداین متغیرها فقط تا انتهای بلوک یا تابعی که در آن اعلان شده اند زنده هستند. پس از آن، آنها از حافظه پاک میشوند.مثال زیر را ببینیدمتغیر i بعد از حلقه for در دسترس نیستبه طور مشابه aaa خارج از تابعی که در آن اعلان شده است در دسترس نیست.بنابراین برنامه زیر خطای کامپایلر را افزایش می دهدundefined: i&#xA;undefined: aaaکد:package main&#xA;&#xA;import &#34;fmt&#34;&#xA;&#xA;func main() {&#xA;    var aaa = &#34;test&#34;&#xA;    fmt.Println(aaa)&#xA;    for i := 0; i &lt; 3; i++ {&#xA;        fmt.Println(i)&#xA;    }&#xA;    fmt.Println(i)&#xA;}&#xA;&#xA;func testLocal() {&#xA;    fmt.Println(aaa)&#xA;}متغیر سراسرییک متغیر در صورتی که در بالای یک فایل خارج از محدوده هر تابع یا بلوکی اعلان شود، درون یک پکیج به صورت سراسری خواهد بود.اگر نام این متغیر با حروف کوچک شروع شود، می‌توان از داخل پکیجی که این تعریف متغیر را در خود دارد به آن دسترسی داشت.اگر نام متغیر با یک حرف بزرگ مشخص شود، می‌توان از پکیجی خارج از پکیج که اعلام شده است، به آن دسترسی پیدا کرد.متغیرهای سراسری در طول عمر یک برنامه در دسترس هستندبه عنوان مثال در زیر متغیر برنامه aaa یک متغیر سراسری در سراسر پکیج اصلی خواهد بود. در هر عملکردی در پکیج اصلی موجود خواهد بود. توجه داشته باشید که نام متغیر خارج از پکیج اصلی در دسترس نخواهد بود زیرا نام آن با حروف کوچک شروع می شود.package main&#xA;&#xA;import &#34;fmt&#34;&#xA;&#xA;var aaa = &#34;test&#34;&#xA;&#xA;func main() {&#xA;    testGlobal()&#xA;}&#xA;&#xA;func testGlobal() {&#xA;    fmt.Println(aaa)&#xA;}خروجی:testنتیجهآنچه بیان شد همه چیز در مورد متغیرها در زبان Go است. امیدواریم این مقاله را دوست داشته باشید. لطفا بازخورد یا بهبود یا اشتباهات را در نظرات به اشتراک بگذارید.-----------------------------------توجه: در بخشی از متن ترجمه شده به جهت خوانایی بیشتر، به نحوی که در مفهوم مطالب تغییری ایجاد نشود تغییراتی ایجاد شده است.منبع:https://golangbyexample.com/variables-in-golang-complete-guide/</description><category>سعید فراهانی</category><author>سعید فراهانی</author><pubDate>Mon, 25 Sep 2023 00:36:06 +0330</pubDate></item></channel></rss>