golang 遞歸本身,輸出本身的源代碼

問題: [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行,綠色部分

 

  你們也能夠試試其餘語言

相關文章
相關標籤/搜索