структура проекта:
projectName:
-remote
-remote_event
-roblox_services
-collectionservice
-collectionservice.go
-services
-services
-errors
-errors.go

// file: main.go
package main

import (
"ROBLOX-GO/roblox_services/collectionservice"
"ROBLOX-GO/services"
"fmt"
)

func main() {
// Инициализация CollectionService
collectionService := services.GetService*collectionservice.CollectionService
collectionService.RegisterTag("Enemy", "Goblin")
collectionService.RegisterTag("Enemy", "Orc")
collectionService.RegisterTag("Friend", "Elf")


    enemies := collectionService.GetTagged("Enemy")
    fmt.Println("Enemies:", enemies)

    friends := collectionService.GetTagged("Friend")
    fmt.Println("Friends:", friends)
}

package remote

package collectionservice

import (
"ROBLOX-GO/services"
"sync"
)

// CollectionService имитирует Roblox CollectionService
type CollectionService struct {
taggedObjects map[string][]interface{}
mutex sync.RWMutex
}

// NewCollectionService создает новый экземпляр CollectionService
func NewCollectionService() *CollectionService {
return &CollectionService{
taggedObjects: make(map[string][]interface{}),
}
}

// RegisterTag регистрирует объект с тегом
func (cs *CollectionService) RegisterTag(tag string, obj interface{}) {
cs.mutex.Lock()
defer cs.mutex.Unlock()
cs.taggedObjects[tag] = append(cs.taggedObjects[tag], obj)
}

// GetTagged возвращает все объекты с указанным тегом
func (cs *CollectionService) GetTagged(tag string) []interface{} {
cs.mutex.RLock()
defer cs.mutex.RUnlock()
return cs.taggedObjects[tag]
}

// Инициализация и регистрация сервиса при импорте пакета
func init() {
cs := NewCollectionService()
services.Register("CollectionService", cs)
}

// file: services/services.go
package services

import (
"log"
"sync"
)

// Service - пустой интерфейс для всех сервисов
type Service interface{}

// serviceRegistry - регистр сервисов
var (
serviceRegistry = make(map[string]Service)
registryMutex = &sync.RWMutex{}
)

// Register регистрирует сервис с указанным именем
func Register(name string, service Service) {
registryMutex.Lock()
defer registryMutex.Unlock()
serviceRegistry[name] = service
}

// GetService возвращает сервис по имени с типизацией
func GetService[T Service](name string) T {
registryMutex.RLock()
defer registryMutex.RUnlock()
service, exists := serviceRegistry[name]
if !exists {
log.Fatalf("service not found: %s", name)
}
typedService, ok := service.(T)
if !ok {
log.Fatalf("invalid service type for %s", name)
}
return typedService
}

package errors

import (
	"fmt"
	"log"
)

// CustomError определяет интерфейс для кастомных ошибок
type CustomError interface {
	Error() string
	Code() int
}

// GenericError является примером кастомной ошибки
type GenericError struct {
	Message string
	CodeVal int
}

// Error возвращает строковое сообщение ошибки
func (e *GenericError) Error() string {
	return e.Message
}

// Code возвращает код ошибки
func (e *GenericError) Code() int {
	return e.CodeVal
}

// NewGenericError создаёт новую GenericError
func NewGenericError(message string, code int) *GenericError {
	return &GenericError{
		Message: message,
		CodeVal: code,
	}
}

// HandleError принимает CustomError и обрабатывает его
func HandleError(err CustomError) {
	if err != nil {
		log.Printf("Error [%d]: %s\n", err.Code(), err.Error())
		// Здесь можно добавить дополнительную обработку, например, отправку в мониторинг
	}
}

// WrapError оборачивает стандартную ошибку в CustomError
func WrapError(message string, code int, err error) CustomError {
	return NewGenericError(fmt.Sprintf("%s: %v", message, err), code)
}


напиши реалицацию remote event но на golang то етсь сделай registerremoteevnt("Name1") remote.fireserver("Name1", ... - аргументы) remote("Name1").OnServerevent(... - аргументы) и тоже самея для вызова на клиент onclientevent fireclient для принятия и отправки запросов используй tcp сервер он должен быть один на все remote event и пакет main должен быть чистым то есь обработка всех ошибак должна быть в других пакетах то есть errors

СОЗДАВАЙ ТОЛЬКО ОДИН TCP СЕРВЕР ВОТ ТЕБЕ ПРИМЕР ДВУХ КОДОВ КАК ДОЛЖЕН РАБОАТЬ REMOTE EVENT


main.go

package main

import (
	"ROBLOX-GO/remote"
	"fmt"
	"time"
)

func main() {

	remote.StartServer()

	remote.RegisterRemoteEvent("Name1")
	remote.RegisterRemoteEvent("Name1Response")

	remote.OnServerEvent("Name1", func(args []interface{}) {
		fmt.Println("Received Name1 event from client with args:", args)

		remote.FireClient("Name1Response", "Acknowledged by server", 200)

	})

	go func() {
		for {
			time.Sleep(1 * time.Second)
			remote.FireServer("Name1", "Hello from server", 42)
		}
	}()

	select {}
}

client.go

package main

import (
	"ROBLOX-GO/remote"
	"fmt"
)

func main() {

	remote.OnClientEvent("Name1Response", func(args []interface{}) {
		fmt.Println("Received Name1Response event with args:", args)
		remote.FireServer("Name1", "Hello from client", 100)
	})

	select {}
}



fireserver и fireclient это обсалютно тоже самое но только с разными названиями и onserverevent и onclient event это тоже обсалютно одинаковое