Skip to content

callmeskyy111/golang-resources

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

25 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

What is GoLang? πŸ”΅

Go (or GoLang) is an open-source, statically typed, compiled programming language developed by Google in 2007 and released in 2009. It was designed to improve productivity in software development, combining the performance of a compiled language with the simplicity and ease of use of dynamically typed languages.

Go is particularly known for its efficiency in handling concurrent programming, making it ideal for building scalable and high-performance applications.


Key Features of GoLang: πŸ’»

  1. Simple and Readable Syntax

    • Go has a clean and minimalistic syntax, making it easy to learn and read.
    • No complex features like classes, inheritance, or explicit memory management.
  2. Compiled and High Performance

    • Unlike interpreted languages (e.g., Python, JavaScript), Go is compiled, resulting in faster execution.
    • Produces standalone binaries with minimal dependencies.
  3. Garbage Collection (GC)

    • Go has an efficient garbage collector that manages memory automatically.
  4. Concurrency Support (Goroutines)

    • Go has built-in concurrency using lightweight threads called goroutines.
    • It uses channels for safe communication between goroutines, making it more efficient than traditional threading.
  5. Static Typing with Type Inference

    • Statically typed, reducing runtime errors.
    • Also supports type inference, making code more concise.
  6. Cross-Platform

    • Go supports cross-platform development.
    • A single Go program can be compiled to run on Windows, Linux, and macOS without changes.
  7. Standard Library

    • Comes with a powerful standard library, eliminating the need for third-party packages for common tasks like HTTP handling, JSON parsing, and cryptography.
  8. Built-in Testing

    • Provides an in-built testing framework (testing package) for unit testing and benchmarking.
  9. Efficient Networking & Web Development

    • Optimized for building high-performance web services and APIs.
    • Used in popular frameworks like Gin and Fiber.
  10. Security & Simplicity

  • Avoids issues like dangling pointers and memory leaks.
  • Enforces good coding practices and prevents unsafe operations.

Why Should We Learn GoLang?

  1. High Demand for Go Developers

    • Companies like Google, Uber, Dropbox, Netflix, and PayPal use Go.
    • Growing job opportunities in backend development, cloud computing, and DevOps.
  2. Ideal for Backend Development

    • Perfect for building RESTful APIs, microservices, and backend systems.
    • Frameworks like Gin, Fiber, and Echo make web development easy.
  3. Great for Cloud Computing & DevOps

    • Used in cloud-native technologies like Docker, Kubernetes, and Terraform.
    • Many DevOps tools are built using Go.
  4. Concurrency & Scalability

    • Handles thousands of concurrent tasks efficiently.
    • Suitable for applications requiring real-time data processing (e.g., chat apps, streaming services).
  5. Ease of Learning

    • Simple syntax with fewer concepts to master compared to Java or C++.
    • Good starting point for learning system programming.
  6. Performance & Efficiency

    • Almost as fast as C/C++, with better memory management.
    • Lower CPU and RAM usage, making it ideal for large-scale applications.
  7. Community & Ecosystem

    • Active open-source community.
    • Strong ecosystem with numerous libraries and frameworks.

Should We Learn GoLang?

Yes, especially if we're interested in: βœ… Backend development (APIs, microservices) βœ… Cloud computing & DevOps βœ… Building high-performance, scalable applications βœ… Concurrency & distributed systems βœ… Learning a simple yet powerful language with fast execution

Here’s a detailed explanation of all the Go commands:


1. go bug

  • Opens a web page to report a bug in the Go project.
  • It automatically collects system information to help with debugging.

πŸ“ Usage:

go bug

2. go build

  • Compiles the Go source code and generates an executable binary.
  • It compiles all dependencies but does not install them.

πŸ“ Usage:

go build [package]

Example:

go build main.go
  • This compiles main.go into an executable file (main.exe on Windows, main on Linux/macOS).

3. go clean

  • Removes compiled object files and cached data from the Go build system.
  • Useful for cleaning up unnecessary files.

πŸ“ Usage:

go clean
  • Removes all build artifacts from the current module.
go clean -cache -modcache -testcache
  • Cleans the cache, module cache, and test cache.

4. go doc

  • Displays documentation for a Go package or function.

πŸ“ Usage:

go doc fmt.Println
  • Shows documentation for fmt.Println.
go doc -all fmt
  • Shows full documentation for the fmt package.

5. go env

  • Prints information about the Go environment variables (like GOROOT, GOPATH).

πŸ“ Usage:

go env
  • Shows all environment variables.
go env GOPATH
  • Prints only the GOPATH value.

6. go fix

  • Automatically updates Go code to use the latest API changes.

πŸ“ Usage:

go fix ./...
  • Fixes all Go files in the current directory and subdirectories.

7. go fmt

  • Formats Go source code to follow standard Go coding style.

πŸ“ Usage:

go fmt main.go
  • Formats main.go.
go fmt ./...
  • Formats all .go files in the current directory and subdirectories.

8. go generate

  • Runs code generation tools specified in Go files using //go:generate comments.
  • Often used for generating boilerplate code, mocks, or database models.

πŸ“ Usage:

go generate
  • Executes commands specified in //go:generate comments.

Example in a Go file:

//go:generate go run mygenerator.go

9. go get

  • Fetches and installs dependencies for a Go module.

πŸ“ Usage:

go get github.com/gorilla/mux
  • Installs the gorilla/mux package.
go get -u
  • Updates all dependencies in the project.

10. go install

  • Compiles and installs a package or program into $GOBIN.
  • Useful for installing CLI tools.

πŸ“ Usage:

go install github.com/user/tool@latest
  • Installs the latest version of tool.
go install ./...
  • Installs all executables from the current module.

11. go list

  • Lists installed Go packages or modules.

πŸ“ Usage:

go list all
  • Lists all available packages.
go list -m
  • Shows details about the current module.

12. go mod

  • Manages Go modules (Go’s dependency management system).

πŸ“ Common Subcommands:

go mod init myproject
  • Initializes a new module.
go mod tidy
  • Removes unused dependencies from go.mod.
go mod verify
  • Checks the integrity of dependencies.

13. go work

  • Manages workspaces containing multiple Go modules.

πŸ“ Usage:

go work init
  • Initializes a workspace file (go.work).
go work use ./module1 ./module2
  • Adds multiple modules to the workspace.

14. go run

  • Compiles and runs a Go program without creating an executable file.

πŸ“ Usage:

go run main.go
  • Runs main.go without generating an executable.
go run .
  • Runs all Go files in the current directory.

15. go telemetry

  • Manages telemetry data sent to Go developers.

πŸ“ Usage:

go telemetry on
  • Enables telemetry.
go telemetry off
  • Disables telemetry.

16. go test

  • Runs unit tests in the current package.

πŸ“ Usage:

go test
  • Runs all tests in the current directory.
go test -v
  • Runs tests in verbose mode.
go test -cover
  • Shows code coverage details.

17. go tool

  • Runs various Go tools like pprof (profiling), vet (error checking), etc.

πŸ“ Usage:

go tool vet main.go
  • Checks for possible mistakes in main.go.
go tool pprof profile.out
  • Analyzes a performance profile.

18. go version

  • Prints the installed Go version.

πŸ“ Usage:

go version
  • Example output:

    go version go1.21.0 windows/amd64
    

19. go vet

  • Detects potential bugs and incorrect code patterns.

πŸ“ Usage:

go vet main.go
  • Checks main.go for issues.
go vet ./...
  • Checks all files in the current project.

Summary Table:

Command Description
go bug Reports a Go bug.
go build Compiles Go code into an executable.
go clean Removes compiled files and cache.
go doc Shows package documentation.
go env Displays Go environment settings.
go fix Updates Go code to new API versions.
go fmt Formats Go source files.
go generate Runs code generation tools.
go get Fetches and installs dependencies.
go install Installs executables in $GOBIN.
go list Lists installed packages.
go mod Manages Go modules.
go work Manages workspaces.
go run Compiles and runs a Go program.
go telemetry Manages telemetry settings.
go test Runs unit tests.
go tool Runs additional Go tools.
go version Prints the installed Go version.
go vet Detects code mistakes.

This covers all the Go commands in detail.

Hello World πŸ‘‹πŸ»

  • go build 1_hello_world/main.go
  • ./main (.exe file)
  • πŸ’‘ Soln. - go run 1_hello_world/main.go

In Go (Golang), a package is a way to organize and reuse code. Every Go program is made up of packages. They help break up the program into manageable, modular parts β€” similar to modules or libraries in other languages.


🧩 What Is a Package?

A package in Go is:

  • A collection of related Go source files in the same directory.
  • Each file in that directory must declare the same package name.
  • One special package is main, which is used to build executable programs.

πŸ“¦ Two Types of Packages

βœ… 1. Executable Package (main)

Used to build programs that can run (produce a binary/executable).

package main

import "fmt"

func main() {
    fmt.Println("Hello, Go!")
}
  • Must have a main() function.
  • The program starts from the main() function.
  • go run or go build is used to run/compile it.

βœ… 2. Library Package (non-main)

Used to define reusable code, like helper functions or tools.

package greetings

import "fmt"

func Hello(name string) {
    fmt.Println("Hello,", name)
}
  • No main() function.
  • Other packages can import it and use its functions.

πŸ“ Example Directory Structure

myproject/
β”œβ”€β”€ main.go             // uses package main
└── utils/
    └── mathutils.go    // uses package utils

πŸ“Œ main.go

package main

import (
    "fmt"
    "myproject/utils"
)

func main() {
    sum := utils.Add(3, 4)
    fmt.Println("Sum is:", sum)
}

πŸ“Œ utils/mathutils.go

package utils

func Add(a int, b int) int {
    return a + b
}

πŸ“š Common Standard Packages

Go has a rich standard library of packages:

Package Purpose
fmt Input/output formatting (Println, etc.)
math Math functions (Sqrt, Pow, etc.)
strings String manipulation (Contains, etc.)
time Time and date handling
net/http HTTP client/server
os OS-level operations (files, env vars)

πŸ”— How to Import Packages

import "fmt"
  • Standard packages: use just the name like fmt, math, etc.
  • Local or third-party packages: specify full path like "github.com/user/repo/pkg"

πŸ” Exported vs Unexported (Capitalization)

  • Exported (public) identifiers in packages start with uppercase.
  • Unexported (private) identifiers start with lowercase.
// Exported function (accessible from other packages)
func Greet() {}

// Unexported function (private to same package)
func greet() {}

🧠 Summary

Concept Description
package Declares a file's package (top of the file)
main package Special package with the entry point for execution
Import packages Use import to include other packages
Standard library Built-in packages like fmt, math, etc.
Custom packages Organized in folders, imported with their path

In Go (Golang), the standard library provides a powerful set of commonly used packages that cover almost everything needed for most applications β€” from string manipulation to networking and HTTP servers.

Here’s a detailed overview of the most commonly used packages in Go, organized by use-case:


πŸ”€ 1. fmt β€” Formatting and Printing

Used for input/output formatting (like console.log or printf).

βœ… Common Functions:

fmt.Print("Hello")          // Print without newline
fmt.Println("Hello")        // Print with newline
fmt.Printf("Name: %s", name) // Format strings
  • Scan(), Scanln(), Scanf() are used for input.

πŸ“ 2. math β€” Mathematical Operations

Provides basic math functions.

βœ… Common Functions:

math.Sqrt(16)       // 4
math.Pow(2, 3)      // 8
math.Abs(-5.5)      // 5.5
  • Use math/rand for random numbers:
rand.Intn(100)      // Random int from 0 to 99

🧡 3. strings β€” String Manipulation

For working with strings (searching, splitting, replacing, etc).

βœ… Common Functions:

strings.Contains("golang", "go")   // true
strings.ToUpper("hello")           // "HELLO"
strings.Split("a,b,c", ",")        // ["a", "b", "c"]
strings.Replace("hi hi", "hi", "yo", 1)  // "yo hi"

⌚ 4. time β€” Time and Date

Handles time, delays, formatting, etc.

βœ… Common Functions:

time.Now()                         // current time
time.Sleep(2 * time.Second)        // pause for 2 sec
time.Now().Format("2006-01-02")    // format date

πŸ—ƒοΈ 5. os β€” Operating System Interaction

Used to work with files, environment variables, and more.

βœ… Common Functions:

os.Getenv("PATH")                     // get env var
os.Create("file.txt")                 // create file
os.ReadFile("file.txt")               // read file (Go 1.16+)
os.Remove("file.txt")                 // delete file

πŸ“ 6. io/ioutil and io β€” I/O Helpers

Before Go 1.16, ioutil was used for reading/writing files.

βœ… Examples:

ioutil.ReadFile("file.txt")
ioutil.WriteFile("file.txt", data, 0644)

Note: ioutil is deprecated after Go 1.16. Use os or io instead.


🌐 7. net/http β€” Web & HTTP Server

For building APIs, making requests, and creating web servers.

βœ… Basic Web Server:

http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, "Hello, Web!")
})
http.ListenAndServe(":8080", nil)

βœ… HTTP Client:

resp, _ := http.Get("https://api.github.com")
body, _ := io.ReadAll(resp.Body)

πŸ“¦ 8. encoding/json β€” JSON Handling

Used for encoding/decoding JSON data (like API input/output).

βœ… Convert Struct to JSON:

jsonData, _ := json.Marshal(myStruct)

βœ… Parse JSON to Struct:

json.Unmarshal(jsonBytes, &myStruct)

πŸ’₯ 9. errors β€” Error Handling

To create custom error messages.

βœ… Create an error:

import "errors"

err := errors.New("something went wrong")
  • Go prefers explicit error handling over try/catch.

πŸ”’ 10. log β€” Logging

Used to log messages with timestamps and errors.

βœ… Basic Usage:

log.Println("Starting the server...")
log.Fatal("Fatal error!") // also exits the program

🧰 Honorable Mentions

Package Purpose
bytes Working with byte slices
strconv String ↔ Number conversions
regexp Regular expressions
flag Command-line arguments
bufio Buffered I/O (faster file reading/writing)
path/filepath Cross-platform file path manipulation

🧠 Summary Table

Category Package Use Cases
I/O fmt, os, io Input/output, file ops
Strings strings, strconv String & number manipulation
Time time Time, delays, formatting
Math math, math/rand Calculations, randomness
Web net/http, html/template Web servers, templates
JSON encoding/json JSON encode/decode
Logging & Errors log, errors Error handling & logging

In Go (Golang), operators are special symbols or keywords used to perform operations on variables and values. They're grouped by purpose:


βœ… 1. Arithmetic Operators

Used to perform basic math operations.

Operator Description Example
+ Addition a + b
- Subtraction a - b
* Multiplication a * b
/ Division a / b
% Modulus (remainder) a % b

πŸ”Έ Example:

a := 10
b := 3
fmt.Println(a + b) // 13
fmt.Println(a % b) // 1

βœ… 2. Assignment Operators

Used to assign or update values of variables.

Operator Description Example
= Assign a = b
+= Add and assign a += b
-= Subtract and assign a -= b
*= Multiply and assign a *= b
/= Divide and assign a /= b
%= Modulus and assign a %= b

πŸ”Έ Example:

a := 5
a += 3 // a = 8

βœ… 3. Comparison Operators

Used to compare two values and return a boolean (true or false).

Operator Description Example
== Equal to a == b
!= Not equal to a != b
> Greater than a > b
< Less than a < b
>= Greater or equal a >= b
<= Less or equal a <= b

πŸ”Έ Example:

a := 10
b := 20
fmt.Println(a < b) // true

βœ… 4. Logical Operators

Used to combine multiple boolean expressions.

Operator Description Example
&& Logical AND (both true) a > 5 && b < 10
` ` Logical OR (at least one) `a > 5 b < 5`
! Logical NOT (negation) !true β†’ false

πŸ”Έ Example:

a := 8
b := 3
fmt.Println(a > 5 && b < 5) // true

βœ… 5. Bitwise Operators

Operate at the binary level (often used in low-level programming).

Operator Description Example
& AND a & b
` ` OR `a b`
^ XOR a ^ b
&^ AND NOT (bit clear) a &^ b
<< Left shift a << 1
>> Right shift a >> 1

πŸ”Έ Example:

a := 5    // 0101
b := 3    // 0011
fmt.Println(a & b)  // 1  -> 0001
fmt.Println(a | b)  // 7  -> 0111

βœ… 6. Other Useful Operators

πŸ“Œ Unary Operators:

Used on a single operand.

x := 10
x++    // increment (not allowed directly in expression)
x--    // decrement

⚠️ In Go, x++ or x-- must be used alone, not in expressions like y = x++.


βœ… Summary Table

Category Operators Examples
Arithmetic +, -, *, /, % a + b
Assignment =, +=, -=, etc. a += 2
Comparison ==, !=, >, <, etc. a == b, a >= b
Logical &&, ` , !` a > 5 && b < 10
Bitwise &, ` , ^, <<, >>` a & b, a << 1
Unary ++, -- x++, x--

In Go (Golang), = and == look similar but serve completely different purposes:


βœ… = (Single Equals) β€” Assignment Operator

  • Used to assign a value to a variable.
  • Stores the value on the right into the variable on the left.

πŸ”Ή Syntax:

a = 5

πŸ”Ή Meaning:

"Set the value of a to 5."


βœ… == (Double Equals) β€” Equality Comparison Operator

  • Used to compare two values.
  • Returns a boolean value: true if both sides are equal, false otherwise.

πŸ”Ή Syntax:

a == 5

πŸ”Ή Meaning:

"Check if the value of a is equal to 5."


βœ… Example: Difference in Action

package main

import "fmt"

func main() {
    a := 5       // using '=' to assign value 5 to a
    b := 10      // assigning 10 to b

    fmt.Println(a == b) // using '==' to compare a and b β†’ false
    fmt.Println(a = b)  // ❌ ERROR: this is NOT valid in print β€” '=' can't be used like that!
}

βœ… Correct way:

a = b          // valid: assigns b’s value to a
result := a == b  // valid: compares a and b

🧠 TL;DR

Operator Name Usage Returns
= Assignment Operator Assigns value to variable Nothing
== Equality Operator Compares two values true or false

Here’s a tiny runnable Go program that shows the difference between = (assignment) and == (comparison):


βœ… Sample Go Program

package main

import "fmt"

func main() {
    // Assignment using =
    a := 5
    b := 10

    fmt.Println("Initial values:")
    fmt.Println("a =", a)
    fmt.Println("b =", b)

    // Comparison using ==
    isEqual := a == b
    fmt.Println("Is a equal to b?", isEqual) // false

    // Assigning new value to a using =
    a = b
    fmt.Println("\nAfter assigning a = b")
    fmt.Println("a =", a)
    fmt.Println("b =", b)

    // Now compare again
    isEqual = a == b
    fmt.Println("Is a equal to b now?", isEqual) // true
}

βœ… Output:

Initial values:
a = 5
b = 10
Is a equal to b? false

After assigning a = b
a = 10
b = 10
Is a equal to b now? true

This clearly shows:

  • = sets values,
  • == checks if two values are the same.

Let’s now go deep under the hood of Go (Golang) to understand how it works behind the scenes β€” from compilation to execution, memory management, concurrency, and more. This will give us a solid mental model of how Go behaves under different situations.


🧠 High-Level Overview

Go is a compiled, statically typed, garbage-collected, and concurrent programming language developed at Google. Unlike scripting or interpreted languages (like Python or JavaScript), Go code is compiled directly into machine code via the Go compiler, making it fast and efficient.


πŸ› οΈ 1. Compilation Process

When we run:

go build main.go

Go performs the following steps:

βœ… Lexing & Parsing:

  • The Go compiler (specifically go/parser, go/ast) tokenizes and parses your source code into an Abstract Syntax Tree (AST).

βœ… Type Checking:

  • Go performs static type checking using the go/types package. It checks for:

    • Type correctness
    • Visibility rules (exported vs unexported identifiers)
    • Constant expressions

βœ… Intermediate Representation (IR):

  • The compiler lowers the AST into SSA (Static Single Assignment) form, an intermediate form used for optimizations and code generation.

βœ… Optimization:

  • The compiler performs optimizations like inlining, dead code elimination, escape analysis, etc., using the SSA form.

βœ… Code Generation:

  • Then, the backend compiles the optimized IR into native machine code targeting our platform (e.g., x86, ARM).

βœ… Linking:

  • All code and libraries are linked together into a single binary β€” no virtual machine, no runtime needed at execution.

🧠 2. Memory Management & Garbage Collection (GC)

βœ… Memory Allocation:

  • Go uses heap and stack memory.

    • Stack memory is used for local variables and grows/shrinks automatically.
    • Heap memory is used when the compiler determines that a variable "escapes" the stack (via escape analysis).

βœ… Escape Analysis:

  • Determines whether a variable should be allocated on the stack or heap.
func foo() *int {
    x := 10
    return &x // x escapes to the heap
}

βœ… Garbage Collector:

  • Go’s GC is concurrent, non-generational, and non-moving.
  • It pauses the world briefly (~50ΞΌs) and then works alongside goroutines to collect unused memory without stopping execution entirely.

🧡 3. Goroutines & Scheduler

Go has lightweight threads called goroutines. Behind the scenes, the Go runtime includes its own scheduler that works on:

βœ… The G-M-P Model:

Term Meaning
G Goroutine (the actual work unit)
M Machine (an OS thread)
P Processor (holds run queues and handles scheduling)
  • A goroutine (G) is executed on an M (OS thread), but only via a P (processor).
  • There’s a fixed number of P’s (GOMAXPROCS, defaults to CPU cores).
  • This system allows cooperative multitasking, efficient scheduling, and no 1:1 thread-to-goroutine mapping.

βœ… Scheduler Tasks:

  • Steals work from other P's when idle
  • Manages stack growth/shrink
  • Reschedules blocked goroutines

🧾 4. Go Modules & Dependency Management

Behind the scenes of:

go mod init
go get
go build

Go manages dependencies using:

  • go.sum β€” Cryptographic hashes of your dependencies (for reproducibility)
  • go.mod β€” Describes required modules and versions

The Go toolchain fetches these dependencies from remote proxies or GOPATH.


βš™οΈ 5. Interfaces & Type System (Runtime)

  • Go’s interfaces are runtime constructs.

  • Every value that implements an interface carries a type descriptor and a pointer to data.

  • Interface values are two-word structures:

    type iface struct {
        tab  *itab // type + method table
        data unsafe.Pointer
    }

That’s why reflection (reflect package) is possible.


πŸ§ͺ 6. Reflection

  • Go supports runtime type inspection via the reflect package.

  • This allows us to:

    • Inspect types and values
    • Modify values dynamically
    • Access struct tags
    • Check interface implementations

Under the hood, this is made possible via type descriptors and metadata embedded into compiled binaries.


πŸ” 7. Tooling & Developer Experience

Go is known for its tooling-first philosophy:

Tool Function
go fmt Automatic code formatting
go vet Static analysis and warnings
go test Unit testing
go doc Documentation
go mod tidy Clean up unused dependencies

These tools are built into the language itself β€” not third-party add-ons.


🧱 8. Static Linking & Portable Binaries

  • By default, Go builds statically linked binaries (no external dependencies needed to run).
  • This makes it perfect for containers (Docker) or serverless deployment.
GOOS=linux GOARCH=amd64 go build -o app main.go

Produces a portable binary for Linux 64-bit systems.


πŸ“¦ 9. Concurrency vs Parallelism

  • Concurrency is about managing lots of things at once (goroutines).
  • Parallelism is about doing lots of things at the same time (real CPU cores).
  • Go makes concurrency easy to write, and safe β€” via channels and the scheduler.
  • But parallelism depends on how we configure GOMAXPROCS.

πŸ“Š 10. Runtime & Stack Traces

Go has a lightweight runtime that powers:

  • runtime.Stack()
  • runtime.Gosched()
  • Panic recovery
  • Signal handling
  • Scheduler instrumentation

When a panic occurs, the runtime prints a stack trace, showing goroutines, file/line, and function info.


βœ… Summary

Feature How Go Handles It
Compilation Fast, native, direct to machine code
Type Checking Static + strict at compile time
Memory Management Automatic with concurrent GC
Concurrency Goroutines, channels, G-M-P scheduler
Interfaces Runtime-based with type + method tables
Tooling Built-in tools for testing, formatting, vetting
Portability Static binaries, cross-compilation

Releases

No releases published

Packages

No packages published

Languages