亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

Table of Contents
1. Using map[T]struct{} for a Type-Safe Set
Example Usage
Why struct{} instead of bool ?
Alternative: Simple Map-Based Set (Without Struct)
Notes
Thread-Safe Version (Optional)
Home Backend Development Golang How do you implement a set data structure in Go?

How do you implement a set data structure in Go?

Jul 31, 2025 am 09:41 AM
go 集合數據結構

Go does not have built-in collection types, but it can achieve efficient and type-safe collections through map[T]struct{}. 1. Use map[T]struct{} to implement type-safe collections: define a generic Set structure and provide Add, Remove, Contains, Size and Values methods; 2. struct{} as a value type is more efficient than bool because of its zero memory overhead; 3. You can directly use map[string]struct{} to implement simple collection operations; 4. If concurrency security is required, you can combine sync.RWMutex encapsulation; 5. Note that only comparable types can be used as keys, and native map operations are not thread-safe. This method is concise, efficient and in line with Go language habits.

How do you implement a set data structure in Go?

In Go, there's no built-in set data structure, but you can easily implement one using a map with keys of the desired type and struct{} (or bool ) as the value. The most common and idiomatic way is to use map[T]struct{} because struct{} takes up zero bytes, making it memory-efficient.

How do you implement a set data structure in Go?

Here's how you can implement a basic set in Go:

1. Using map[T]struct{} for a Type-Safe Set

 type Set[T comparable] struct {
    items map[T]struct{}
}

func NewSet[T comparable]() *Set[T] {
    return &Set[T]{
        items: make(map[T]struct{}),
    }
}

func (s *Set[T]) Add(value T) {
    s.items[value] = struct{}{}
}

func (s *Set[T]) Remove(value T) {
    delete(s.items, value)
}

func (s *Set[T]) Contains(value T) bool {
    _, exists := s.items[value]
    Return exists
}

func (s *Set[T]) Size() int {
    return len(s.items)
}

func (s *Set[T]) Values() []T {
    values := make([]T, 0, len(s.items))
    for item := range s.items {
        values = append(values, item)
    }
    Return values
}

Example Usage

 set := NewSet[string]()
set.Add("apple")
set.Add("banana")
set.Add("apple") // Duplicate, will be ignored

fmt.Println(set.Contains("apple")) // true
fmt.Println(set.Size()) // 2

set.Remove("apple")
fmt.Println(set.Contains("apple")) // false

Why struct{} instead of bool ?

  • struct{} takes zero memory , so it's more efficient than bool (which takes 1 byte).
  • You're only using the key to represent membership — the value is irrelevant.

Alternative: Simple Map-Based Set (Without Struct)

If you don't need a dedicated type, you can use a raw map:

How do you implement a set data structure in Go?
 set := make(map[string]struct{})

// Add
set["hello"] = struct{}{}

// Check
if _, exists := set["hello"]; exists {
    // present
}

// Remove
delete(set, "hello")

Notes

  • Go generics (introduced in 1.18) allows you to make the set reusable for any comparable type.
  • Only comparable types can be keys in maps (so you can't use slices, maps, or functions in a set).
  • This implementation is not thread-safe. For concurrent use, wrap it with a sync.RWMutex .

Thread-Safe Version (Optional)

 import "sync"

type ConcurrentSet[T comparable] struct {
    items map[T]struct{}
    mu sync.RWMutex
}

func (s *ConcurrentSet[T]) Add(value T) {
    s.mu.Lock()
    defer s.mu.Unlock()
    s.items[value] = struct{}{}
}

func (s *ConcurrentSet[T]) Contains(value T) bool {
    s.mu.RLock()
    defer s.mu.RUnlock()
    _, exists := s.items[value]
    Return exists
}

Basically, use map[T]struct{} with generics to make a clean, reusable, and efficient set. It's simple, fast, and idiomatic Go.

The above is the detailed content of How do you implement a set data structure in Go?. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undress AI Tool

Undress AI Tool

Undress images for free

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Developing Kubernetes Operators in Go Developing Kubernetes Operators in Go Jul 25, 2025 am 02:38 AM

The most efficient way to write a KubernetesOperator is to use Go to combine Kubebuilder and controller-runtime. 1. Understand the Operator pattern: define custom resources through CRD, write a controller to listen for resource changes and perform reconciliation loops to maintain the expected state. 2. Use Kubebuilder to initialize the project and create APIs to automatically generate CRDs, controllers and configuration files. 3. Define the Spec and Status structure of CRD in api/v1/myapp_types.go, and run makemanifests to generate CRDYAML. 4. Reconcil in the controller

How to implement a set data structure efficiently in Go? How to implement a set data structure efficiently in Go? Jul 25, 2025 am 03:58 AM

Go does not have a built-in collection type, but it can be implemented efficiently through maps. Use map[T]struct{} to store element keys, empty structures have zero memory overhead, and the implementation of addition, inspection, deletion and other operations are O(1) time complexity; in a concurrent environment, sync.RWMutex or sync.Map can be combined to ensure thread safety; in terms of performance, memory usage, hashing cost and disorder; it is recommended to encapsulate Add, Remove, Contains, Size and other methods to simulate standard collection behavior.

Building High-Performance Microservices with Go Building High-Performance Microservices with Go Jul 25, 2025 am 04:32 AM

UselightweightrouterslikeChiforefficientHTTPhandlingwithbuilt-inmiddlewareandcontextsupport.2.Leveragegoroutinesandchannelsforconcurrency,alwaysmanagingthemwithcontext.Contexttopreventleaks.3.OptimizeservicecommunicationbyusinggRPCwithProtocolBuffers

Building and Deploying Go Applications with Docker Building and Deploying Go Applications with Docker Jul 25, 2025 am 04:33 AM

Usemulti-stageDockerbuildstocreatesmall,secureimagesbycompilingtheGobinaryinabuilderstageandcopyingittoaminimalruntimeimagelikeAlpineLinux,reducingsizeandattacksurface.2.Optimizebuildperformancebycopyinggo.modandgo.sumfirsttoleverageDockerlayercachin

Integrating Go with Kafka for Streaming Data Integrating Go with Kafka for Streaming Data Jul 26, 2025 am 08:17 AM

Go and Kafka integration is an effective solution to build high-performance real-time data systems. The appropriate client library should be selected according to needs: 1. Priority is given to kafka-go to obtain simple Go-style APIs and good context support, suitable for rapid development; 2. Select Sarama when fine control or advanced functions are required; 3. When implementing producers, you need to configure the correct Broker address, theme and load balancing strategy, and manage timeouts and closings through context; 4. Consumers should use consumer groups to achieve scalability and fault tolerance, automatically submit offsets and use concurrent processing reasonably; 5. Use JSON, Avro or Protobuf for serialization, and it is recommended to combine SchemaRegistr

A Guide to Go's Templating Engine A Guide to Go's Templating Engine Jul 26, 2025 am 08:25 AM

Go's template engine provides powerful dynamic content generation capabilities through text/template and html/template packages, where html/template has automatic escape function to prevent XSS attacks, so it should be used first when generating HTML. 1. Use {{}} syntax to insert variables, conditional judgments and loops, such as {{.FieldName}} to access structure fields, {{if}} and {{range}} to implement logical control. 2. The template supports Go data structures such as struct, slice and map, and the dot in the range represents the current iterative element. 3. The named template can be defined through define and reused with the template directive. 4.ht

How to pass a slice to a function in Go? How to pass a slice to a function in Go? Jul 26, 2025 am 07:29 AM

When passing slices in Go, it is usually passed directly by value, because the slice header contains a pointer to the underlying array, and copying the slice header will not copy the underlying data, so the modification of elements in the function will affect the original slice; 1. If you need to reassign or adjust the slice length within the function and make the change take effect, you should pass the slice pointer; 2. Otherwise, you can pass the slice directly without using a pointer; 3. If reallocation may be triggered when using append, you must pass through the pointer to make the updated slice visible to the outside. Therefore, unless the entire slice is to be replaced, the slice should be passed in the form of a value.

what does go vet do what does go vet do Jul 26, 2025 am 08:52 AM

govetcatchescommonlogicalerrorsandsuspiciousconstructsinGocodesuchas1)misuseofprintf-stylefunctionswithincorrectarguments,2)unkeyedstructliteralsthatmayleadtoincorrectfieldassignments,3)sendingtoclosedchannelswhichcausespanics,4)ineffectiveassignment

See all articles