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ığı şö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);
}
}
Hiç yorum yok:
Yorum Gönder