PHP geliştiricileri için Go'ya giriş


Düzenli olarak kaç programlama diliyle çalışıyorsunuz? Ama muhtemelen favorileriniz var. Kendim, kariyerimi PHP ve JavaScript üzerine kurdum. Her zaman yeni bir şeyler öğrenmenin peşindeyim ve yeni bir beceri öğrenmenin en iyi yolunun, onu tanıdık bir araç gibi kullanmaya kendimi zorlamak olduğunu düşünüyorum.

Bu yüzden Go ile yapmaya karar verdim! Bu son birkaç ayda biraz daha durup Go'yu düzgün bir şekilde öğrenmeye ve tüm bu yaygaranın ne hakkında olduğunu görmeye karar verdim.

Bu seride, Go hakkında öğrendiğim (ve öğrenmeye devam ettiğim) bazı şeyleri daha geleneksel bir PHP veya JavaScript programlama arka planı perspektifinden gözden geçireceğim.

Git, ele alınması gereken büyük bir konu, o yüzden başlayalım!

Go nedir ve neden havalı?

Go'ya aşina değilseniz (Golang olarak da bilinir), Google'daki bazı kişiler tarafından 2009'da oluşturulmuş bir programlama dilidir. Pek çok büyük, ünlü şirket, yazılımlarının bölümlerini Go'ya geçiriyor. Shopify'ın Go kullanarak oluşturdukları bir veritabanı geçiş aracı var, Basecamp adım adım Ruby'den Go'ya geçti ve Twitter bile 2015'te “Answers” ​​analitik platformuyla Go trenine bindi. Bugünlerde çoğu büyük şirketin kaputunun altına bakarsanız, biraz Go bulacaksınız.

Go statik olarak yazılmıştır, derlenmiştir ve dürüstçe öğrenmesi oldukça kolaydır. Bazı alanlarda PHP kadar ayrıntılı değil, ancak Ruby veya Python kadar az da değil.

Aşağıdaki örnekte Go'nun paketleri kullandığını, içe aktardığını ve kodun çalıştığı bir main() işlevine sahip olduğunu göreceksiniz:

 package main import "fmt" func main() { fmt.Println("Hey y'all") }

Go kodu main paketten başlar ve C gibi main() işlevinde başlar. main olmayan paketlere paylaşılan kitaplıklar denir ve oluşturulup yüklendikten sonra içe aktarılabilir.

Go'yu harika yapan şey, yerleşik bir web sunucusu ve yönlendirici içermesi, tek bir yürütülebilir dosya olarak derlendiğinden dağıtımı son derece basit hale getirmesi ve kutudan çıkar çıkmaz eşzamanlılık içermesidir.

Danny van Kooten, blogunda Go'nun verimliliğini vurgulayan Laravel'den Go'ya geçiş hakkında harika bir yazı yazdı.

Ayrıca, programcılar olarak becerilerimizi geliştirmek için farklı şeyler öğrenmek her zaman iyidir. O halde Go ile nasıl _go_ing yapacağınızı görelim…

baba şaka

Başlarken

Herhangi bir şey yapmadan önce Go çalışma zamanına ve içerdiği tüm özelliklere ihtiyacımız var. Bunu nasıl yapacağınızı Go belgelerindeki "Başlarken" sayfasında okuyabilirsiniz.

Bu yapıldıktan sonra, go version çalıştırın veya seçtiğiniz terminalde go help . Bu işe yararsa, $PATH go ikili dosyası eklendi ve yarışlara hazırsınız.

$GOPATH

Go ile çalışmaya başladığımda doğru yapmadığım şeylerden biri de Go çalışma alanımı doğru şekilde kurmak. Go dosyalarıyla çalışmak için temel çalışma alanı burası olduğundan $GOPATH ortam değişkeninin doğru ayarlandığından emin olmak isteyeceksiniz.

$HOME/.profile dosyanıza aşağıdakine benzer bir şey eklemek *nix sistemlerinde işe yarar:

 export GOPATH=${HOME}/go

Ardından, $GOPATH klasörünüzde src , pkg ve bin klasörlerinin oluşturulduğundan emin olmak isteyeceksiniz. Bu klasörlerin nasıl ve neden var olması gerektiğine dair daha fazla bilgiyi burada bulabilirsiniz. Genellikle $GOPATH/src/github.com/user/package_name klasöründe yeni paketler (bağımsız uygulamalar) oluşturacaksınız.

belgeler

Go'yu öğrenirken beni etkileyen şeylerden biri, belgelerin her yerde olmasıdır. Resmi belgeleri takip etmek biraz zor ve Go'da gerçekten programlamanın temel yönlerini gerçekten açıklamıyor. Go kodunu gerçekten nasıl yazmak istediğinizi açıklamakta daha iyi olacak başka kaynaklar buldum.

  • Küçük Git kitabı
  • Golang ile Web Uygulaması Oluşturun
  • Github'daki Go wiki'si
  • Wiki'nin sunucu programlama bölümü
  • Örnekle Git

SkyNet Google Go'yu yarattığı için, Google da aradığınız hemen hemen her cevaba sahip olacaktır.

En azından kendinizi neyin içine soktuğunuzu görmek için A Tour of Go'ya hızlıca bir göz atmanızı tavsiye ederim.

Go kodunu etkileşimli olarak düzenlemenin ve çalıştırmanın bir yolu olan Go Playground'u içerir. Yakında bahsedeceğimiz Dilimler ve İşaretçiler gibi şeyleri test etmek için kullanışlıdır!

Go çok büyük bir konu olduğu için, bu gönderiyi PHP ve/veya JavaScript'ten bazı önemli farklılıkları öğrenmeye odaklı tutacağız ve ilerideki gönderilerde Go'yu daha derinlemesine ele alacağız.

Bu gönderide şunları ele alacağız:

  • Değişkenler ve Go'nun tip sistemi
  • diziler
  • dilimler
  • Haritalar
  • döngüler
  • Fonksiyonlar
  • yapılar

IDE veya Düzenleyici

Go kodu yazmak hemen hemen her metin düzenleyicide yapılabilir. VS Code oldukça iyi (WordPress Geliştirme için Ultimate Editor olarak Visual Studio Code ve xDebug'u kurma konusunda bir kılavuz yazdık). Aslında, sözdizimi hatalarını otomatik olarak vurgulayacağı ve temel işlevlere 'tıklamanıza' izin vereceği için Jetbrains'ten GoLand kullanmanın gerçekten harika olduğunu buldum. Halihazırda içe aktarılmamış bir işlev kullanırsanız GoLand paketleri otomatik olarak içe aktarır.

GoLand IDE ekran görüntüsü

Değişkenler

Doğrudan PHP veya JavaScript'ten Go'ya gelince, farkedeceğiniz en büyük şeylerden biri Go'nun tip sistemidir. Go statik olarak yazılır, bu nedenle değişkenler bildirildiğinde bir tür atanmalıdır. Bu aynı zamanda PHP ile karşılaştırıldığında, değişkenlere yanlış yazılmış bir değeri yeniden atayamayacağınız anlamına gelir.

Örneğin, bu tamamen geçerli PHP kodudur:

 // PHP $old = true; $age = null; if ( $old ) { $age = 36; //null cast as an int }

Go'da çok fazla değil:

 // Go old := true var age bool if old { age = 36 } //Compiler error: cannot use 36 (type int) as type bool in assignment

Go'nun tür sistemi PHP'den çok daha katıdır ve yerleşik dönüştürme işlevleriyle bile int bool dönüştüremezsiniz. Değişken bildirimleriniz ve kodunuzla ne yapmaya çalıştığınız hakkında sizi gerçekten düşünmeye zorlar.

Yukarıdaki Go örneğini denemek istiyorsanız, yukarıdaki kodu bir .go dosyasına kopyalayabilir ve go run myfile.go veya yeni bir Go Playground'a yapıştırabilir ve 'çalıştır' düğmesine basabilirsiniz.

Fark ettiniz mi := ? Buna 'kısa atama' operatörü denir. Bir işlevin içinde bunlar eşdeğerdir:

 var old bool old = true // Or.. var old = true //inferred type // Or... old := true

Go'nun derleyicisi, değişkenin hangi tip olması gerektiğini anlayacak kadar akıllıdır!

Go, int , string , floats ( float32 , float64 ) vb. gibi tüm olağan türleri destekler, ancak aynı zamanda array , slice , map ve channel gibi bileşik türleri de destekler. Go'nun tür sistemi son derece karmaşıktır ve C++'a benzer şekilde işaretçiler, yapılar (Go'nun nesne modelinin çekirdeği olarak işlev görür ve geliştiricilere kendi türlerini oluşturma yeteneği sağlar) ve arabirimler içerir.

diziler

Eğer benim gibiyseniz, değişkenlerin aslında değerlerini depolamak için bilgisayar belleğini kullandığını unutabilir ve ister istemez değişkenler yaratarak işinize devam edebilirsiniz.

Welp, Go seni tokatlamak için burada 😏.

Görüyorsunuz, Go'da hafızanın nasıl kullanıldığının farkında olmanız gerekiyor. Go'da dizilerle çalışmaya başladığınızda bu açıkça görülür.

Örneğin PHP'de, bir köpek listeniz olsaydı, muhtemelen şöyle bir dizi oluştururdunuz:

 $mah_dogs = [ 'Snoopy', 'Skinny', 'Scooby', 'Santos L. Halper' ];

Harika, yani aynı şeyi Go'da da yapacağız, değil mi?

 mah_dogs := [4]string{ "Snoopy", "Skinny", "Scooby", "Santos L. Halper", }

Oldukça benzer görünüyor, ancak bu [4]string kısmı ne hakkında? Bu, dostum, dizinin sabit boyutudur. Go'da, C gibi dizilerin sabit bir boyutu vardır. Diziye başka bir öğe eklemek ister misiniz? Daha iyi kopyalayın ve biraz daha büyük yeni bir dizi oluşturun!

😬

Bunun neden ve nasıl çalıştığı hakkında Go blogunda daha fazla bilgi edinebilirsiniz, ancak temel olarak diziler, dizine göre erişilebilmesi için sıralı bellek parçalarını kullanır. Bu, dizilere erişimi çok hızlı, ancak güncellemeyi yavaşlatır.

Go'da daha yaygın olarak kullanılan veri türü , dinamik bir PHP dizisi gibi olan dilimdir.

dilimler

Önceki örneğimize dayanarak, bir dizi yerine bir dilim yapalım:

 mah_dogs := []string{ "Snoopy", "Skinny", "Scooby", "Santos L. Halper", }

Farka dikkat edin? Temelde aynıdır, ancak köşeli parantezlerde sabit bir sayı yoktur. Ha?

Go'daki Slices, dizilerin üzerindeki bir katmandır, temel bir diziye referans tutarlar, ancak aslında herhangi bir veri içermezler. Yalnızca temel dizideki verilere başvururlar. Dilimlerin bir uzunluğu (kaç öğe içerdikleri) ve bir kapasiteleri (kaç öğe içerebilecekleri ) vardır. Dilimlere daha fazla öğe eklerseniz, dilimler de otomatik olarak yeniden boyutlandırılır!

PHP dizilerinde olduğu gibi, bir dilimdeki öğelere dizine göre erişebilirsiniz:

 fmt.Println(mah_dogs[0]) // Snoopy mah_dogs[0] = "Frank" fmt.Println(mah_dogs[0]) // Frank

PHP dizilerinde array_slice() gibi, yeni bir dilim oluşturmak için dilimleri bölebilirsiniz! Dilimler, bir öğe alt kümesini elde etmek için slice[high:low] sözdizimini kullanır.

 new_dogs := mah_dogs[2:] fmt.Println(new_dogs) // Scooby, Santos L. Halper

Örneğin, tüm öğelerin dilimin sonuna gelmesini istiyorsanız, yüksek veya düşük sınırı hariç tutabilirsiniz.

 new_dogs := mah_dogs[2:] // Is the same as new_dogs := mah_dogs[2:4]

Son olarak, PHP'de yapabileceğiniz gibi bir dilime öğe ekleyemezsiniz. PHP'de bir diziye başka bir öğe eklemek için [] sözdizimini kullanırsınız. Go'da append() işlevini kullanmanız gerekir.

 //PHP $mah_dogs[] = 'Dewey'; $mah_dogs[] = 'Steve'; //Go mah_dogs = append(mah_dogs, "Dewey", "Steve")

İlişkili Diziler = Haritalar

Tamam, dilimler harika ve hepsi, ancak anahtarların (dizinlerin) yalnızca tamsayılar olduğunu fark etmiş olabilirsiniz. PHP ilişkisel dizilerde olduğu gibi bir dizeyi anahtar olarak kullanabilir misiniz?

Hayır, hayır yapamazsın.

Go, harita adı verilen bir yapı kullanır. Bunlar hemen hemen ilişkisel dizilerdir, ancak Go aromalı.

 //PHP $groceries = [ 'bread' => 1.99, 'milk' => 2.99, 'eggs' => 4.99, ]; //Go groceries := map[string]float32{ "bread" : 1.99, "milk" : 2.99, "eggs" : 4.99, }

Yukarıdaki gibi bir harita değişmezi oluşturmak için sözdizimi, map[key type]value type .

Harita öğelerine erişim beklediğiniz gibi, priceOfBread := groceries["bread"] , tıpkı PHP'nin uygulaması gibi.

PHP ilişkisel diziler gibi ve Go dilimlerinin aksine, haritalara sadece yeni bir anahtar değer çifti eklenerek eklenebilir:

 groceries["fruit"] = 5.99

döngüler

Şimdi Go'nun bazı koleksiyon türlerine baktık, ancak bu yapıları nasıl yinelersiniz? Foreach döngüsü olan eski PHP ve JavaScript'i mi kullanıyoruz?

Tam olarak değil.

Go'nun yalnızca bir döngü türü vardır, for döngüsü.

Neyse ki gerçekten esnektir ve tıpkı bir foreach veya while döngüsü gibi kullanılabilir.

Temel for döngüsü PHP'nin sürümüyle neredeyse aynı görünüyor:

 sum := 0 for i := 0; i < 10; i++ { sum += i }

Bir while döngüsü:

 for sum < 1000 { sum += sum }

for döngüsünün daha çok bir foreach döngüsü gibi davranmasını sağlamak için range yan tümcesini eklemeniz yeterlidir.

Örneğin, daha önceki yiyecek haritamıza göre:

 for key, value := range groceries { fmt.Printf("%s costs $%.2f\n", key, value) } //Output bread costs $1.99 milk costs $2.99 eggs costs $4.99

%.2f ile dizgeye dönüştürülmesine dikkat edin. Bu sadece Go'ya, daha fazla kesinlik düzeyine ihtiyacımız olmadığı için yalnızca 2 ondalık hassasiyet istediğimizi söyler.

Fonksiyonlar ve çoklu dönüş değerleri

Go'daki işlevler, bazı bükülmelerle birlikte PHP'deki işlevlere benzer. Go hakkında ilk okumaya başladığımda beni şaşırtan şey, bir fonksiyondan birden çok değer döndürebilmenizdir. Birden çok değer döndürmek istediğinizde artık bir diziyi açmak yok!

 //PHP function getDogs() { $dogs = [ 'count' => 5, 'dogs' => [ 'Snoopy', 'Skinny', 'Scooby', 'Santos L. Halper' ] ]; return $dogs; } extract(getDogs()); //Go func getDogs() (count int, dogs []string) { count = 5 dogs = []string{ "Snoopy", "Skinny", "Scooby", "Santos L. Halper", } return } count, dogs = getDogs()

Argüman listesinden sonra dönüş türlerini tanımlayabileceğinizi not edeceksiniz. Bu, PHP 7'nin dönüş türlerine bir nevi benzer, ancak Go, birden çok değer döndürmenin üzerine dönüşleri adlandırdı. Adlandırılmış sonuçlar, her iki değeri de manuel olarak döndürmeniz gerekmediği anlamına gelir.

Yukarıdaki örnekte Go, return ifadesine ulaşıldığında adlandırılmış sonuçları (count int, dogs []string) kullanır. Biraz sözdizimsel bir değişiklik, ancak daha okunaklı buluyorum.

Go ayrıca, ihtiyacınız yoksa dönüş değerlerini atmanıza izin veren boş tanımlayıcıyı ( _ ) içerir.

Köpekler örneğimizde, sayıyı önemsemezsek, değeri atmak için kullanırdık:

 _, dogs = getDogs()

yapılar

Çok kısaca ele alacağımız son şey yapılardır. Yapılar karmaşık bir türdür ve Go'nun nesneler ve kompozisyon ile nasıl ilgilendiğinin temelini oluşturur. Bir dahaki sefere bunları daha derinlemesine ele alacağız, ancak şimdilik bunların ne olduğunu bilmekte fayda var.

PHP'de sınıflarımız ve geleneksel bir OOP modelimiz var – bir dizi yöntem ve özellik içeren sınıflar oluşturuyoruz. Go'daki bir tür benzer yapı yapıdır. Yapılar temelde sadece diğer türlerin gruplarıdır.

 package main import ( "fmt" "strings" ) type dog struct { name string age int likes []string } func main() { goodBoy := dog{"Skinny", 4, []string{"Food", "Sleeping"}} fmt.Printf("This is %s. It's age is %d and it's favorite things are %s", goodBoy.name, goodBoy.age, strings.Join(goodBoy.likes, ", ")) } // Output: This is Skinny. It's age is 4 and it's favorite things are Food, Sleeping

Yukarıdaki örnekte tanımlı yeni bir yapıya sahibiz – dog . Üç alanı vardır: isim, yaş ve beğeniler. Beğeniler bir dilimdir çünkü köpekler birden fazla şeyi sever, değil mi?

Yeni bir dog oluşturmak istediğimizde, oluşturduğumuz yapıya referans verebiliriz, sadece gerekli alanları doldurabiliriz.

Bunu Go Playground'da düzenlemekten çekinmeyin.

Yapılar oldukça havalı ve çok daha fazlasını yapabilirler. Bir dahaki sefere yapıları ve Go'nun kalıtım üzerinde kompozisyonunu kullanmaya başlayacağız.

Öğrenildin

Bu gönderi ile umarım PHP Go'nun ne kadar benzer olduğunu görebilmişsinizdir. Başta özetlediğim bazı kaynakları okumak ve bazı alıştırmalar yapmak için birkaç saatinizi ayırırsanız, Go'yu öğrenme yolunda ilerlemiş olursunuz.

Bir sonraki gönderide, geleneksel OOP üzerinde kompozisyon, işaretçiler/referanslar ve diğerleri arasında eşzamanlılık gibi daha karmaşık konuların bazılarını gözden geçireceğiz!

Go'ya girdin mi? PHP ve JavaScript ile nasıl eşleştiği hakkında ne düşünüyorsunuz? Yorumlarda bize bildirin!

Copyright statement: Unless otherwise noted, this article is Collected from the Internet, please keep the source of the article when reprinting.

Check Also

Divi's Theme Builder ile Özel Global Başlık Nasıl Oluşturulur

Artık Tema Oluşturucu burada olduğuna göre, web sitenizi A'dan Z'ye kurmanıza yardımcı olacak yeni eğitimlere dalmak için sabırsızlanıyoruz. Buna Divi'nin yerleşik seçeneğini kullanarak özel başlıklar oluşturma da dahildir. Bu eğitimde Divi's Theme Builder'ı kullanarak global bir başlık oluşturmaya odaklanacağız. Bu sayfaya veya gönderiye farklı bir başlık atamadıysanız, web sitenizin her yerinde genel bir başlık görünecektir.

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir