GoMoji makes it easy to detect, remove, replace, and look up emojis in Go strings.
It solves the common problem that emojis aren't always a single "character"βGoMoji handles them correctly so your string logic just works.
- Installation
- Quick Start
- Features
- Usage Examples
- API Documentation
- Automated Updates
- Performance
- Security
- Feedback
- Contributing
- License
- Go 1.11 or higher (for module support)
go get -u github.com/forPelevin/gomojiCreate a minimal program that detects and removes emojis:
package main
import (
"fmt"
"github.com/forPelevin/gomoji"
)
func main() {
s := "Hello π world π¦"
fmt.Println(gomoji.ContainsEmoji(s)) // true
fmt.Println(gomoji.RemoveEmojis(s)) // "Hello world "
}Then run:
go mod init example.com/hello
go get github.com/forPelevin/gomoji@latest
go run .- π Fast emoji detection in strings
- πͺ Find all emoji occurrences with detailed information
- π Access comprehensive emoji database
- π§Ή Remove emojis from strings
βοΈ Replace emojis with custom charactersβοΈ Custom emoji replacement functions- π§ Detailed emoji information lookup
- π Automated Unicode updates via gomoji-updater
package main
import "github.com/forPelevin/gomoji"
func main() {
hasEmoji := gomoji.ContainsEmoji("hello world π€")
println(hasEmoji) // true
}emojis := gomoji.FindAll("π§ hello π¦ world")
// Returns slice of Emoji structs with detailed informationcleaned := gomoji.RemoveEmojis("π§ hello π¦ world")
println(cleaned) // "hello world"// Replace with a specific character
replaced := gomoji.ReplaceEmojisWith("π§ hello π¦ world", '_')
println(replaced) // "_ hello _ world"
// Replace with custom function
customReplaced := gomoji.ReplaceEmojisWithFunc("π§ hello π¦ world", func(em Emoji) string {
return em.Slug
})
println(customReplaced) // "person-in-steamy-room hello butterfly world"info, err := gomoji.GetInfo("π¦")
if err == nil {
println(info.Slug) // "butterfly"
println(info.UnicodeName) // "E3.0 butterfly"
println(info.Group) // "Animals & Nature"
}type Emoji struct {
Slug string `json:"slug"` // Unique identifier
Character string `json:"character"` // The emoji character
UnicodeName string `json:"unicode_name"` // Official Unicode name
CodePoint string `json:"code_point"` // Unicode code point
Group string `json:"group"` // Emoji group category
SubGroup string `json:"sub_group"` // Emoji subgroup category
}ContainsEmoji(s string) bool- Checks if a string contains any emojiFindAll(s string) []Emoji- Finds all unique emojis in a stringCollectAll(s string) []Emoji- Finds all emojis including repeats (preserves order)RemoveEmojis(s string) string- Removes all emojis from a stringReplaceEmojisWith(s string, c rune) string- Replaces emojis with a specified characterReplaceEmojisWithSlug(s string) string- Replaces emojis with their slugsReplaceEmojisWithFunc(s string, replacer func(Emoji) string) string- Replaces emojis via a custom functionGetInfo(emoji string) (Emoji, error)- Gets detailed information about an emoji; returnsErrStrNotEmojiif not foundAllEmojis() []Emoji- Returns all available emojis
For full reference documentation generated from source, see the package docs on pkg.go.dev: github.com/forPelevin/gomoji.
GoMoji automatically stays up-to-date with the latest Unicode emoji standards through our automated update system:
- Daily Updates: Our GitHub Actions workflow runs daily to check for new Unicode emoji releases
- Automated PRs: When new emoji data is available, automated pull requests are created for review
- Source: Emoji data is fetched from the official Unicode Consortium: https://unicode.org/Public/emoji/latest/
- Tool: Updates are generated using gomoji-updater, a specialized tool for processing Unicode emoji data
GoMoji is designed for high performance, with parallel processing capabilities for optimal speed. Here are the key benchmarks:
| Operation | Sequential Performance | Parallel Performance | Allocations |
|---|---|---|---|
| Contains Emoji | 57.49 ns/op | 7.167 ns/op | 0 B/op, 0 allocs/op |
| Remove Emojis | 1454 ns/op | 201.4 ns/op | 68 B/op, 2 allocs/op |
| Find All | 1494 ns/op | 313.8 ns/op | 288 B/op, 2 allocs/op |
| Get Info | 8.591 ns/op | 1.139 ns/op | 0 B/op, 0 allocs/op |
| Replace With Slug | 3822 ns/op | 602.4 ns/op | 160 B/op, 3 allocs/op |
Full benchmark details:
go test -bench=. -benchmem -v -run Benchmark ./...
goos: darwin
goarch: arm64
pkg: github.com/forPelevin/gomoji
cpu: Apple M1 Pro
BenchmarkContainsEmojiParallel-10 164229604 7.167 ns/op 0 B/op 0 allocs/op
BenchmarkContainsEmoji-10 20967183 57.49 ns/op 0 B/op 0 allocs/op
BenchmarkReplaceEmojisWithSlugParallel-10 2160638 602.4 ns/op 160 B/op 3 allocs/op
BenchmarkReplaceEmojisWithSlug-10 309879 3822 ns/op 160 B/op 3 allocs/op
BenchmarkRemoveEmojisParallel-10 5794255 201.4 ns/op 68 B/op 2 allocs/op
BenchmarkRemoveEmojis-10 830334 1454 ns/op 68 B/op 2 allocs/op
BenchmarkGetInfoParallel-10 989043939 1.139 ns/op 0 B/op 0 allocs/op
BenchmarkGetInfo-10 139558108 8.591 ns/op 0 B/op 0 allocs/op
BenchmarkFindAllParallel-10 4029028 313.8 ns/op 288 B/op 2 allocs/op
BenchmarkFindAll-10 751990 1494 ns/op 288 B/op 2 allocs/op
Note: Benchmarks were performed on Apple M1 Pro processor. Your results may vary depending on hardware.
- This is a string-processing library, not a general-purpose sanitizer. Do not rely on it to prevent XSS or other injection attacks; use a proper HTML/markup sanitizer where needed.
- Emoji detection and replacement operate on Unicode grapheme clusters. Do not assume 1 code point == 1 visible symbol.
- Variation selectors are stripped during processing to normalize output. If your application depends on preserving exact variation selectors, avoid
RemoveEmojis/Replace*or handle this explicitly. - When replacing with slugs, treat the resulting text as untrusted like any other user-controlled string and escape/encode as appropriate for the output context.
- If you need normalization against visually confusable characters, use additional tooling (e.g.,
golang.org/x/textpackages) alongside this library.
- Bug report: please open an issue with a minimal repro and environment details.
- Feature request: suggest an enhancement describing the use case and expected behavior.
Contributions are welcome! Please feel free to submit a Pull Request.
- Follow Goβs style guidelines:
- Keep code formatted and linted: run
make lint-fix(usesgoimports,gofmt, andgolangci-lint). - Add tests for new functionality and fixes; all tests must pass:
make testorgo test ./.... - For performance-sensitive changes, include relevant benchmarks or comparisons (
make bench).
- Fork the repo and create a feature branch.
- Make your changes, run linters and tests locally.
- Open a PR describing the change and linking any related issue: open a pull request.
GoMoji is available under the MIT License. GoMoji source code is available under the MIT License.