Giriş2009 yılında Google tarafından geliştirilmeye başlandı. Yine Google tarafından geliştirilen Node.js'in rakibi. Bazı özellikleri
şöyle
- C++ gibi bir standart kütüphaneye sahip
- Makine koduna derleniyor.
- Garbage Collection yapıyor.
Go komutu
Örnek - get
go get solace.dev/go/messaging
Örnek - mod
mkdir funWithEDA && cd "$_"
go mod init GoEDA
Örnek - run
Docker ve Golang
Örnek - multistage ve root olmayan kullanıcı
FROM golang:alpine3.15 as builder
WORKDIR /path
COPY . .
RUN go mod download
RUN go build -o "app" .
FROM alpine:3.15.5
WORKDIR /path
RUN apk update \
&& apk -U upgrade \
&& apk add --no-cache ca-certificates bash gcc \
&& update-ca-certificates --fresh \
&& rm -rf /var/cache/apk/*
RUN addgroup app_user && adduser -S app_user -u 1000 -G app_user
COPY --chown=app_user:app_user --from=builder /path/app .
RUN chmod +x /path/app
USER app_user
ENTRYPOINT ["/path/app"]
main metodu
Örnek
package main
import (
"io"
"net/http"
)
func main() {
http.HandleFunc("/", helloWorld)
http.ListenAndServe(":3000", nil)
}
func helloWorld(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, "Hello world!")
}
Import
package main
import (
"fmt"
"os"
"os/signal"
"strconv"
"time"
...
)
func main() {
...
}
Import
package main
import (
"net/http"
"github.com/labstack/echo/v4"
)
func main() {
e := echo.New()
e.GET("/", func(c echo.Context) error {
var myarr [3]string
myarr[0] = "Hello"
myarr[1] = "From"
myarr[2] = "GoLang"
return c.JSON(http.StatusOK, myarr)
})
e.Logger.Fatal(e.Start(":8080"))
}
Fmt Paketi
Örnek - %v
fmt.Printf("Added %v %v \n", newPerson.first_name, newPerson.last_name)
Örnek
reader := bufio.NewReader(os.Stdin)
fmt.Print("Enter a first name: ")
firstName, _ := reader.ReadString('\n')
if firstName != "\n" {
firstName = strings.TrimSuffix(firstName, "\n")
}
Time paket
Örnek
package main
import (
"fmt"
"time"
)
func say(s string) {
for i := 0; i < 5; i++ {
time.Sleep(100 * time.Millisecond)
fmt.Println(s)
}
}
func main() {
go say("world")
say("hello")
}
Değişken Tanımlama
Yeni değişkene ilk değer atama := ile yapılır. Sonradan değer arama = ile yapılır
Örnek
func main() {
v1 := "some variable"
var v2 = "some other variable"
v1 = "now v1 has a different value"
v2 = " same with v2"
fmt.Print(v1, v2)
}
Pointers
Örnek
func main() {
v1 := "some variable"
// v2 is now a pointer to v1
var v2 *string = &v1
fmt.Print(v2) // prints the memory address of v1
}
Slices and maps
Örnek
func main() {
v1 := []int{1, 2, 3}
v1 = append(v1, 4)
fmt.Println(len(v1)) // 4
fmt.Println(v1[1]) // 2
fmt.Println(v1[1:3]) // [2 3]
v2 := make(map[string]string)
v2["hello"] = "world"
v3, ok := v2["hello"]
fmt.Println(ok, v3) // true world
}
Error Handling
Örnek
func test(input int) error {
if input < 0 {
return errors.New("less than zero")
}
return nil
}
func main() {
err := test(-1)
if err != nil {
fmt.Print(err)
}
}
Function Tanımlama
Typescript'e benziyor. func kelimesi ile başlıyor. Döndürülen tip en sona yazılıyor. Parametre tipleri de parametre isminden sonra geliyor.
Örnek
Şöyle yaparız.
func someFunc(n int) int {
}
Interface ve Struct Tanımlama
Örnek
type Animal interface {
Speak() string
}
type Dog struct {
Name string
}
// here we define Speak as a method on Dog
// it takes a pointer receiver, but you
// could also remove the *
func (d *Dog) Speak() string {
return fmt.Sprintf("I am %s", d.Name)
}
func main() {
var dog Animal = &Dog{
Name: "Cooper",
}
fmt.Println(dog.Speak())
}
Örnek - Struct
package main
import (
"encoding/json"
"net/http"
)
type ReqBody struct {
Name string `json:"name"`
}
func main() {
http.HandleFunc("/", HelloServer)
http.ListenAndServe(":3000", nil)
}
func HelloServer(w http.ResponseWriter, r *http.Request) {
var reqBody ReqBody
json.NewDecoder(r.Body).Decode(&reqBody)
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(reqBody)
}
pipelineBlocking Queue gibidir
Örnek
Şöyle
yaparız. "go foo" ile coroutine çalıştırılıyor. Yani Java karşılığı "Virtual Thread". "<-" ile de pipeline'a veri gönderiliyor ve veri okunuyor
package main
import "fmt"
func sum(s []int, c chan int) {
sum := 0
for _, v := range s {
sum += v
}
c <- sum // send sum to c
}
func main() {
s := []int{7, 2, 8, -9, 4, 0}
c := make(chan int)
go sum(s[:len(s)/2], c)
go sum(s[len(s)/2:], c)
x, y := <-c, <-c // receive from c
fmt.Println(x, y, x+y)
}
Bunun Java karşılığı
şöyleimport java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Executors;
public class main {
static void sum(int[] s, int start, int end, BlockingQueue<Integer> queue)
throws InterruptedException {
int sum = 0;
for (int i = start; i < end; i++) {
sum += s[i];
}
queue.put(sum);
}
public static void main(String[] args) throws InterruptedException {
int[] s = {7, 2, 8, -9, 4, 0};
var queue = new ArrayBlockingQueue<Integer>(1);
Thread.startVirtualThread(() -> {
sum(s, 0, s.length / 2, queue);
});
Thread.startVirtualThread(() -> {
sum(s, s.length / 2, s.length, queue);
});
int x = queue.take();
int y = queue.take();
System.out.printf("%d %d %d\n", x, y, x + y);
}
}