Go API Design

Accept Interfaces, Return Structs

بهتره به جای گرفتن یک استراکت یا یک فانکشن ، از یه اینترفیس استفاده کنیم و متد هایی که می خواییم رو اینجوری بگیریم ، انعطاف پذیری خیلی بیشتر میشه


// Define an interface
type Reader interface {
    Read(p []byte) (n int, err error)
}

// A function that accepts an interface and returns a struct
func NewContent(reader Reader) (*ContentResult, error) {

Parameter and Result Objects

به جای گرفتن چند ورودی ، یک استراکت تعریف کنیم و آن را بگیریم

dto embeding

هر لایه باید dto خودش رو داشته باشه ، به هیچ وجه نباید dto شیر بشه یا dto generic داشته باشیم و برای جلو گیری از پیچیدگی یا readundancy میتونیم از موارد زیر استفاده کنیم

  • mapper package : go-napper , mapstructure

  • embeding : Base dto

type BaseDigitalSignature struct {
    ID          string
    CreatedAt   time.Time
    UpdatedAt   time.Time
}

Designing Go Packages

Keeping the File Structure Flat

برای دسترسی آسان به متد ها و ساختار ها ، بهتره تمامی بخش های برنامه که باید در دسترس کلاینت باشد ، در روت پروژه باشد

Organizing Supplementary Features

بهتره بخش های فرعی رو در فولدر ها گذاشت

Directory Structure

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

https://go.dev/doc/modules/layout

Discoverability and Clarity in Naming

مهم ترین چیز نام گذاری متد ها و ساختار برنامه است

Robustness and Potential for Misuse

برنامه جوری نباید باشه که به ارور بخورده

Flexibility and Future-Proofing

باید در نظر داشته باشیم برنامه در آینده گسترش پیدا می کنه و توانایی ورژن زدن و یا گسترش داشته باشه