Golang etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Golang etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

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);
  }
}