คำถามติดแท็ก go

Go เป็นภาษาโปรแกรมโอเพนซอร์ซ มันถูกพิมพ์แบบคงที่ด้วยไวยากรณ์ที่ได้มาอย่างหลวม ๆ จาก C เพิ่มการจัดการหน่วยความจำอัตโนมัติความปลอดภัยของประเภทความสามารถในการพิมพ์แบบไดนามิกบางชนิดในตัวเพิ่มเติมเช่นอาร์เรย์ความยาวตัวแปร (เรียกว่าชิ้น) และแผนที่คีย์ค่าและ ห้องสมุดมาตรฐานขนาดใหญ่

5
จะเรียกใช้ฟังก์ชันจากไฟล์อื่นในภาษา go ได้อย่างไร?
ฉันต้องการเรียกใช้ฟังก์ชันจากไฟล์อื่นใน go lang มีใครช่วยได้ไหม test1.go package main func main() { demo() } test2.go package main import "fmt" func main() { } func demo() { fmt.Println("HI") } จะโทรdemoเข้าtest2จากtest1อย่างไร?
113 go 

7
จะตรวจสอบโครงสร้างว่างได้อย่างไร?
ฉันกำหนดโครงสร้าง ... type Session struct { playerId string beehive string timestamp time.Time } บางครั้งฉันกำหนดเซสชันว่างให้กับมัน (เพราะไม่มีศูนย์) session = Session{}; จากนั้นฉันต้องการตรวจสอบว่าว่างเปล่า: if session == Session{} { // do stuff... } เห็นได้ชัดว่านี่ใช้งานไม่ได้ ฉันจะเขียนมันได้อย่างไร?
112 struct  go 

2
ตัวรับค่าเทียบกับตัวรับตัวชี้
มันไม่ชัดเจนมากสำหรับฉันในกรณีนี้ฉันต้องการใช้ตัวรับค่าแทนการใช้ตัวรับตัวชี้เสมอ สรุปจากเอกสาร: type T struct { a int } func (tv T) Mv(a int) int { return 0 } // value receiver func (tp *T) Mp(f float32) float32 { return 1 } // pointer receiver เอกสารกล่าวว่านอกจากนี้ยังมี "สำหรับประเภทเช่นประเภทพื้นฐานชิ้นและ structs ขนาดเล็กรับคุ้มค่าราคาถูกมากดังนั้นถ้าความหมายของวิธีการที่ต้องใช้ตัวชี้รับค่ามีประสิทธิภาพและชัดเจน." จุดแรกบอกว่า "ถูกมาก" แต่คำถามคือถูกกว่าแล้วตัวรับสัญญาณ ดังนั้นฉันจึงสร้างเกณฑ์มาตรฐานขนาดเล็ก(รหัสในส่วนสำคัญ)ซึ่งแสดงให้ฉันเห็นว่าตัวรับตัวชี้นั้นเร็วกว่าแม้ในโครงสร้างที่มีฟิลด์สตริงเพียงช่องเดียว นี่คือผลลัพธ์: // Struct one empty string property …
112 function  pointers  go 

5
Go ใช้ Garbage Collection แบบไหน?
Go เป็นภาษาที่เก็บขยะ: http://golang.org/doc/go_faq.html#garbage_collection ที่นี่บอกว่าเป็นเครื่องเก็บขยะแบบมาร์คและกวาด แต่ไม่ได้เจาะลึกรายละเอียดและมีการแทนที่อยู่ในผลงาน ... แต่ย่อหน้านี้ดูเหมือนจะไม่ได้รับการอัปเดตมากนักนับตั้งแต่ Go เปิดตัว มันยังคงทำเครื่องหมายและกวาด? หัวโบราณหรือเป๊ะ? เป็นรุ่น?

6
ฉันจะทดสอบการตั้งค่าโดยใช้แพ็คเกจการทดสอบใน Go ได้อย่างไร
ฉันจะประมวลผลการตั้งค่าการทดสอบโดยรวมซึ่งกำหนดขั้นตอนสำหรับการทดสอบทั้งหมดเมื่อใช้แพ็คเกจการทดสอบได้อย่างไร ดังตัวอย่างใน Nunit มี[SetUp]แอตทริบิวต์ [TestFixture] public class SuccessTests { [SetUp] public void Init() { /* Load test data */ } }
111 unit-testing  go 

5
แปลงเวลาเวลาเป็นสตริง
ฉันพยายามเพิ่มค่าบางอย่างจากฐานข้อมูลของฉันไปที่[]stringใน Go บางส่วนเป็นการประทับเวลา ฉันได้รับข้อผิดพลาด: ไม่สามารถใช้ U.Created_date (type time.Time) เป็นสตริงประเภทในองค์ประกอบอาร์เรย์ ฉันสามารถแปลงtime.Timeเป็นstring? type UsersSession struct { Userid int Timestamp time.Time Created_date time.Time } type Users struct { Name string Email string Country string Created_date time.Time Id int Hash string IP string } - var usersArray = [][]string{} rows, err := db.Query("SELECT u.id, …
111 string  time  go 

4
จะแบ่งรหัสยาว ๆ ใน Golang ได้อย่างไร?
มาจาก Python ฉันไม่คุ้นเคยกับโค้ดไลน์ที่ยาวเกิน 80 คอลัมน์ ดังนั้นเมื่อฉันพบสิ่งนี้: err := database.QueryRow("select * from users where user_id=?", id).Scan(&ReadUser.ID, &ReadUser.Name, &ReadUser.First, &ReadUser.Last, &ReadUser.Email) ฉันพยายามที่จะทำลายมัน err := database.QueryRow("select * from users where user_id=?", id) \ .Scan(&ReadUser.ID, &ReadUser.Name, &ReadUser.First, &ReadUser.Last, &ReadUser.Email) แต่ฉันเข้าใจ syntax error: unexpected \ ฉันยังลองแค่ทำลายเส้นด้วยการกดปุ่ม enter และใส่เครื่องหมายอัฒภาคที่ท้าย: err := database.QueryRow("select * from users where …
111 go  syntax 

2
วิธีที่กระชับในการสร้างชิ้นงาน 2 มิติใน Go คืออะไร?
ฉันเรียนรู้ไปโดยจะผ่านทัวร์ของไป หนึ่งของการออกกำลังกายมีถามฉันเพื่อสร้างชิ้น 2D ของdyแถวและคอลัมน์ที่มีdx uint8แนวทางปัจจุบันของฉันซึ่งใช้ได้ผลคือ: a:= make([][]uint8, dy) // initialize a slice of dy slices for i:=0;i<dy;i++ { a[i] = make([]uint8, dx) // initialize a slice of dx unit8 in each of dy slices } ฉันคิดว่าการทำซ้ำในแต่ละชิ้นเพื่อเริ่มต้นมันดูละเอียดเกินไป และถ้าชิ้นส่วนมีขนาดมากขึ้นโค้ดก็จะดูเทอะทะ มีวิธีที่กระชับในการเริ่มต้นชิ้นงาน 2 มิติ (หรือ n มิติ) ใน Go หรือไม่
111 go  slice 

5
จะชี้การพึ่งพาโมดูล Go ใน go.mod ไปยังการกระทำล่าสุดใน repo ได้อย่างไร
เริ่มต้นด้วย v1.11 Go เพิ่มการสนับสนุนสำหรับโมดูล คำสั่ง go mod init <package name> go build จะสร้างgo.modและgo.sumไฟล์ที่มีเวอร์ชันที่พบทั้งหมดสำหรับการอ้างอิงแพ็กเกจ หากโมดูลไม่มีรีลีสใด ๆ จะใช้คอมมิตล่าสุดของโมดูลนั้น หากโมดูลมีรีลีสโมดูลล่าสุดจะถูกเลือกเป็นการอ้างอิง อย่างไรก็ตามบางครั้งฉันต้องการฟังก์ชันที่ยังไม่ได้อยู่ในรุ่นที่เผยแพร่ แต่จากการคอมมิตที่ทำหลังจากรุ่นนั้น ฉันจะตั้งค่าgo.modไม่ให้ชี้ไปที่รีลีสของโมดูลได้อย่างไร แต่เป็นการคอมมิตเฉพาะในที่เก็บของโมดูล ดูเหมือนว่าฉันสามารถทำได้ด้วยมือไปแล้ว Mod ด้วย module /my/module require ( ... github.com/someone/some_module v0.0.0-20181121201909-af044c0995fe ... ) โดยที่v0.0.0ไม่ตรงกับแท็กรุ่นที่เผยแพร่ล่าสุด20181121201909จะเป็นการประทับเวลาคอมมิตและaf044c0995feจะเป็นคอมมิตแฮชหรือไม่ ข้อมูลดังกล่าวควรหาและป้อนด้วยมือหรือมีวิธีที่ดีกว่านี้?
111 git  go  module 

3
ทำไม Go จึงมีคำสั่ง "goto"
ฉันประหลาดใจที่พบว่า Go มีคำสั่ง'goto' ฉันได้รับการสอนเสมอว่าคำสั่ง 'goto' เป็นเรื่องของอดีตและความชั่วร้ายเพราะมันเกิดขึ้นจากขั้นตอนที่แท้จริงของโปรแกรมและฟังก์ชันหรือวิธีการเป็นวิธีที่ดีกว่าในการควบคุมโฟลว์ ฉันต้องขาดอะไรบางอย่าง ทำไม Google จึงรวมไว้ด้วย?
110 go  goto 

5
หลายค่าในบริบทค่าเดียว
เนื่องจากข้อผิดพลาดในการจัดการใน Go ฉันมักจะจบลงด้วยฟังก์ชันหลายค่า จนถึงตอนนี้วิธีที่ฉันจัดการมันยุ่งมากและฉันกำลังมองหาแนวทางปฏิบัติที่ดีที่สุดในการเขียนโค้ดที่สะอาดกว่า สมมติว่าฉันมีฟังก์ชันต่อไปนี้: type Item struct { Value int Name string } func Get(value int) (Item, error) { // some code return item, nil } ฉันจะกำหนดตัวแปรใหม่ให้สวยitem.Valueหรูได้อย่างไร ก่อนที่จะแนะนำการจัดการข้อผิดพลาดฟังก์ชันของฉันเพิ่งกลับมาitemและฉันสามารถทำได้: val := Get(1).Value ตอนนี้ฉันทำสิ่งนี้: item, _ := Get(1) val := item.Value ไม่มีวิธีเข้าถึงตัวแปรที่ส่งคืนแรกโดยตรงหรือไม่?

4
ฉันจะดาวน์โหลดไฟล์ขนาดใหญ่อย่างมีประสิทธิภาพโดยใช้ Go ได้อย่างไร
มีวิธีดาวน์โหลดไฟล์ขนาดใหญ่โดยใช้ Go ซึ่งจะจัดเก็บเนื้อหาลงในไฟล์โดยตรงแทนที่จะเก็บไว้ในหน่วยความจำก่อนเขียนลงไฟล์หรือไม่? เนื่องจากไฟล์มีขนาดใหญ่มากการจัดเก็บทั้งหมดในหน่วยความจำก่อนที่จะเขียนลงไฟล์จะใช้หน่วยความจำทั้งหมด
110 go 

10
ทำไม Go จึงช้ามาก (เมื่อเทียบกับ Java)
ดังที่เราเห็นจากเกมเกณฑ์มาตรฐานภาษาคอมพิวเตอร์ในปี 2010: Go จะช้ากว่าCโดยเฉลี่ย 10 เท่า Go ช้ากว่าJava 3 เท่า!? สิ่งนี้จะเป็นได้อย่างไรโดยจำไว้ว่า Go compiler สร้างโค้ดเนทีฟสำหรับการดำเนินการ คอมไพเลอร์ที่ยังไม่บรรลุนิติภาวะสำหรับ Go? หรือมีปัญหาบางอย่างกับภาษา Go? แก้ไข: คำตอบส่วนใหญ่ปฏิเสธความช้าของ Go โดยอ้างว่าปัญหาอยู่ในคอมไพเลอร์ที่ยังไม่บรรลุนิติภาวะ ดังนั้นฉันจึงได้ทำการทดสอบด้วยตัวเองเพื่อคำนวณตัวเลข Fibonacci : อัลกอริทึมซ้ำทำงานใน Go (freebsd, 6g) ด้วยsameความเร็วเช่นเดียวกับใน C (พร้อมตัวเลือก O3) ตัวเรียกซ้ำที่น่าเบื่อทำงานใน Go 2 timesช้ากว่าใน C (พร้อมตัวเลือก -O3 กับ -O0 - เหมือนกัน) แต่ฉันไม่เคยเห็น 10x ลดลงเหมือนในเกม Benchmarks

12
มีวิธีการสร้าง UUID ด้วยภาษา go
ฉันมีรหัสที่มีลักษณะดังนี้: u := make([]byte, 16) _, err := rand.Read(u) if err != nil { return } u[8] = (u[8] | 0x80) & 0xBF // what does this do? u[6] = (u[6] | 0x40) & 0x4F // what does this do? return hex.EncodeToString(u) มันส่งคืนสตริงที่มีความยาว 32 แต่ฉันไม่คิดว่ามันเป็น UUID ที่ถูกต้อง หากเป็น UUID จริงเหตุใดจึงเป็น …
109 go  uuid 

5
จะรอให้ goroutines ทั้งหมดเสร็จได้อย่างไรโดยไม่ต้องใช้เวลานอนหลับ?
รหัสนี้เลือกไฟล์ xml ทั้งหมดในโฟลเดอร์เดียวกันเนื่องจากไฟล์ปฏิบัติการที่เรียกใช้และอะซิงโครนัสจะใช้การประมวลผลกับแต่ละผลลัพธ์ในวิธีการโทรกลับ (ในตัวอย่างด้านล่างจะพิมพ์เฉพาะชื่อของไฟล์เท่านั้น) ฉันจะหลีกเลี่ยงการใช้วิธีการนอนหลับเพื่อป้องกันไม่ให้วิธีหลักออกไปได้อย่างไร? ฉันมีปัญหาในการห่อหัวของฉันไปรอบ ๆ ช่อง (ฉันคิดว่านั่นคือสิ่งที่ต้องใช้ในการซิงโครไนซ์ผลลัพธ์) ดังนั้นขอขอบคุณความช่วยเหลือใด ๆ ! package main import ( "fmt" "io/ioutil" "path" "path/filepath" "os" "runtime" "time" ) func eachFile(extension string, callback func(file string)) { exeDir := filepath.Dir(os.Args[0]) files, _ := ioutil.ReadDir(exeDir) for _, f := range files { fileName := f.Name() if extension …

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.