Update tech_docs/go_getting_started.md
This commit is contained in:
@@ -1,4 +1,282 @@
|
|||||||
Here's a comprehensive guide to using some essential Go packages for interacting with the operating system and handling various system-level tasks.
|
## Deep Dive into Golang
|
||||||
|
|
||||||
|
### Language Design
|
||||||
|
|
||||||
|
Golang, or Go, is a statically typed, compiled programming language designed at Google by Robert Griesemer, Rob Pike, and Ken Thompson. It is syntactically similar to C but with memory safety, garbage collection, structural typing, and CSP-style concurrency.
|
||||||
|
|
||||||
|
#### Key Features
|
||||||
|
|
||||||
|
1. **Simplicity and Readability**: Go has a clean syntax and a small set of keywords.
|
||||||
|
2. **Concurrency**: Built-in support through goroutines and channels.
|
||||||
|
3. **Garbage Collection**: Automatic memory management.
|
||||||
|
4. **Strong Typing**: Ensures type safety and reduces runtime errors.
|
||||||
|
5. **Standard Library**: Extensive and well-documented, covering networking, file I/O, text processing, and more.
|
||||||
|
|
||||||
|
### Language Syntax
|
||||||
|
|
||||||
|
#### Variable Declarations
|
||||||
|
|
||||||
|
Go supports both explicit and implicit variable declarations.
|
||||||
|
|
||||||
|
```go
|
||||||
|
var a int = 42 // Explicit
|
||||||
|
b := 42 // Implicit (type inferred)
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Control Structures
|
||||||
|
|
||||||
|
Go provides typical control structures like `if`, `for`, `switch`, and `select`.
|
||||||
|
|
||||||
|
```go
|
||||||
|
// If-else
|
||||||
|
if x > 10 {
|
||||||
|
fmt.Println("x is greater than 10")
|
||||||
|
} else {
|
||||||
|
fmt.Println("x is less than or equal to 10")
|
||||||
|
}
|
||||||
|
|
||||||
|
// For loop
|
||||||
|
for i := 0; i < 10; i++ {
|
||||||
|
fmt.Println(i)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Switch
|
||||||
|
switch day {
|
||||||
|
case "Monday":
|
||||||
|
fmt.Println("Start of the week")
|
||||||
|
case "Friday":
|
||||||
|
fmt.Println("End of the week")
|
||||||
|
default:
|
||||||
|
fmt.Println("Midweek")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Select
|
||||||
|
select {
|
||||||
|
case msg := <-channel1:
|
||||||
|
fmt.Println("Received", msg)
|
||||||
|
case msg := <-channel2:
|
||||||
|
fmt.Println("Received", msg)
|
||||||
|
default:
|
||||||
|
fmt.Println("No messages")
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Concurrency
|
||||||
|
|
||||||
|
Concurrency is a core feature of Go, making it particularly well-suited for building scalable systems.
|
||||||
|
|
||||||
|
#### Goroutines
|
||||||
|
|
||||||
|
Goroutines are lightweight threads managed by the Go runtime.
|
||||||
|
|
||||||
|
```go
|
||||||
|
func sayHello() {
|
||||||
|
fmt.Println("Hello, World!")
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
go sayHello()
|
||||||
|
time.Sleep(1 * time.Second) // Give the goroutine time to finish
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Channels
|
||||||
|
|
||||||
|
Channels are used for communication between goroutines.
|
||||||
|
|
||||||
|
```go
|
||||||
|
func worker(ch chan string) {
|
||||||
|
ch <- "Hello from worker"
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
ch := make(chan string)
|
||||||
|
go worker(ch)
|
||||||
|
msg := <-ch
|
||||||
|
fmt.Println(msg)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Memory Management
|
||||||
|
|
||||||
|
Go has a garbage collector that automatically handles memory allocation and deallocation, reducing the risk of memory leaks and pointer errors.
|
||||||
|
|
||||||
|
### Standard Library
|
||||||
|
|
||||||
|
Go's standard library is one of its greatest strengths, providing robust support for various tasks.
|
||||||
|
|
||||||
|
#### `net/http`
|
||||||
|
|
||||||
|
The `net/http` package is used for building web servers and clients.
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
|
func handler(w http.ResponseWriter, r *http.Request) {
|
||||||
|
fmt.Fprintf(w, "Hello, World!")
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
http.HandleFunc("/", handler)
|
||||||
|
http.ListenAndServe(":8080", nil)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### `encoding/json`
|
||||||
|
|
||||||
|
The `encoding/json` package is used for JSON encoding and decoding.
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Person struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
Age int `json:"age"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
person := Person{Name: "John", Age: 30}
|
||||||
|
data, _ := json.Marshal(person)
|
||||||
|
fmt.Println(string(data))
|
||||||
|
|
||||||
|
jsonString := `{"name": "Jane", "age": 25}`
|
||||||
|
var p Person
|
||||||
|
json.Unmarshal([]byte(jsonString), &p)
|
||||||
|
fmt.Println(p)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Error Handling
|
||||||
|
|
||||||
|
Go uses a unique error handling approach. Functions return errors as values, which must be checked explicitly.
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
file, err := os.Open("test.txt")
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("Error opening file:", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer file.Close()
|
||||||
|
fmt.Println("File opened successfully")
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Interfaces
|
||||||
|
|
||||||
|
Interfaces in Go provide a way to specify the behavior of objects. If a type implements all the methods in an interface, it implicitly implements that interface.
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
type Printer interface {
|
||||||
|
Print() string
|
||||||
|
}
|
||||||
|
|
||||||
|
type Person struct {
|
||||||
|
Name string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p Person) Print() string {
|
||||||
|
return p.Name
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var p Printer = Person{Name: "John"}
|
||||||
|
fmt.Println(p.Print())
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Packages
|
||||||
|
|
||||||
|
Go encourages modular design. Code is organized into packages.
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"mypackage"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
result := mypackage.Add(1, 2)
|
||||||
|
fmt.Println(result)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Deployment
|
||||||
|
|
||||||
|
Go compiles to a single binary, making deployment straightforward. The `go build` command compiles the source code into an executable.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
go build -o myapp
|
||||||
|
./myapp
|
||||||
|
```
|
||||||
|
|
||||||
|
### Tooling
|
||||||
|
|
||||||
|
- **Go Modules**: Dependency management system.
|
||||||
|
- **Go fmt**: Code formatting tool.
|
||||||
|
- **Go vet**: Static analysis tool to check for errors.
|
||||||
|
- **Go doc**: Documentation tool.
|
||||||
|
- **Go test**: Testing framework.
|
||||||
|
|
||||||
|
### Advanced Topics
|
||||||
|
|
||||||
|
#### Reflection
|
||||||
|
|
||||||
|
Reflection in Go is provided by the `reflect` package and allows inspecting the type and value of variables at runtime.
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"reflect"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var x float64 = 3.4
|
||||||
|
fmt.Println("type:", reflect.TypeOf(x))
|
||||||
|
fmt.Println("value:", reflect.ValueOf(x))
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Generics (Coming in Go 1.18)
|
||||||
|
|
||||||
|
Generics enable writing flexible and reusable code without sacrificing type safety. They allow defining functions, types, and data structures with placeholders for types.
|
||||||
|
|
||||||
|
### Performance
|
||||||
|
|
||||||
|
Go is designed for performance:
|
||||||
|
- **Compiled Language**: Go is compiled to machine code, providing fast execution.
|
||||||
|
- **Efficient Concurrency**: Goroutines and channels are highly efficient, making concurrent programming easier and faster.
|
||||||
|
|
||||||
|
### Conclusion
|
||||||
|
|
||||||
|
Go is a powerful language with a rich feature set that includes strong typing, garbage collection, concurrency support, and an extensive standard library. It is particularly well-suited for system programming, web development, and building scalable, concurrent applications. By leveraging Go's features and tooling, developers can write efficient, reliable, and maintainable code.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## Go Syscall Package
|
## Go Syscall Package
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user