16 Temmuz 2021 Cuma

Golang

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.

Bir kitap burada

Go komutu
Örnek - get
Şöyle yaparız
go get solace.dev/go/messaging
Örnek - mod
Şöyle yaparız
mkdir funWithEDA && cd "$_"
go mod init GoEDA
Örnek - run
Şöyle yaparız
go run foo.go
Docker ve Golang
Örnek - multistage ve root olmayan kullanıcı
Şöyle yaparız
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
Şöyle yaparız
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
Şöyle yaparız
package main

import (
  "fmt"
  "os"
  "os/signal"
  "strconv"
  "time"
  ...
)

func main() {
  ...
}
Import
Şöyle yaparız
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
Şöyle yaparız
fmt.Printf("Added %v %v \n", newPerson.first_name, newPerson.last_name)
Örnek
Şöyle yaparız
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
Şöyle yaparız
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
Şöyle yaparız
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
Şöyle yaparız
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
Şöyle yaparız
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
Şöyle yaparız
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
Şöyle yaparız
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
Şöyle yaparız
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)
}
pipeline
Blocking 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ığı şöyle
import 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);
  }
}



Hiç yorum yok:

Yorum Gönder