mirror of
https://github.com/infiniflow/ragflow.git
synced 2026-07-19 22:21:04 +08:00
### What problem does this PR solve? Feat:Using Go to implement user registration logic ### Type of change - [x] New Feature (non-breaking change which adds functionality)
193 lines
5.0 KiB
Markdown
193 lines
5.0 KiB
Markdown
# Go Naming Best Practices
|
|
|
|
## 1. Package Naming
|
|
|
|
- **All lowercase, no underscores**: `package user`, not `package userService` or `package user_service`
|
|
- **Short and meaningful**: `package http`, `package json`, `package dao`
|
|
- **Avoid plurals**: `package user` not `package users`
|
|
- **Avoid generic names**: Avoid `package util`, `package common`, `package base`
|
|
|
|
```go
|
|
// Recommended
|
|
package user
|
|
package handler
|
|
package service
|
|
|
|
// Not recommended
|
|
package UserService
|
|
package user_service
|
|
package utils
|
|
```
|
|
|
|
## 2. File Naming
|
|
|
|
- **All lowercase, underscore separated**: `user_handler.go`, `user_service.go`
|
|
- **Test files**: `user_handler_test.go`
|
|
- **Platform-specific**: `user_linux.go`, `user_windows.go`
|
|
|
|
```
|
|
user/
|
|
├── user_handler.go
|
|
├── user_service.go
|
|
├── user_dao.go
|
|
└── user_test.go
|
|
```
|
|
|
|
## 3. Directory Naming
|
|
|
|
- **All lowercase, no underscores or hyphens**: `internal/`, `pkg/`, `cmd/`
|
|
- **Short and descriptive**: `handler/`, `service/`, `dao/`
|
|
|
|
```
|
|
project/
|
|
├── cmd/ # Main entry point
|
|
│ └── server_main.go
|
|
├── internal/ # Private code
|
|
│ ├── handler/
|
|
│ ├── service/
|
|
│ ├── dao/
|
|
│ ├── model/
|
|
│ └── middleware/
|
|
├── pkg/ # Public code
|
|
└── api/ # API definitions
|
|
```
|
|
|
|
## 4. Interface Naming
|
|
|
|
- **Single-method interfaces end with "-er"**: `Reader`, `Writer`, `Handler`
|
|
- **Verb form**: `Reader`, `Executor`, `Validator`
|
|
|
|
```go
|
|
// Recommended
|
|
type Reader interface {
|
|
Read(p []byte) (n int, err error)
|
|
}
|
|
|
|
type UserService interface {
|
|
Register(req *RegisterRequest) (*User, error)
|
|
Login(req *LoginRequest) (*User, error)
|
|
}
|
|
|
|
// Not recommended
|
|
type UserInterface interface {}
|
|
type IUserService interface {}
|
|
```
|
|
|
|
## 5. Struct Naming
|
|
|
|
- **CamelCase**: `UserService`, `UserHandler`
|
|
- **Avoid redundant prefixes**: `User` not `UserModel`
|
|
|
|
```go
|
|
// Recommended
|
|
type UserService struct {}
|
|
type UserHandler struct {}
|
|
type RegisterRequest struct {}
|
|
|
|
// Not recommended
|
|
type user_service struct {}
|
|
type SUserService struct {}
|
|
type UserModel struct {}
|
|
```
|
|
|
|
## 6. Method/Function Naming
|
|
|
|
- **CamelCase**
|
|
- **Start with verb**: `GetUser`, `CreateUser`, `DeleteUser`
|
|
- **Boolean returns use Is/Has/Can prefix**: `IsValid`, `HasPermission`
|
|
|
|
```go
|
|
// Recommended
|
|
func (s *UserService) Register(req *RegisterRequest) (*User, error)
|
|
func (s *UserService) GetUserByID(id uint) (*User, error)
|
|
func (s *UserService) IsEmailExists(email string) bool
|
|
|
|
// Not recommended
|
|
func (s *UserService) register_user()
|
|
func (s *UserService) get_user_by_id()
|
|
func (s *UserService) CheckEmailExists() // Should use Is/Has
|
|
```
|
|
|
|
## 7. Constant Naming
|
|
|
|
- **CamelCase**: `const MaxRetryCount = 3`
|
|
- **Enum constants**: `const StatusActive = "active"`
|
|
|
|
```go
|
|
// Recommended
|
|
const (
|
|
StatusActive = "1"
|
|
StatusInactive = "0"
|
|
MaxRetryCount = 3
|
|
)
|
|
|
|
// Not recommended
|
|
const (
|
|
STATUS_ACTIVE = "1" // Not all uppercase
|
|
status_active = "1" // Not all lowercase
|
|
)
|
|
```
|
|
|
|
## 8. Error Variable Naming
|
|
|
|
- **Start with "Err"**: `ErrNotFound`, `ErrInvalidInput`
|
|
|
|
```go
|
|
// Recommended
|
|
var (
|
|
ErrNotFound = errors.New("not found")
|
|
ErrInvalidInput = errors.New("invalid input")
|
|
ErrUnauthorized = errors.New("unauthorized")
|
|
)
|
|
```
|
|
|
|
## 9. Acronyms Keep Consistent Case
|
|
|
|
```go
|
|
// Recommended
|
|
type HTTPHandler struct {}
|
|
var URL string
|
|
func GetHTTPClient() {}
|
|
func ParseJSON() {}
|
|
|
|
// Not recommended
|
|
type HttpHandler struct {}
|
|
var Url string
|
|
func GetHttpClient() {}
|
|
```
|
|
|
|
## 10. Project Structure Naming
|
|
|
|
```
|
|
project-name/
|
|
├── cmd/ # Main programs
|
|
│ └── app_name/
|
|
│ └── main.go
|
|
├── internal/ # Private code
|
|
│ ├── handler/ # HTTP handlers
|
|
│ ├── service/ # Business logic
|
|
│ ├── repository/ # Data access
|
|
│ ├── model/ # Data models
|
|
│ └── config/ # Configuration
|
|
├── pkg/ # Public code
|
|
├── api/ # API definitions
|
|
├── configs/ # Config files
|
|
├── scripts/ # Scripts
|
|
├── docs/ # Documentation
|
|
├── go.mod
|
|
└── go.sum
|
|
```
|
|
|
|
## Summary Table
|
|
|
|
| Type | Rule | Example |
|
|
| -------------- | ----------------------------------- | ------------------- |
|
|
| Package | All lowercase, no underscores | `package user` |
|
|
| File | All lowercase, underscore separated | `user_service.go` |
|
|
| Directory | All lowercase, no separators | `internal/handler/` |
|
|
| Struct | CamelCase, capitalized first letter | `UserService` |
|
|
| Interface | CamelCase, -er suffix | `Reader`, `Writer` |
|
|
| Method | CamelCase, verb prefix | `GetUserByID` |
|
|
| Constant | CamelCase | `MaxRetryCount` |
|
|
| Error Variable | Err prefix | `ErrNotFound` |
|