Table of Contents
Question content
Workaround
Home Backend Development Golang List of common structures/interfaces in Golang

List of common structures/interfaces in Golang

Feb 13, 2024 pm 05:30 PM
network programming

Golang 中的通用结构/接口列表

#php editor Baicao will introduce you to the list of common structures/interfaces in Golang in this article. Golang is an open source programming language that is easy to learn, efficient and reliable. It is widely used in network programming, cloud computing and other fields. In Golang, common structures and interfaces are very important concepts that can help us achieve code reusability and scalability. Through the introduction of this article, I believe readers can better understand and apply the common structures and interfaces in Golang and improve their programming skills.

Question content

Is there a way to get a list of common structures/interfaces in go?

This is what I want to achieve.

<code>package main

type List[T any] struct {
    Elements []T
}

func (f *List[T]) Add(el T) {
    f.Elements = append(f.Elements, el)
}

type ListInterface[T any] interface {
    Add(el T)
}

func main() {
    listOfLists := make([]ListInterface[any], 0)
    listOfLists = append(listOfLists, &List[int]{})
}
</code>
Copy after login

This is the error I get.

cannot use &List[int]{} (value of type *List[int]) as ListInterface[any] value in argument to append: *List[int] does not implement ListInterface[any] (wrong type for method Add)
    have Add(int)
    want Add(any)
Copy after login

So, if I understand correctly, in go any is its own type. It is not a synonym for "whatever type the runtime wants". My question is, is it possible to do something like this?

Workaround

What you are trying to do here suggests that you expect go's generics to be capable of type erasure (just like Java generics). but it is not the truth.

You have a List[int], which means its Add method looks like this:

func (l *List) Add(el int) {
    l.Elements = append(l.Elements, el)
}
Copy after login

Then try to add it to a slice of objects implementing that interface:

Add(v any)
Copy after login

Now, you might be thinking that int can be used as any, you are right, it can, but when you see:

var s []ListInterface[any]
Copy after login

You are saying that all elements in said slice will have an Add method that takes a parameter of type any, so this means:

s[0].Add("foo")
s[1].Add(123)
Copy after login

should always be a valid call. This does not hold if s[0] is of type List[int] (as is the case in your snippet). You are trying to append a string to Elements which is of type []int.

There is a saying that reverse engineering should be allowed:

s := []ListInterface[int]{}
s = append(s, &List[any]{})
Copy after login

It appears that List[any] will accept int parameters, but this is also not allowed. This can be useful in some cases, but in many cases this can be problematic.

Essentially, generics in Go are something that is handled at compile time. When you create a List[int], the compiler creates a type like List_int and implements the Add(el int) method on that type, Same as any other List type you end up using. None of these types will have an Add(any) method unless you create a List[any]. Think of it as compiler-assisted boilerplate code generation. Not runtime type erasure.

Result: List[int] and List[any] are completely different types and therefore cannot sit side by side in a slice as if they were the same type. If you want to be able to do what you want, you can do this:

func (l *List[T]) AddAny(v any) {
    tv, ok := v.(T)
    if !ok {
        return // or return an error
    }
    l.Add(tv)
}
Copy after login

Take the any approach of values, using a type assertion to see if a given value is compatible with the list's underlying type, and add it if that's the case. You can then add them into a single slice like this:

type Lists interface {
    AddAny(any)
}

s := []Lists{}
s = append(s, &List[int]{}, &List[string]{})
s[0].AddAny(123) // will work
s[0].AddAny("foo") // will not, with the current code this will silently fail
s[1].AddAny("foo") // works fine
s[1].AddAny(123) // silently fails
Copy after login

But in reality, when you do something like this, the code just screams X-Y problem, you are trying to use Y (generics) to solve your problem, when the real problem is X: what is the best way to solve it question?

The above is the detailed content of List of common structures/interfaces in Golang. 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

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.

Undress AI Tool

Undress AI Tool

Undress images for free

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)

Hot Topics

Java Tutorial
1662
14
PHP Tutorial
1261
29
C# Tutorial
1234
24
What are the c++ open source libraries? What are the c++ open source libraries? Apr 22, 2024 pm 05:48 PM

C++ provides a rich set of open source libraries covering the following functions: data structures and algorithms (Standard Template Library) multi-threading, regular expressions (Boost) linear algebra (Eigen) graphical user interface (Qt) computer vision (OpenCV) machine learning (TensorFlow) Encryption (OpenSSL) Data compression (zlib) Network programming (libcurl) Database management (sqlite3)

How do C++ functions handle DNS queries in network programming? How do C++ functions handle DNS queries in network programming? Apr 27, 2024 pm 06:39 PM

The C++ standard library provides functions to handle DNS queries in network programming: gethostbyname(): Find host information based on the host name. gethostbyaddr(): Find host information based on IP address. dns_lookup(): Asynchronously resolves DNS.

How many levels are there in the Python exam? How many levels are there in the Python exam? Apr 02, 2024 pm 06:00 PM

There are 12 levels of Python exams, from beginner to advanced, in order to master Python's basic syntax, advanced features, advanced concepts and underlying mechanisms, etc., with gradually increasing difficulty.

How does Java network programming use UDP for connectionless communication? How does Java network programming use UDP for connectionless communication? Apr 15, 2024 pm 12:51 PM

UDP (User Datagram Protocol) is a lightweight connectionless network protocol commonly used in time-sensitive applications. It allows applications to send and receive data without establishing a TCP connection. Sample Java code can be used to create a UDP server and client, with the server listening for incoming datagrams and responding, and the client sending messages and receiving responses. This code can be used to build real-world use cases such as chat applications or data collection systems.

What are the common protocols for Java network programming? What are the common protocols for Java network programming? Apr 15, 2024 am 11:33 AM

Commonly used protocols in Java network programming include: TCP/IP: used for reliable data transmission and connection management. HTTP: used for web data transmission. HTTPS: A secure version of HTTP that uses encryption to transmit data. UDP: For fast but unstable data transfer. JDBC: used to interact with relational databases.

Golang common function address resolution guide Golang common function address resolution guide Apr 08, 2024 pm 02:18 PM

The key functions for parsing addresses in the Go language include: net.ParseIP(): Parse IPv4 or IPv6 addresses. net.ParseCIDR(): Parse CIDR tags. net.ResolveIPAddr(): Resolve hostname or IP address into IP address. net.ResolveTCPAddr(): Resolve host names and ports into TCP addresses. net.ResolveUDPAddr(): Resolve host name and port into UDP address.

How do C++ functions implement network security in network programming? How do C++ functions implement network security in network programming? Apr 28, 2024 am 09:06 AM

C++ functions can achieve network security in network programming. Methods include: 1. Using encryption algorithms (openssl) to encrypt communication; 2. Using digital signatures (cryptopp) to verify data integrity and sender identity; 3. Defending against cross-site scripting attacks ( htmlcxx) to filter and sanitize user input.

How long does it take to learn golang How long does it take to learn golang Apr 02, 2024 pm 07:48 PM

The time it takes to master Golang varies from person to person, but it usually takes a few months to a few years. Learning stages include: Basic (1-2 months), Intermediate (3-6 months), Advanced (6-12 months or longer). Factors that accelerate learning include ongoing practice, project work, community involvement, and online resources. Influencing factors include prior programming experience, frequency of study, and study materials.

See all articles