📅 پنجشنبه، ۹ اسفند | ساعت ۱۴ تا ۱۹
📍 دانشگاه تهران، تالار علامه امینی دانشگاه تهران
💯 محورهای کلیدی رویداد:
آیا شما علاقهمند به زبان برنامهنویسی گولانگ (Golang) هستید؟ آیا میخواهید تواناییهای خود را در این زبان بهبود ببخشید و به یک استاد در این حوزه تبدیل شوید؟ اگر پاسخ شما بله است، پس کانال تلگرامی Gopher Academy مکانی مناسب برای شماست. این کانال حاوی مصاحبهها، سوالات و پاسخهای مرتبط با گو فراهم میکند تا شما بتوانید مهارتهای خود را در این زبان بهبود دهید و بتوانید بهترین نسخه خود را ارائه دهید. همچنین با مراجعه به لینکهای موجود در کانال، میتوانید از منابعی برای افزایش دانش خود بهره ببرید. برای حمایت مالی از این کانال میتوانید از لینک مربوطه استفاده کنید. ادمین این کانال آموزشی @mrbardia72 میباشد و ادمین تبلیغات آن @labdon_ads است. پس از عضویت در این کانال، شما قطعا تبدیل به یک استاد در زبان برنامهنویسی گولانگ خواهید شد.
19 Feb, 16:33
18 Feb, 08:48
17 Feb, 05:42
16 Feb, 15:38
16 Feb, 11:30
15 Feb, 16:34
15 Feb, 05:30
14 Feb, 11:30
13 Feb, 11:30
12 Feb, 18:57
12 Feb, 15:32
map`، `channel`، `string
و سایر انواع این دسته نیز صدق میکند. 12 Feb, 11:30
12 Feb, 05:30
11 Feb, 11:32
11 Feb, 05:30
10 Feb, 12:40
10 Feb, 11:30
10 Feb, 05:30
09 Feb, 11:30
09 Feb, 05:37
09 Feb, 05:30
08 Feb, 16:18
08 Feb, 11:30
08 Feb, 07:46
08 Feb, 06:10
08 Feb, 05:30
07 Feb, 11:30
07 Feb, 05:30
05 Feb, 05:31
03 Feb, 11:30
03 Feb, 05:30
02 Feb, 18:15
02 Feb, 11:30
02 Feb, 05:30
01 Feb, 11:30
01 Feb, 05:30
31 Jan, 11:30
31 Jan, 05:30
29 Jan, 08:41
من تازه به استفاده از ChatGPT روی آوردهام و شغل من [شغل خود را وارد کنید] است. لطفاً فهرستی از ۱۰ پیشنهاد برتر برای افزایش بهرهوری من ارائه دهید
."[متن نوشتاری خود را وارد کنید] لطفاً نوشتهی من را بررسی کن. اشتباهات گرامری و املایی را اصلاح کن و پیشنهاداتی برای بهبود وضوح نوشتهام ارائه بده
."جزئیات حرفهای من را در زیر تحلیل کن و یک رزومه متقاعدکننده ایجاد کن که به من در یافتن شغل [جزئیات شغل مورد نظر را وارد کنید] کمک کند: [جزئیات حرفهای خود را وارد کنید
]."میخواهم درباره [موضوع مورد نظر را وارد کنید] یاد بگیرم. لطفاً ۲۰ درصد مهمترین نکات این موضوع را شناسایی و به اشتراک بگذار که به من کمک کند ۸۰ درصد آن را درک کنم.
"میخواهم در [مهارت مورد نظر را وارد کنید] بهتر شوم. من کاملاً مبتدی هستم. لطفاً یک برنامه یادگیری ۳۰ روزه ایجاد کن که به یک مبتدی مانند من کمک کند تا این مهارت را بیاموزد و پیشرفت کند
."29 Jan, 05:30
28 Jan, 11:30
28 Jan, 07:23
s := "Hello"
s[0] = 'h' // این خطا میدهد، زیرا رشتهها غیرقابل تغییر هستند.
s = "hello" // این کار میکند، اما در واقع یک رشته جدید ایجاد میشود.
slice := []int{1, 2, 3}
slice[0] = 10 // این کار میکند، زیرا برشها قابل تغییر هستند.
28 Jan, 07:07
28 Jan, 05:30
27 Jan, 18:33
27 Jan, 11:30
27 Jan, 05:30
26 Jan, 11:30
26 Jan, 05:30
25 Jan, 11:30
25 Jan, 05:30
24 Jan, 11:30
24 Jan, 05:30
23 Jan, 11:30
23 Jan, 05:30
22 Jan, 11:30
22 Jan, 06:27
22 Jan, 06:25
22 Jan, 05:30
21 Jan, 11:30
21 Jan, 05:30
20 Jan, 11:30
14 Jan, 11:30
14 Jan, 05:30
13 Jan, 15:54
go test`، میتوانید از فلگ
-json` استفاده کنید:go test -json ./...
{
"Time": "2023-10-01T12:34:56Z",
"Action": "run",
"Package": "example.com/myproject",
"Test": "TestSomething",
"Output": "=== RUN TestSomething\n"
}
{
"Time": "2023-10-01T12:34:57Z",
"Action": "pass",
"Package": "example.com/myproject",
"Test": "TestSomething",
"Elapsed": 0.12
}
jq
) برای پردازش نتایج تستها استفاده کنید.go get
و go mod
) یکپارچه شده است.# تنظیم توکن دسترسی برای GitHub
export GOPRIVATE=github.com/myorg/*
export GOAUTH_TOKEN=ghp_your_github_token_here
go get
:go get github.com/myorg/private-repo
13 Jan, 15:52
go.mod
) کار میکند و نیاز به نصب دستی ابزارها را کاهش میدهد.go generate
و go mod
) بهطور کامل یکپارچه شده است.go.work
یا go.mod
استفاده کنید. در اینجا یک مثال آورده شده است:go.mod
module example.com/myproject
go 1.20
require (
github.com/golang/mock v1.6.0
)
// تعریف ابزارهای مورد نیاز
toolchain {
mockgen = "github.com/golang/mock/[email protected]"
}
go.work
go 1.20
use (
.
./submodule
)
// تعریف ابزارهای مورد نیاز
toolchain {
mockgen = "github.com/golang/mock/[email protected]"
protoc = "google.golang.org/protobuf/cmd/[email protected]"
}
go install toolchain
go.mod
یا go.work
را نصب میکند.go generate ./...
go.mod
:module example.com/myproject
go 1.20
require (
github.com/golang/mock v1.6.0
)
toolchain {
mockgen = "github.com/golang/mock/[email protected]"
}
main.go
:package main
import (
"example.com/myproject/mocks"
"testing"
)
func TestSomething(t *testing.T) {
mock := mocks.NewMockMyInterface(t)
mock.On("MyMethod").Return(nil)
// تست خود را اینجا بنویسید
}
# نصب ابزارها
go install toolchain
# ایجاد فایلهای mock
go generate ./...
# اجرای تستها
go test ./...
13 Jan, 15:41
package main
import "fmt"
// تعریف یک alias برای slice از اعداد صحیح
type IntSlice = []int
func main() {
var numbers IntSlice = []int{1, 2, 3, 4, 5}
fmt.Println(numbers) // خروجی: [1 2 3 4 5]
}
package main
import "fmt"
// تعریف یک alias برای slice از هر نوع دادهای با استفاده از جنریکها
type GenericSlice[T any] = []T
func main() {
var numbers GenericSlice[int] = []int{1, 2, 3, 4, 5}
fmt.Println(numbers) // خروجی: [1 2 3 4 5]
var names GenericSlice[string] = []string{"Alice", "Bob", "Charlie"}
fmt.Println(names) // خروجی: [Alice Bob Charlie]
}
package main
import "fmt"
// تعریف یک alias برای slice از sliceهای اعداد صحیح
type IntSliceSlice = [][]int
func main() {
var matrix IntSliceSlice = [][]int{
{1, 2, 3},
{4, 5, 6},
{7, 8, 9},
}
fmt.Println(matrix) // خروجی: [[1 2 3] [4 5 6] [7 8 9]]
}
13 Jan, 15:37
/
در لینوکس یا C:\
در ویندوز) را سادهتر میکند.package main
import (
"fmt"
"os"
)
func main() {
// دریافت دایرکتوری ریشه
root := os.Root()
fmt.Println("دایرکتوری ریشه:", root)
// تغییر دایرکتوری جاری به دایرکتوری ریشه
err := os.Chdir(root)
if err != nil {
fmt.Println("خطا در تغییر دایرکتوری:", err)
return
}
// لیست فایلها و دایرکتوریها در دایرکتوری ریشه
files, err := os.ReadDir(".")
if err != nil {
fmt.Println("خطا در خواندن دایرکتوری:", err)
return
}
for _, file := range files {
fmt.Println(file.Name())
}
}
package main
import (
"fmt"
"runtime"
"weak"
)
func main() {
// ایجاد یک شیء
obj := "این یک شیء است"
// ایجاد یک weak pointer به شیء
wp := weak.New(&obj)
// بررسی وجود شیء
if val, ok := wp.Get(); ok {
fmt.Println("شیء وجود دارد:", *val)
} else {
fmt.Println("شیء جمعآوری شده است.")
}
// حذف اشارهگر به شیء
obj = ""
runtime.GC() // اجرای Garbage Collector
// بررسی دوباره وجود شیء
if val, ok := wp.Get(); ok {
fmt.Println("شیء هنوز وجود دارد:", *val)
} else {
fmt.Println("شیء جمعآوری شده است.")
}
}
13 Jan, 15:33
map
ارائه میدهد. در زیر به بررسی این ویژگی و مزایای آن میپردازیم:map
در Go است که از الگوریتمها و تکنیکهای بهینهشده برای بهبود عملکرد استفاده میکند.map
میشود.map
استفاده کنند.map
استفاده میکنند، بهطور خودکار از مزایای SwissTable بهرهمند میشوند. این بهبودها شامل افزایش سرعت و کاهش مصرف حافظه است.map
با اطمینان بیشتری استفاده کنند، زیرا عملکرد آن بهطور قابل توجهی بهبود یافته است.map
با استفاده از یک ساختار دادهای مبتنی بر hash table پیادهسازی میشد که عملکرد خوبی داشت، اما برای برخی موارد خاص (مانند مجموعههای دادهای بزرگ) بهینهسازی نشده بود.map
را در همه موارد بهبود میبخشد.map
به صورت زیر استفاده میشود:package main
import "fmt"
func main() {
// ایجاد یک map
m := make(map[string]int)
// درج داده در map
m["apple"] = 5
m["banana"] = 3
// خواندن داده از map
fmt.Println("تعداد سیبها:", m["apple"])
// حذف داده از map
delete(m, "banana")
// بررسی وجود کلید در map
if value, exists := m["banana"]; exists {
fmt.Println("تعداد موزها:", value)
} else {
fmt.Println("موز وجود ندارد.")
}
}
map
در Go است که در نسخه 1.24 معرفی شد.map
میشود.13 Jan, 15:33
13 Jan, 11:30
13 Jan, 05:30
12 Jan, 11:30
12 Jan, 05:30
11 Jan, 11:30
11 Jan, 05:30
10 Jan, 11:30
07 Jan, 05:57
06 Jan, 06:53
cap
) بیشتر شود، حافظه بیشتری به آن تخصیص داده میشود. الگوریتم تخصیص ظرفیت معمولاً بهصورت نمایی است (یعنی دو برابر میشود). این کار برای کاهش تعداد دفعات تخصیص مجدد حافظه انجام میشود و به بهبود کارایی کمک میکند.s := make([]int, 0, 2) // ظرفیت اولیه 2
fmt.Println(len(s), cap(s)) // طول 0، ظرفیت 2
s = append(s, 1, 2, 3) // نیاز به افزایش ظرفیت
fmt.Println(len(s), cap(s)) // طول 3، ظرفیت 4 (دو برابر قبلی)
06 Jan, 06:52
cap
) آن شود، Go بهطور خودکار یک حافظه جدید با ظرفیت بزرگتر تخصیص میدهد. سپس عناصر قدیمی را به حافظه جدید منتقل کرده و عنصر جدید را اضافه میکند.s := make([]int, 3, 5)
s = append(s, 1, 2, 3) // ظرفیت پر میشود
s = append(s, 4) // ظرفیت بیشتر میشود (افزایش خودکار ظرفیت)
fmt.Println(len(s)) // 7
fmt.Println(cap(s)) // 10 (ممکن است مقدار جدید متفاوت باشد)
06 Jan, 06:52
len()
قابل دسترسی است.cap()
قابل دسترسی است.len
باشد.s := make([]int, 3, 5) // اسلایس با طول 3 و ظرفیت 5
fmt.Println(len(s)) // 3
fmt.Println(cap(s)) // 5
06 Jan, 06:12
03 Jan, 18:03
go 1.20
toolchain go1.20
module example.com/myproject go 1.20 // حداقل نسخه زبان Go toolchain go1.21 // نسخه ابزار Go
03 Jan, 17:51
toolchain go1.20
go 1.20
module example.com/myproject go 1.20 toolchain go1.20 require ( github.com/some/library v1.2.3 )
01 Jan, 07:30
for
تعریف میشود، متغیرهای حلقه (result
در این مثال) به صورت متغیر مشترک (shared) در حافظه استفاده میشوند. این بدان معناست که همه goroutineها به یک مرجع (reference) از این متغیر دسترسی دارند، نه به یک کپی از مقدار فعلی آن.for _, result := range collections {
go func() {
fmt.Println(result.Title) // از result استفاده میشود
}()
}
result
به طور مداوم در طول حلقه تغییر میکند.result
تغییر کرده باشد و goroutine به مقدار آخرین تغییر یافته دسترسی داشته باشد، نه مقداری که هنگام تعریف goroutine موجود بود.result
دسترسی دارد. این کار را با تعریف یک متغیر محلی جدید در هر تکرار حلقه انجام میدهیم.for _, result := range collections {
m := result // یک کپی از `result` ایجاد میکنیم
go func() {
fmt.Println(m.Title) // حالا goroutine به کپی مستقل دسترسی دارد
}()
}
go func(m articleapp.NewArticle) {
// کد داخل goroutine
}(m)
result
کپی شده و به عنوان پارامتر m
به تابع ناشناس ارسال میشود.result
دسترسی دارد.result
مستقیماً استفاده شود، goroutineها به یک مرجع مشترک از این متغیر دسترسی دارند.m
) و ارسال آن به تابع ناشناس، هر goroutine یک نسخه مستقل از مقدار را دارد.collections := []articleapp.NewArticle{
{Title: "A"}, {Title: "B"}, {Title: "C"},
}
for _, result := range collections {
go func() {
fmt.Println(result.Title) // ممکن است همه goroutineها مقدار "C" را چاپ کنند
}()
}
for _, result := range collections {
go func(m articleapp.NewArticle) {
fmt.Println(m.Title) // هر goroutine مقدار درست را چاپ میکند
}(result)
}
(m)
:result
ایجاد میکند.31 Dec, 12:04
30 Dec, 09:45
29 Dec, 06:31
28 Dec, 10:01
24 Dec, 07:09
22 Dec, 07:17
21 Dec, 15:09
version: 2
updates:
- package-ecosystem: ""
directory: "/" # Location of package manifests
schedule:
interval: "weekly"
npm
برای پروژههای جاوااسکریپت.pip
برای پروژههای پایتون.gomod
برای پروژههای Go.docker
برای بهروزرسانی تصاویر Docker./
به این معنی است که Dependabot باید فایلها را از ریشه پروژه بررسی کند.daily
: بهروزرسانیهای روزانه.weekly
: بهروزرسانیهای هفتگی.monthly
: بهروزرسانیهای ماهانه.version: 2
updates:
- package-ecosystem: "gomod"
directory: "/"
schedule:
interval: "weekly"
go.mod
را بررسی کند.go.mod
در ریشه پروژه است.19 Dec, 07:36
20-30
مناسب است.5-10
مناسب است.semaphore
باید برابر یا کمی بیشتر از تعداد هستههای CPU باشد.semaphore
انتخاب کنید (مثلاً 50 یا بیشتر).semaphore
را متناسب با محدودیت حافظه تنظیم کنید.5-10
.semaphore
را بهطور خودکار بر اساس تعداد هستههای CPU تنظیم کنید:import "runtime"
numCPU := runtime.NumCPU()
semaphore := make(chan struct{}, numCPU*2) // 2 برابر تعداد هستهها
semaphore
را برابر با تعداد هستههای CPU تنظیم کنید.18 Dec, 11:30
18 Dec, 05:30
17 Dec, 11:30
17 Dec, 05:30
15 Dec, 05:56
14 Dec, 08:16
math
در Python برای محاسبات ریاضی.fmt
در Go برای قالببندی و چاپ.11 Dec, 16:42
11 Dec, 06:42
const
) باید یک مقدار قابل محاسبه در زمان کامپایل (compile-time) باشد، اما یک مقدار اشارهگر به دلیل ماهیت پویا نمیتواند در یک ثابت تعریف شود.var DockerClient *client.Client
است، زیرا مقدار اشارهگرها و متغیرهایی که به منابع خارجی (مانند Docker) وابسته هستند، باید در زمان اجرا تنظیم شوند.09 Dec, 07:18
08 Dec, 16:02
08 Dec, 11:30
08 Dec, 10:39
08 Dec, 05:30
07 Dec, 11:38
07 Dec, 11:30
07 Dec, 05:30
06 Dec, 11:30
06 Dec, 05:30
05 Dec, 11:30
05 Dec, 05:30
04 Dec, 11:30
04 Dec, 06:05
04 Dec, 05:30
03 Dec, 05:51
نام و نام خانوادگی (اجباری)
🎯مدت سابقه کار (اجباری)
🎯لینکدین (اختیاری)
🎯گیتهاب (اختیاری)
🎯محل سکونت (اجباری)
🎯امکان نقل مکان برای کار دارم یا خیر
(اجباری)
03 Dec, 05:30
02 Dec, 11:30
02 Dec, 05:30
01 Dec, 11:30
01 Dec, 05:30
30 Nov, 17:51
30 Nov, 17:50
30 Nov, 11:30
30 Nov, 05:30
29 Nov, 13:30
29 Nov, 11:30
29 Nov, 05:30
28 Nov, 11:30
28 Nov, 05:30
27 Nov, 11:30
27 Nov, 06:47
27 Nov, 05:30
26 Nov, 11:30
26 Nov, 05:30
25 Nov, 11:30
25 Nov, 05:30
24 Nov, 10:38
24 Nov, 10:22
نام و نام خانوادگی (اجباری)
🎯مدت سابقه کار (اجباری)
🎯لینکدین (اختیاری)
🎯گیتهاب (اختیاری)
🎯محل سکونت (اجباری)
🎯امکان نقل مکان برای کار دارم یا خیر
(اجباری)
24 Nov, 06:51
24 Nov, 05:30
23 Nov, 11:30
23 Nov, 05:30
22 Nov, 15:18
22 Nov, 11:30
22 Nov, 05:30
21 Nov, 11:30
21 Nov, 05:30
20 Nov, 11:30
20 Nov, 05:30
19 Nov, 11:30
19 Nov, 05:30
18 Nov, 11:30
18 Nov, 05:30
17 Nov, 11:30
17 Nov, 05:30
16 Nov, 11:30
15 Nov, 12:30
15 Nov, 11:39
15 Nov, 05:30
14 Nov, 13:05
12 Nov, 17:18
12 Nov, 05:30
11 Nov, 11:30
11 Nov, 08:14
11 Nov, 05:30
10 Nov, 11:30
10 Nov, 05:30
09 Nov, 21:31
09 Nov, 11:50
09 Nov, 11:30
09 Nov, 06:28
09 Nov, 05:30
08 Nov, 20:12
08 Nov, 11:30
08 Nov, 05:30
07 Nov, 11:30
06 Nov, 11:30
06 Nov, 05:30
05 Nov, 11:30
05 Nov, 06:06
05 Nov, 05:57
defer
اجرا میشوند.defer
صرفنظر میکند، بنابراین منابع ممکن است آزاد نشوند.05 Nov, 05:53
05 Nov, 05:30
04 Nov, 11:54
04 Nov, 11:30
04 Nov, 05:30
03 Nov, 11:30
03 Nov, 05:30
02 Nov, 11:30
02 Nov, 10:57
02 Nov, 05:30
01 Nov, 11:30
01 Nov, 05:30
31 Oct, 11:30
31 Oct, 05:30
30 Oct, 11:30
30 Oct, 05:30
29 Oct, 12:14
28 Oct, 16:13
28 Oct, 15:43
context.WithTimeout
و context.WithDeadline
، باید به نحوهی پیادهسازی آنها در کتابخانهی context
و چگونگی استفاده از تایمرها در Go توجه کنیم. context
پایهای ساخته میشوند، اما تفاوت اصلی آنها در نحوهی مدیریت زمان و استفاده از تایمرهای داخلی است.WithTimeout
و WithDeadline
با ایجاد یک derived context
(مشتقشده از context اصلی) کار میکنند. این context جدید مشابه context اصلی است، اما به جای آن که تا انتهای عمر برنامه معتبر باشد، در یک زمان مشخص منقضی میشود. مکانیزم داخلی به این صورت است:WithTimeout
**: time.Now()
) شروع به شمارش میکند و بعد از اتمام مدت زمان مشخص شده، context منقضی میشود. Done
) ارسال میکند.WithDeadline
**: WithTimeout
است، اما به جای این که مدت زمان از حالا محاسبه شود، زمانی ثابت برای خاتمه داده میشود. Goroutine مشابهی برای زمان دقیق پایان شروع میشود. این تابع میتواند مفید باشد در مواقعی که باید عملیات حتماً قبل از یک زمان خاص خاتمه یابد.time.AfterFunc
یا time.NewTimer
در Go پیادهسازی میشوند. تایمر بهگونهای عمل میکند که وقتی زمان مشخص شده به پایان برسد، کانال Done
فعال شده و پیام خاتمه ارسال میشود. در این زمان، عملیات مرتبط باید متوقف شود و با بررسی کانال Done
از ادامهی کار بازماند.cancel
بازگردانده میشوند. این تابع cancel
به شما اجازه میدهد به صورت دستی context را قبل از پایان زمان آن لغو کنید. وقتی cancel
فراخوانی شود، تایمر مربوط به context متوقف شده و کانال Done
نیز بسته میشود. این مکانیزم به شما کمک میکند تا منابع استفادهشده توسط تایمرها را پاکسازی کنید و از اجرای بیمورد جلوگیری نمایید.ctx.Done()
بررسی کنید که آیا context منقضی شده یا خیر. این تابع یک کانال بازمیگرداند که در صورت انقضای context، بسته میشود و به goroutineها سیگنال میدهد که عملیات فعلی را خاتمه دهند. این سیگنالدهی از طریق select
یا بررسی مستقیم کانال انجام میشود.WithTimeout
به کمک WithDeadline
**context
، پیادهسازی WithTimeout
به صورت مستقیم از WithDeadline
استفاده میکند:func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc) {
return WithDeadline(parent, time.Now().Add(timeout))
}
time.Now()
) را به timeout
اضافه کرده و آن را به WithDeadline
ارسال میکند. به همین دلیل، WithTimeout
در واقع یک shortcut برای WithDeadline
است.WithDeadline
**WithDeadline
شما میتوانید یک زمان دقیق برای انقضا مشخص کنید. مثلاً میتوانید تعیین کنید که context در ساعت مشخصی منقضی شود، بدون توجه به این که در حال حاضر چقدر زمان باقیمانده است. این ویژگی برای مواردی مفید است که نیاز دارید چندین عملیات به طور همزمان و هماهنگ با یک deadline خاص به پایان برسند.WithTimeout
برای محدود کردن مدت زمان یک عملیات مفید است.WithDeadline
برای تعیین یک زمان دقیق (مانند یک deadline واقعی) استفاده میشود.28 Oct, 15:28
context.WithTimeout
و context.WithDeadline
در نحوهی مدیریت زمانبندی و خاتمهی contextها در Go است:context.WithTimeout
**:context.WithTimeout(ctx, 5*time.Second)
فراخوانی شود، context پس از ۵ ثانیه منقضی میشود.context.WithDeadline
**:context.WithDeadline(ctx, time.Now().Add(5*time.Second))
فراخوانی شود، context در لحظهی دقیق مشخص شده (۵ ثانیه بعد) منقضی میشود.WithTimeout
**: WithTimeout
استفاده میشود.WithDeadline
**:WithDeadline
استفاده پیادهسازی داخWithTimeout **WithTimeout
** به عنوان یک shortcut برای WithDeadline
عمل میکند و در واقع از WithDeadline
استفاده میکند تا زمانی که مدت مشخص شده به پایان برسد. به این معنا که WithTimeout(ctx, d)
معادل WithDeadline(ctx, time.Now().Add(d))
است.WithDeadline
**WithDeadline
انعطاف بیشتری فراهم میکند، زیرا میتوانید زمان مشخصی را به عنوان نقطکاربردهای رایج. **کاربردهای رایج**context.WithTimeout
** معمولاً برای تعیین یک بازه زمانی ثابت برای خاتمه دادن به عملیاتی مانند درcontext.WithDeadline**context.WithDeadline
** اغلب در سیستمهای توزیع شده یا عملیاتی که یک زمانبندی خاص برای اتمام دارند، کاربرد دارد.// WithTimeout: منقضی شدن پس از 5 ثانیه
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
// WithDeadline: منقضی شدن در یک زمان دقیق
ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(5*time.Second))
defer cancel()
28 Oct, 14:24
28 Oct, 14:23
28 Oct, 11:30
28 Oct, 07:41
28 Oct, 05:30
27 Oct, 21:30
27 Oct, 16:31
27 Oct, 11:30
27 Oct, 05:30
26 Oct, 11:30
26 Oct, 05:30
25 Oct, 05:30
24 Oct, 11:30
24 Oct, 05:30
23 Oct, 05:30
22 Oct, 11:30
22 Oct, 05:30
21 Oct, 11:30
21 Oct, 07:56
21 Oct, 05:30
20 Oct, 11:30
20 Oct, 05:30
19 Oct, 11:30
19 Oct, 05:30
18 Oct, 11:30
18 Oct, 05:30
17 Oct, 11:30
16 Oct, 11:30
16 Oct, 05:40
16 Oct, 05:30
15 Oct, 11:30
15 Oct, 05:30
14 Oct, 11:30
14 Oct, 05:30
13 Oct, 11:30
13 Oct, 06:36
13 Oct, 05:30
12 Oct, 18:04
12 Oct, 11:30