golang 递归自己,输出自己的源代码
问题: [2min 大家自己想想]
一个程序P运行后能否输出自己的源代码?并且格式保持一致(换行、空格等)
思考:
这个问题的本质是一个递归问题,设有P运行后生成G 既P->G && P==G:
1. P 中需要设置一个字符串 me 来存放自己的源码
2. P.me 的赋值内容为 P 源文件开头到 P.me 所在行(P 中蓝色部分和红色部分相同), 此时 P.me 中的内容是G的开头到 G.me 赋值的源码 (G中红色部分)
3. P然后继续打印出G.me 赋值的内容(G中蓝色部分)
这样的话就需要保证 P中 print me 在前,me 的赋值在后即可,而刚好我们可以想到golang 中init 函数先于main 函数执行而与所在行的前后无关,所以我们可以将P.me 的赋值放init 中,行数大于main 的所在行数, 这样在为P.me 赋值时 P中的源代码已经确定了
源代码:
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 }
可以看到代码中 红色部分和蓝色部分完全一致
第10行执行时,输出的是G 1-17 行,红色部分
第11行执行时,输出的是G 17行中的`, 黄色部分
第12行执行时, 输出的是G 17-33行,蓝色部分
第13行执行时,输出的是G 33-34行,绿色部分
大家也可以试试其他语言
golang 递归自己,输出自己的源代码的更多相关文章
- Golang的格式化输出fmt.Printf
本文来源:Go by example. Golang的格式化输出 和 C语言的标准输出基本一样,但是增加了一些针对Golang语言的特有数据结构的格式化输出方式. 一下就是实例: package ma ...
- [golang]golang如何覆盖输出console,实现进度条;golang一个骚气的进度提示库
[golang]golang如何覆盖输出console,实现进度条 package main import( "fmt" "os" "time&quo ...
- 汉诺塔算法的递归与非递归的C以及C++源代码
汉诺塔(又称河内塔)问题其实是印度的一个古老的传说. 开天辟地的神勃拉玛(和中国的盘古差不多的神吧)在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一 个小, ...
- C语言---递归反向输出任意长度的字符串
(该字符串可以包含空格和回车!) [题目要求] 编写一个递归函数,实现将输入的任意长度的字符串反向输出的功能. 例如输入字符串:ABCD,输出字符串:DCBA. [题目分析] 应用递归的思想有时可以很 ...
- Python3:递归实现输出目录下所有的文件
今天来整理一下os库中方法的使用,如何输出一个目录下的所有文件? 1.首先介绍几个基本的的方法: 1)os.getcwd() #返回当前工作目录 2)os.listdir() #返回一个列表, ...
- IO流——递归(输出所有文件)
package pers.zbb.File; import java.io.File; public class FileDemo { public static void main(String[] ...
- Java基础知识强化之IO流笔记14:递归之输出指定目录下所有java文件绝对路径的案例
1. 需求:输出指定目录下的所以.java结尾文件的绝对路径的案例: 分析: A:封装目录 B:获取该目录下的所有文件和文件夹的File数组 C:遍历这个File数组,得到每一个File对象的 ...
- Python3基础 response.read 输出网页的源代码
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- golang 并发顺序输出数字
参考 package main import ( "fmt" "sync/atomic" "time" ) func main() { va ...
随机推荐
- mysql查看各表占磁盘空间
select TABLE_NAME, concat(truncate(data_length/1024/1024,2),' MB') as data_size, concat(truncate(ind ...
- jenkins集群(一) -- 在Linux上部署
一.安装好jdk.maven.git 1.安装jdk并配置好全局变量 2.安装maven:yum install maven 3.安装jdk:yum install git 二 .安装jenkins ...
- 2020数字中国创新大赛虎符网络安全赛道-pwn count
比赛结束前半个小时才看的题,等我做出来比赛已经结束了.难受Orz 本地文件无法执行,远程调试. 题目大概意思就是让你计算200道四则运算.(实际上格式是固定的.先乘一次然后再加两次).200道题都正确 ...
- 给自己挖坑——DateWay
参考文章 官方手册 官方博客 填坑 目录 简介 使用 1. 引入相关依赖 2. 配置 Dataway,并初始化数据表 3. 配置数据源 4. 把数据源设置到 Hasor 容器中 5. 在SprintB ...
- Day02_IP地址详解&进制转换&DOS基本命令与批处理
学于千峰教育开源课程 感谢 千峰教育官网 b站在线视频 IP地址详解 一.简单局域网的构成 局域网:一般称为内网 简单局域网的构成:交换机.网线.PC(其他IT终端) 交换机:用来组建内网的局域网的设 ...
- Python日历模块
Python日历模块 calendar: 0:星期一是第一天 6:星期日是最后一天 注:形参 w,I,c 可以不写,正常使用,使用默认形参即可 calendar(year,w=2,I=1,c=6): ...
- 自述:转职IT ,痛苦一阵子;不转职IT,痛苦一辈子(第一章)
作为一个从后期制作转职过来的Java工程师,我认为我是幸运的,虽然我的本科专业(影视后期)也是火爆行业,不愁工作,但我不后悔进入这个IT坑,毕竟转行,只痛苦一阵子,但是不转行,可能我会痛苦一辈子. 我 ...
- PHP password_needs_rehash() 函数
password_hash() 函数用于检测散列值是否匹配指定的选项. PHP 版本要求: PHP 5 >= 5.5.0, PHP 7高佣联盟 www.cgewang.com 语法 bool p ...
- PHP ftp_quit() 函数
定义和用法 ftp_quit() 函数关闭 FTP 连接. 语法 ftp_quit(ftp_connection) 参数 描述 ftp_connection 必需.规定要关闭的 FTP 连接. 提示和 ...
- 4.22 省选模拟赛 三元组 manacher 回文自动机
容易发现可以枚举j 那么只需要计算出 l~j这段是回文串的l的和 以及j+1~r这段是回文串的r的和. 可以manacher 之后想要求出以j为右端点的回文串左端点的和 这个东西我们通过某个点为中心的 ...