问题: [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行,绿色部分
你们也能够试试其余语言