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
Şö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
pipelinepackage mainimport ("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 ReqBodyjson.NewDecoder(r.Body).Decode(&reqBody)w.Header().Set("Content-Type", "application/json")json.NewEncoder(w).Encode(reqBody)}
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