ไวยากรณ์ของ Go ขึ้นอยู่กับองค์ประกอบที่คุ้นเคยของภาษา C โดยมีการยืมมาจากภาษา Python ภาษาค่อนข้างกระชับ แต่โค้ดอ่านและเข้าใจง่าย โค้ด Go ได้รับการคอมไพล์เป็นไฟล์ปฏิบัติการไบนารีแบบสแตนด์อโลนที่ทำงานแบบเนทิฟโดยไม่ต้องใช้เครื่องเสมือน (การทำโปรไฟล์ การดีบัก และระบบย่อยการตรวจจับปัญหารันไทม์อื่นๆ ถูกรวมเข้าด้วยกันเป็น
โปรเจ็กต์นี้ได้รับการพัฒนาในขั้นต้นโดยมุ่งเน้นไปที่การเขียนโปรแกรมแบบมัลติเธรดและการทำงานที่มีประสิทธิภาพบนระบบมัลติคอร์ รวมถึงการจัดเตรียมวิธีการระดับผู้ปฏิบัติงานสำหรับการจัดระเบียบการประมวลผลแบบขนานและการโต้ตอบระหว่างวิธีการดำเนินการแบบขนาน ภาษายังให้การป้องกันในตัวต่อบล็อกหน่วยความจำที่จัดสรรมากเกินไป และให้ความสามารถในการใช้ตัวรวบรวมขยะ
หลัก
- การทำงานของตัวเชื่อมโยงได้รับการปรับปรุงอย่างมีนัยสำคัญ ทั้งในด้านการเพิ่มความเร็วของการทำงานและลดการใช้หน่วยความจำ และในทิศทางของการบำรุงรักษาโค้ดที่ง่ายขึ้น เมื่อทดสอบบนระบบปฏิบัติการโดยใช้รูปแบบไฟล์ปฏิบัติการของ ELF (Linux, FreeBSD, NetBSD, OpenBSD, Dragonfly, Solaris) ชุดแอปพลิเคชัน Go ขนาดใหญ่ทั่วไปถูกสร้างขึ้นเร็วขึ้น 20% และการใช้หน่วยความจำลดลงโดยเฉลี่ย 30% ประสิทธิภาพการทำงานที่เพิ่มขึ้นเกิดขึ้นได้โดยการเปลี่ยนไปใช้รูปแบบไฟล์อ็อบเจ็กต์ใหม่และการทำงานใหม่ตามขั้นตอนภายในเพื่อเพิ่มระดับการทำงานแบบขนาน ขณะนี้ Native Linker ถูกใช้เป็นค่าเริ่มต้นบนระบบ linux/amd64 และ linux/arm64 ใน "-buildmode=pie" ซึ่งไม่จำเป็นต้องใช้ C linker อีกต่อไป
- ในรันไทม์ การกระจายของอ็อบเจ็กต์ขนาดเล็กบนระบบที่มีคอร์ CPU จำนวนมากได้รับการปรับปรุงอย่างมีนัยสำคัญ และเวลาแฝงลดลง ในกรณีที่เกิดความล้มเหลว ค่าที่มีประเภทตัวเลขและสตริงจะแสดงแทนการแสดงที่อยู่ เมื่อส่งสัญญาณ SIGSEGV, SIGBUS และ SIGFPE ไปยังแอปพลิเคชัน Go ในกรณีที่ไม่มีตัวจัดการ os/signal.Notify แอปพลิเคชันจะออกพร้อมกับเอาต์พุตการติดตามสแต็ก (ก่อนหน้านี้พฤติกรรมไม่สามารถคาดเดาได้)
- คอมไพลเลอร์ได้รับการปรับให้เหมาะสมเพื่อลดขนาดของไฟล์ปฏิบัติการที่สร้างขึ้นโดยเฉลี่ย 5% โดยการหยุดการรวมข้อมูลเมตาบางส่วนสำหรับตัวรวบรวมขยะและการทำความสะอาดเมตาดาต้าที่ไม่ได้ใช้เชิงรุกมากขึ้น
- มีการเพิ่มแฟล็ก "-spectre" ลงในคอมไพลเลอร์และแอสเซมเบลอร์เพื่อเปิดใช้งานการป้องกันการโจมตีคลาส Spectre (สำหรับโปรแกรมส่วนใหญ่ไม่จำเป็นต้องใช้ การเปิดใช้งานตัวเลือกสามารถทำได้เฉพาะสำหรับ
บางกรณีที่เฉพาะเจาะจงมาก ). - ในใบรับรอง X.509 ช่อง CommonName เลิกใช้งานแล้ว ซึ่งจะถือว่าเป็นชื่อโฮสต์ไม่ได้อีกต่อไป หากช่อง Subject Alternative Names หายไป
- คำสั่ง "go" ในตัวแปรสภาพแวดล้อม GOPROXY สามารถแสดงรายการพรอกซีหลายรายการได้แล้ว โดยคั่นด้วยเครื่องหมายจุลภาคหรือ "|" หากพร็อกซีแรกในรายการส่งคืนข้อผิดพลาด (404 หรือ 410) แสดงว่าจะพยายามติดต่อผ่านพร็อกซีตัวที่สอง เป็นต้น
- ยูทิลิตี้ vet ได้เพิ่มคำเตือนเกี่ยวกับการพยายามแปลงจาก string(x) หาก "x" เป็นประเภทจำนวนเต็มที่ไม่ใช่ rune หรือ byte
- เพิ่มแฟล็ก "-gnu" ลงในยูทิลิตี้ objdump เพื่อรองรับการแยกส่วนไวยากรณ์แอสเซมเบลอร์ GNU
- เพิ่มแพ็คเกจใหม่แล้ว
เวลา/tzdata ซึ่งช่วยให้คุณสามารถรวมฐานข้อมูลกับข้อมูลเขตเวลาลงในโปรแกรมได้ - จากข้อความต้นฉบับและเอกสารประกอบ
ลบออก วลี whitelist/blacklist และ master/slave ซึ่งตอนนี้ถูกแทนที่ด้วย "allowlist", "blocklist", "process", "pty", "proc" และ "control" - มีการปรับปรุงเล็กน้อยส่วนใหญ่ในไลบรารีมาตรฐาน
- เพิ่มการรองรับ OpenBSD 6.7 ในโหมด GOARCH=arm และ GOARCH=arm64 (ก่อนหน้านี้รองรับเฉพาะ GOARCH=386 และ GOARCH=amd64 เท่านั้น)
- การพัฒนาแพลตฟอร์ม RISC-V 64 บิต (GOOS=linux, GOARCH=riscv64) ยังคงดำเนินต่อไป
- สำหรับระบบ x32 แบบ 86 บิต รุ่นถัดไปจะเพิ่มข้อกำหนดขั้นต่ำของระบบ - เฉพาะโปรเซสเซอร์ที่มี SSE2 เท่านั้นที่จะยังคงได้รับการสนับสนุน ในการสร้างในโหมด GOARCH=386 คุณจะต้องมี Intel Pentium 4 เป็นอย่างน้อย (เปิดตัวในปี 2000) หรือ AMD Opteron/Athlon 64 (เปิดตัวในปี 2003)
ที่มา: opennet.ru