برنامه نویسی

⚡️ سرعت توسعه را افزایش دهید؟ کتابخانه مفیدی از پرکاربردترین قطعه‌ها برای برنامه‌های Go

معرفی

خوب، سلام، دوستان DEV من! 👋

خیلی وقت بود که وقت و فرصتی برای نوشتن این وبلاگ نداشتم. اما به هر حال از شما ممنونم که با من ماندید و سوال پرسیدید!

من واقعا آن را قدردانی می کنم. شما را دوست دارم مردم! 😘

امروز قصد دارم در مورد پروژه کوچک شخصی خود که اخیراً در معرض دید عموم قرار داده ام به شما بگویم. اما در تمام این سال ها به من کمک کرد تا برنامه های Go را با بیشترین سرعت ممکن و با رعایت کامل اصل DRY (تکرار نکن) بنویسم.

شیفته؟ پس خوش آمدید، جالب خواهد بود! 👇

📝 فهرست مطالب

انگیزه در ایجاد کتابخانه

همانطور که قبلاً از مقالات قبلی من می دانید، من رویکردی برای توسعه نرم افزار دارم که زندگی توسعه دهنده را کاملاً آسان می کند.

اگر می توانید کارآمدترین راه حل را یک بار به کتابخانه اضافه کنید و آن را در جایی که نیاز دارید وارد کنید، چرا همان قطعه را تکرار کنید، مثلاً برای ترجمه یک تکه بایت به یک رشته؟ دقیقا درسته! این یک بار شناختی غیر ضروری برای کسانی است که کد شما را در آینده می خوانند (و همچنین برای شما).

به همین دلایل است که کتابخانه Go Snippet (یا gosl به طور خلاصه) مجموعه ای از قطعات را برای کار با عملیات معمول در برنامه های Go شما با یک API فوق العاده کاربرپسند و کارآمدترین عملکرد ارائه می دهد.

↑ فهرست مطالب

استفاده اولیه از کتابخانه

بله، به سادگی اضافه کنید gosl به پروژه شما:

go get github.com/koddr/gosl
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

قطعه مورد نیاز را به کد خود اضافه کنید، مانند این:

import (
   fmt
   log

   "github.com/koddr/gosl"
)

func main() {
    b := []byte("Hello, World!")

    s, err := gosl.ToString(b) // convert byte slice to string
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println(s)
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

یا برای دسترسی به اسنیپت‌ها به‌عنوان ساختار جاسازی‌شده، به این شکل عمل کنید:

type App struct {
    // ...

    utils    *gosl.Utility                         // add regular snippets
    genUtils *gosl.GenericUtility[any, comparable] // add generic snippets
}

func (a *App) handleSomething(b []byte) error {
    // ...

    s, err := a.utils.ToString(b) // convert byte slice to string
    if err != nil {
        return err
    }

    // ...

    u, err := a.genUtils.Unmarshal(json, model) // unmarshal JSON data to struct
    if err != nil {
        return err
    }

    // ...
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

و شما در حال حاضر در وقت و انرژی خود صرفه جویی می کنید. به من اعتماد کن ✌️

↑ فهرست مطالب

Gosl صرفه جویی در وقت و انرژی شما

قطعه های منظم

تکه های منظم از gosl بسته‌ها با هدف حل یک کار واحد با کمترین تخصیص ممکن از منابع دستگاه شما هستند.

Concat

رشته ها را به هم متصل کنید s به یک رشته:

s1 := "this "
s2 := "is "
s3 := "my string"

s := gosl.Concat(s1, s2, s3)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

حاوی CaseInsensitive است

اگر رشته را گزارش دهید substr درون رشته است s (به طور پیش فرض به حروف بزرگ و کوچک حساس نیست):

s := "Hello, WORLD!"
substr := "r"

b := gosl.ContainsCaseInsensitive(s, substr)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

RandomString

یک (واقعا) رشته تصادفی با اندازه معین:

size := 8

s, err := gosl.RandomString(size)
if err != nil {
    log.Fatal(err)
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ToString

تبدیل تکه بایت b به رشته یا خطا:

b := []byte("Hello, World!")

s, err := gosl.ToString(b)
if err != nil {
    log.Fatal(err)
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ToBytes

تبدیل رشته s به تکه بایت یا خطا:

s := "Hello, World!"

b, err := gosl.ToBytes(s)
if err != nil {
    log.Fatal(err)
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

↑ فهرست مطالب

قطعه های جهانی

جهانی (یا عمومی) تکه هایی از gosl بسته ها با هدف حل یک کار خاص با کمترین تخصیص ممکن از منابع دستگاه شما هستند، اما می توانند برای تعداد زیادی از انواع کاربر اعمال شوند.

ContainsInSlice

اگر مقدار را گزارش کنید v در برش است s:

s := []string{"one", "two", "three"}
v := "two"

b := gosl.ContainsInSlice(s, v)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ContainsInMap

اگر کلید را گزارش کنید k داخل نقشه است m:

m := map[string]int{"one": 1, "two": 2, "three": 3}
k := "two"

b := gosl.ContainsInMap(m, k)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مارشال

ساختار مارشال user به داده های JSON j (برش بایت) یا خطا:

type user struct {
    ID   int    `json:"id"`
    Name string `json:"name"`
}

u := &user{}

j, err := gosl.Marshal(u)
if err != nil {
    log.Fatal(err)
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

💡 این قطعه یک جایگزین 100% سازگار با استاندارد است encoding/json کتابخانه

از مارشال

داده‌های JSON را حذف کنید j (برش بایت) برای ساخت user یا خطا:

type user struct {
    ID   int    `json:"id"`
    Name string `json:"name"`
}

j := []byte(`{"id":1,"name":"Viktor"}`)
m := &user{}

u, err := gosl.Unmarshal(j, m)
if err != nil {
    log.Fatal(err)
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

💡 این قطعه (همچنین) یک جایگزین 100% سازگار با استاندارد است encoding/json کتابخانه

↑ فهرست مطالب

معیارها

نتایج من برای همه قطعه‌های موجود در کتابخانه (محل آزمایش Apple MacBook Air M1، 16 گیگابایت رم، macOS 13.3.1 است):

BenchmarkConcat_String2-8                           58663996            20.06 ns/op       32 B/op          1 allocs/op
BenchmarkConcat_String8-8                           26829356            44.16 ns/op      128 B/op          1 allocs/op
BenchmarkConcat_String32-8                           9321133           127.8 ns/op       448 B/op          1 allocs/op

BenchmarkToString_HelloWorld-8                      100000000           10.56 ns/op       16 B/op          1 allocs/op

BenchmarkToBytes_HelloWorld-8                       1000000000           0.6288 ns/op      0 B/op          0 allocs/op

BenchmarkRandomString_Size1-8                        3488678           344.6 ns/op         6 B/op          3 allocs/op
BenchmarkRandomString_Size8-8                        3394548           353.3 ns/op        24 B/op          3 allocs/op
BenchmarkRandomString_Size64-8                       2313856           517.9 ns/op       160 B/op          3 allocs/op
BenchmarkRandomString_Size512-8                      1423572           838.9 ns/op      1280 B/op          3 allocs/op
BenchmarkRandomString_Size4096-8                      185337          6350 ns/op       10240 B/op          3 allocs/op

BenchmarkMarshal_StructField_4-8                     8584442           139.9 ns/op        48 B/op          3 allocs/op
BenchmarkMarshal_StructField_16-8                    2838062           420.8 ns/op       192 B/op          3 allocs/op

BenchmarkUnmarshal_StructField_4-8                   6960462           169.3 ns/op        32 B/op          3 allocs/op
BenchmarkUnmarshal_StructField_16-8                   764182          1553 ns/op         864 B/op         45 allocs/op

BenchmarkContainsCaseInsensitive_HelloWorld-8       24856041            48.46 ns/op       16 B/op          1 allocs/op
BenchmarkContainsCaseInsensitive_LoremIpsum-8        1797150           695.9 ns/op       448 B/op          1 allocs/op

BenchmarkContainsInSlice-8                          122999034            9.758 ns/op       0 B/op          0 allocs/op

BenchmarkContainsInMap-8                            19123504            62.61 ns/op        0 B/op          0 allocs/op
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

↑ فهرست مطالب

یک همکاری برد-برد

من از هر کاربر Dev.to (و مسلماً وبلاگ حقیر من) دعوت می کنم تا در این پروژه شرکت کنند! بیا کار کنیم با یکدیگر برای ایجاد بزرگترین و مفیدترین کتابخانه قطعات برای برنامه های Go امروز در وب.

  • سوال بپرسید و ویژگی های خود را به بخش مسائل ارسال کنید.
  • قطعات یا بهبودهای خود را در جریان فعلی به بخش Pull requests ارسال کنید.

روابط عمومی و مسائل شما خوش آمدید! با تشکر 😉

↑ فهرست مطالب

عکس و فیلم توسط

PS

اگر می خواهید مقالات بیشتری از این قبیل در این وبلاگ داشته باشید، در زیر نظر خود را ارسال کنید و در من عضو شوید. با تشکر! 😘

و البته، می توانید با کمک مالی در LiberaPay از من حمایت کنید. هر کمک مالی برای نوشتن مقالات جدید و توسعه پروژه های غیرانتفاعی منبع باز برای جامعه استفاده می شود.

پشتیبانی از نویسنده در LiberaPay

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا