Skip to content

Quick Start

Let’s run your first similarity analysis on a Go project. We’ll use a simple example to demonstrate the basic functionality.

Create a simple Go project with some duplicate code:

Terminal window
mkdir test-project
cd test-project
go mod init test-project

Create a file duplicate.go:

package main
import "fmt"
func processUserDataV1(name string, age int) {
if name == "" {
fmt.Println("Name is required")
return
}
if age < 0 {
fmt.Println("Age must be positive")
return
}
fmt.Printf("Processing user: %s, age: %d\n", name, age)
}
func processUserDataV2(username string, userAge int) {
if username == "" {
fmt.Println("Name is required")
return
}
if userAge < 0 {
fmt.Println("Age must be positive")
return
}
fmt.Printf("Processing user: %s, age: %d\n", username, userAge)
}
func main() {
processUserDataV1("Alice", 25)
processUserDataV2("Bob", 30)
}

Run similarity-go on your test project:

Terminal window
./bin/similarity-go ./

You should see output similar to:

🔍 Analyzing Go files in: ./
📊 Found 2 similar functions with 85% similarity
Function Similarity Report
==========================
📄 File: duplicate.go
🔗 Similar Functions:
• processUserDataV1 (lines 5-15)
• processUserDataV2 (lines 17-27)
📈 Similarity Score: 85.7%
📋 Differences:
• Parameter names: name/username, age/userAge
• Function names: processUserDataV1/processUserDataV2
💡 Suggestion: Consider refactoring to use a single function

You can adjust the sensitivity by changing the similarity threshold:

Terminal window
# Only show similarities above 90%
./bin/similarity-go --threshold 0.9 ./
# Show more similarities (above 70%)
./bin/similarity-go --threshold 0.7 ./

similarity-go supports multiple output formats:

Terminal window
# JSON output for programmatic processing
./bin/similarity-go --format json ./
# YAML output
./bin/similarity-go --format yaml ./
# Detailed human-readable output (default)
./bin/similarity-go ./
Terminal window
# Analyze only the src directory
./bin/similarity-go ./src
# Analyze multiple directories
./bin/similarity-go ./cmd ./internal ./pkg
Terminal window
# Use with custom workers and verbose output
./bin/similarity-go --workers 4 --verbose ./

Add similarity checking to your CI pipeline:

# GitHub Actions example
- name: Check code similarity
run: |
./bin/similarity-go --threshold 0.8 --format json ./ > similarity-report.json
if [ -s similarity-report.json ]; then
echo "High similarity detected, consider refactoring"
exit 1
fi

similarity-go provides several key metrics:

  • Similarity Score: Percentage indicating how similar two functions are
  • Line Numbers: Exact location of similar code blocks
  • Differences: What makes the functions different
  • Suggestions: Recommendations for refactoring

For complex projects, create a .similarity-go.yaml configuration file:

For more advanced configuration, you can create a configuration file, but the current version primarily uses command-line flags.

Terminal window
./bin/similarity-go --threshold 0.8 --format json --workers 8 ./

Now that you’re familiar with the basics:

  1. Explore CLI Commands for advanced options
  2. Learn about Configuration for complex projects
  3. Understand the AST Analysis algorithms
  4. Check out Integration Examples