ฉันยังใหม่กับ Go และฉันรู้สึกสับสนเล็กน้อยระหว่างการเขียนโปรแกรมแบบ C-style โดยที่ตัวแปรอัตโนมัติอยู่บนสแต็กและการจัดสรรหน่วยความจำจะมีชีวิตอยู่บนฮีปและการเขียนโปรแกรมแบบสแต็กตาม Python สิ่งเดียวที่อยู่บนสแต็กคือการอ้างอิง / พอยน์เตอร์ไปยังวัตถุบนฮีป
เท่าที่ฉันสามารถบอกได้ฟังก์ชั่นทั้งสองต่อไปนี้ให้ผลลัพธ์เหมือนกัน:
func myFunction() (*MyStructType, error) {
var chunk *MyStructType = new(HeaderChunk)
...
return chunk, nil
}
func myFunction() (*MyStructType, error) {
var chunk MyStructType
...
return &chunk, nil
}
เช่นจัดสรรโครงสร้างใหม่และส่งคืน
ถ้าฉันเขียนว่าใน C วัตถุแรกจะวางวัตถุบนกองและอันที่สองจะวางบนกอง ตัวแรกจะกลับตัวชี้ไปที่กองที่สองจะกลับตัวชี้ไปที่กองซึ่งจะระเหยไปตามเวลาที่ฟังก์ชันส่งคืนซึ่งจะเป็นสิ่งที่ไม่ดี
ถ้าฉันเขียนมันด้วยภาษาไพ ธ อน (หรือภาษาสมัยใหม่อื่น ๆ อีกมากมายยกเว้น C #) ตัวอย่างที่ 2 คงเป็นไปไม่ได้
ฉันได้รับว่าขยะ Go เก็บค่าทั้งสองดังนั้นทั้งสองรูปแบบดังกล่าวข้างต้นได้ดี
อ้างถึง:
โปรดทราบว่าไม่เหมือนใน C จึงเป็นเรื่องที่ดีที่จะคืนค่าที่อยู่ของตัวแปรโลคอล หน่วยเก็บที่เกี่ยวข้องกับตัวแปรยังมีชีวิตอยู่หลังจากที่ฟังก์ชันส่งคืน ในความเป็นจริงการจดที่อยู่ของตัวอักษรผสมจะจัดสรรอินสแตนซ์สดใหม่ทุกครั้งที่ประเมินดังนั้นเราจึงสามารถรวมสองบรรทัดสุดท้ายนี้ได้
แต่มันก็ทำให้เกิดคำถามสองสามข้อ
1 - ในตัวอย่าง 1 โครงสร้างจะถูกประกาศบนฮีป ตัวอย่างที่ 2 เป็นอย่างไร นั่นคือสิ่งที่ประกาศไว้ในสแต็กในลักษณะเดียวกับที่มันเป็นใน C หรือมันไปบนกองด้วยหรือไม่
2 - ถ้าตัวอย่าง 2 ถูกประกาศบนสแต็คมันจะยังคงมีอยู่หลังจากฟังก์ชันส่งคืนอย่างไร
3 - ถ้าตัวอย่าง 2 ถูกประกาศบนฮีปจริง ๆ แล้วมันเป็นอย่างไรที่ structs ถูกส่งผ่านโดยค่ามากกว่าโดยอ้างอิง? ประเด็นของพอยน์เตอร์ในกรณีนี้คืออะไร?