問題: [2min 你們本身想一想]golang
一個程序P運行後可否輸出本身的源代碼?而且格式保持一致(換行、空格等)
思考:函數
這個問題的本質是一個遞歸問題,設有P運行後生成G 既P->G && P==G:spa
1. P 中須要設置一個字符串 me 來存放本身的源碼code
2. P.me 的賦值內容爲 P 源文件開頭到 P.me 所在行(P 中藍色部分和紅色部分相同), 此時 P.me 中的內容是G的開頭到 G.me 賦值的源碼 (G中紅色部分)blog
3. P而後繼續打印出G.me 賦值的內容(G中藍色部分)遞歸
這樣的話就須要保證 P中 print me 在前,me 的賦值在後便可,而恰好咱們能夠想到golang 中init 函數先於main 函數執行而與所在行的先後無關,因此咱們能夠將P.me 的賦值放init 中,行數大於main 的所在行數, 這樣在爲P.me 賦值時 P中的源代碼已經肯定了字符串
源代碼:源碼
1 package main 2 3 import ( 4 "fmt" 5 ) 6 7 var me string 8 9 func main() { 10 fmt.Print(me) 11 fmt.Print(string(rune(96))) 12 fmt.Print(me) 13 fmt.Print(string(rune(96)) + "\n}") 14 } 15 16 func init() { 17 me = `package main 18 19 import ( 20 "fmt" 21 ) 22 23 var me string 24 25 func main() { 26 fmt.Print(me) 27 fmt.Print(string(rune(96))) 28 fmt.Print(me) 29 fmt.Print(string(rune(96))+"\n}") 30 } 31 32 func init() { 33 me = ` 34 }
能夠看到代碼中 紅色部分和藍色部分徹底一致string
第10行執行時,輸出的是G 1-17 行,紅色部分it
第11行執行時,輸出的是G 17行中的`, 黃色部分
第12行執行時, 輸出的是G 17-33行,藍色部分
第13行執行時,輸出的是G 33-34行,綠色部分
你們也能夠試試其餘語言