Ⅰ Go 是怎麼使用 Go 來編譯自身的
至於怎麼編譯自身的:
用其它語言比如c++實現一個[Go語言編譯器-1]
用Go語言寫一個[Go語言編譯器-2]
用這個c++實現的[Go語言編譯器-1]編譯第2步裡面說的Go語言寫的[Go語言編譯器-2]
用第3步得到的[Go語言編譯器-2],再編譯一次第2步裡面說的[Go語言編譯器-2]的源碼。
OK,現在有一個Go語言實現的編譯器了,最開始那個c++寫的編譯器沒用了,可以扔掉不要了。以後就不停的優化使用這個Go語言實現的自身的編譯器就行了。
Ⅱ golang 多人開發怎麼保證源碼安全
隨著PHP有著越來越深入的了解,以及遇到越來越多的不同業務時,使用PHP總會讓我有一種莫名的無力感。當然,並不是我一個人在使用PHP的時候遇到了問題。事實上,每個略微有一些經驗,接觸過一些需求的人都會有同樣的困惑。各種配合LAMP(或者LNMP?)架構的後端技術也因此被發明或被發現,進而整合到PHP的開發的技術體系中。從簡單的Memcached作為數據中轉,cron後端定時處理;到Gearman、RabbitMQ這些隊列神器;最近Laruence甚至封裝了利用libcurl的非同步特性實現並發RPC調用的yar擴展。幾乎整個社區都在尋找PHP的摩西之路。好吧,說了一大堆,回歸主題。之前我寫了一篇英文練筆《》,獲得不少國際友人的關注。排除拼寫和語法被他們詬病外,主要是有許多朋友覺得我沒把事情說清楚。所以這里我用母語重新聊聊這個事情,只是這些國際友人什麼時候能學會閱讀中文呢?;)Go或者Golang,是由Google支持的快速、一致、穩定的,有活躍的社區支持的開源編程語言。越來越多的應用選擇使用Golang進行構建。雖然RobPike說「…我們希望C++程序員來了解Go並作為一個可選的語言…」,不過我真得認為:PHPer應當學習Golang!接下來我們就來談談原因。容易學習PHP相當容易學習。Golang也是!在這點上,一群大老外對我的觀點進行了猛烈的抨擊。他們認為我羞辱了PHPer,說得好像只有簡單的東西PHPer才能學會一樣。但是,這難道不是事實嗎?或者換個說法:像我一樣的喜歡PHP的人,或多或少都會更喜歡簡單的東西。PHP的語法接近C族編程語言(C/C++/Java等等)。如果有這些語言的經驗,在第一次遇到PHP的時候立刻就能開始上手編寫代碼。在我看來,編寫PHP代碼或許更加考驗程序員的記憶力,而不是智力(當你面對各種不同風格的函數定義、各種擴展的特殊約定時,你一定會相當認同我的觀點)。Golang同樣是一個C族編程語言。呃,或者有一些不同吧。例如關鍵字「for」,功能上和PHP的接近,但是沒有括弧。條件語句「if」同樣無需括弧。可以閱讀EffectiveGo了解內容。Golang只有3025個關鍵字和47個操作符號、分隔符號或其他特殊標記。記住這些標記確實不需要什麼特別的努力。精巧的類型系統相當容易使用。實用的,具有方法的結構體類型代替了笨重的對象系統。介面的設計是Golang中我最喜歡的部分。當完成了《Go指南》的學習之後,利用PHP積累的經驗,立刻就可以開始使用Golang處理一些簡單的任務。容易使用PHP腳本是由SAPI組件進行解析執行的,如Web伺服器模塊、PHP-FPM或者CLI。部署PHP所需要的全部東西就是一個SAPI環境。配置這個環境對於新手來說可能是學習PHP過程中最為困難的部分。所有的Golang代碼會編譯和鏈接為本地碼。所以除了編譯環境,執行時無需再為其進行任何特別的部署。對比PHP環境的配置,這要簡單很多。你真得認為配置PHP環境很復雜嗎?我不覺得,真的!而配置Golang編譯環境比那還要簡單點。我確信已經有大量的Golang相關的書籍、文章介紹過如何進行編譯環境的配置了。為了更加清晰,我這里梳理一下思路。有三個步驟需要處理:下載Golang的源代碼;根據《[翻譯]Go環境設置》的提示設置環境變數;運行源代碼src目錄中的all.bash。或者一步到位:使用二進制包進行安裝。然後就會得到一個叫做「go」的工具集合。使用「go」工具和使用PHP的CLI工具一樣簡單。《[翻譯]go工具》對此進行了詳細的解釋。PHP的迷思如果一個編程語言容易學習和使用,我們是不是就應當學習它呢?有許多容易學習和使用的編程語言。難道要把它們都學一遍?答案是顯然的:NO!但是呢?只是因為它很酷!是的,我在開玩笑,但是這是真的。無論如何先從PHP自身談起吧。PHP「原本是為了開發動態的Web頁面而設計的伺服器端通用語言(Wikipedia)」。PHP一個重要的特性就是可以嵌入到HMTL中。代碼編寫在「」標簽內;HTML寫在標簽外。它有一個強大的擴展系統。擴展使用C調用ZendAPI編寫。數據的處理實際上要利用這些擴展完成。在我看來,PHP是世界上最好的模板語言。但是當積累了一些PHP的經驗,並且開始面對一些更加復雜的Web應用時,你一定會對PHP產生一種無力的感覺。它沒有內建的並行機制,沒有線程、進程(你真得認為那個簡陋的進程式控制制可以不加改造的用在高並發的生產環境?),或者其他某「程」。一個慢數據源可以阻塞整個頁面的處理。消息隊列、緩存、代理……系統開始不僅僅是PHP這么單純,還包括了許多服務和系統組件。這時,PHP只處理很少的業務邏輯,成為真正的模板語言了。PHPer們總是在尋找解決這一問題的法,如「PHPmultithread」或者PHPRPC並發框架。我很難說哪種會更好一些。不過我肯定你會需要選擇一些編程語言用於後端工作的開發。就我自己的經驗,我嘗試過C(一直在和malloc/free進行搏鬥)/Java(陷入到了jar地獄中)/python(從來沒能做到Pythonic不說,還總是在錯誤的類型中打轉)……如果想要獲得性能,就得同內存管理進行搏鬥;如果用GC,就得部署和調優VM;當獲得便利性的時候,同時也是走在刀尖上,一個小錯誤就引起巨大的災難……每個都有優勢,同樣每個都有問題。好吧!現在回到Golang!Golang有GC,無需關心內存管理(或者可以用較少的精力去關注它)。代碼被編譯為本地碼,因此「cp」和「mv」就是部署Golang編寫的應用所需要的全部工具。噢,我剛才已經說過了,Golang是一個具有靜態類型系統的編譯語言。所以你沒有機會弄亂變數的類型。當然,PHPer應該學習Golang的一個重要原因是「轉到Go是因為他們並未放棄太多的表達能力,但是獲得了性能,並且與並發共舞(RobPike)」。《WhyNotGo?(英文)》對此進行了深入的分析。我可以分享一些我的經驗:有一個Gearman的worker用於處理後端數據。PHP通過其API連接到Gearman的JobServer向worker發起請求。最初worker是使用python編寫的(還有更加原始的版本,PHP的,但是你能想像它工作起來……唉,不說了……)。這個版本有許多的問題(是我們自己的問題,不關Python的事),但是至少它能工作。後來用Golang重寫了這個worker。為此我開發了Golang的GearmanAPI,並使用ZendAPI編寫了一個在Golang中執行PHP腳本的包。然後將它們放在一起:一個可以執行PHP的Gearmanworker。它已經工作了一段時間了,看起來還不錯!哦,受到Yar的啟發,這里還有一個Golang編寫的RPC合並器,用來合並PHP腳本中的RPC調用。現在還是個玩具,不過或許日後能用得著。這其實是將Golang的channel當作消息隊列來用。我在《Golang:有趣的channel應用》中對此有一些說明。世界真美好啊。謝謝Golang!無論如何,大多數PHPer在進行後端開發的時候都會需要學習一些其他語言。如果你正在尋找,或者已經嘗試了一些其他語言。為什麼不來試試Golang?它真得可以讓你的生活更加輕松和快樂。讓你可以有的時間陪伴你的家人和朋友,吃你愛吃的東西,去你想去的地方。貌似我還是沒說清楚啊?好吧,沒關系,在下個月的中國軟體開發者大會上再跟大家就這個話題做一個探討吧。
Ⅲ go語言哪個包簡單一點,可以看源碼
LiteIDE是一款專門為Go語言開發的跨平台輕量級集成開發環境(IDE),由QT編寫。LiteIDE主要特點:支持主流操作系統WindowsLinuxMacOSXGo編譯環境管理和切換管理和切換多個Go編譯環境支持Go語言交叉編譯與Go標准一致的項目管理方式基於GOPAT
Ⅳ ios 系統用Objective-C 在sdk上開發一個小型計算器,要求實現基本的四則運算即可,帶源碼和分析
#import <UIKit/UIKit.h>
@interface LEViewController : UIViewController
{
double a;
double b;
double c;
UITextField *atextField;
UILabel *aLabel;
NSString *str;
NSMutableString *str1;
}
@end
#import "LEViewController.h"
@interface LEViewController ()
@end
@implementation LEViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
str1=[[NSMutableString alloc]init ];}
return self;
}
/**
*@控制器入口
*
*/
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
[self.view setBackgroundColor:[UIColor blueColor] ];
aLabel= [[UILabel alloc]initWithFrame:CGRectMake(100, 20, 80, 40)];
[aLabel setText:@" 計算器"];
[self.view addSubview:aLabel];
atextField =[[UITextField alloc]initWithFrame:CGRectMake(0, 60, 320, 50)];
[atextField setBorderStyle:UITextBorderStyleRoundedRect];
[self.view addSubview:atextField];
UIButton *button=[UIButton buttonWithType:UIButtonTypeRoundedRect];
[button setFrame:CGRectMake(20, 380, 270, 60)];
[button setTitle:@"=" forState:UIControlStateNormal];
[button addTarget:self action:@selector(go) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
UIButton *button1=[UIButton buttonWithType:UIButtonTypeRoundedRect];
[button1 setFrame:CGRectMake(20, 110, 60, 60)];
[button1 setTitle:@"1" forState:UIControlStateNormal];
[button1 addTarget:self action:@selector(one) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button1];
UIButton *button2=[UIButton buttonWithType:UIButtonTypeRoundedRect];
[button2 setFrame:CGRectMake(90, 110, 60, 60)];
[button2 setTitle:@"2" forState:UIControlStateNormal];
[button2 addTarget:self action:@selector(two) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button2];
UIButton *button3=[UIButton buttonWithType:UIButtonTypeRoundedRect];
[button3 setFrame:CGRectMake(160, 110, 60, 60)];
[button3 setTitle:@"3" forState:UIControlStateNormal];
[button3 addTarget:self action:@selector(three) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button3];
UIButton *button4=[UIButton buttonWithType:UIButtonTypeRoundedRect];
[button4 setFrame:CGRectMake(20, 170, 60, 60)];
[button4 setTitle:@"4" forState:UIControlStateNormal];
[button4 addTarget:self action:@selector(four) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button4];
UIButton *button5=[UIButton buttonWithType:UIButtonTypeRoundedRect];
[button5 setFrame:CGRectMake(90, 170, 60, 60)];
[button5 setTitle:@"5" forState:UIControlStateNormal];
[button5 addTarget:self action:@selector(five) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button5];
UIButton *button6=[UIButton buttonWithType:UIButtonTypeRoundedRect];
[button6 setFrame:CGRectMake(160, 170, 60, 60)];
[button6 setTitle:@"6" forState:UIControlStateNormal];
[button6 addTarget:self action:@selector(six) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button6];
UIButton *button7=[UIButton buttonWithType:UIButtonTypeRoundedRect];
[button7 setFrame:CGRectMake(20, 240, 60, 60)];
[button7 setTitle:@"7" forState:UIControlStateNormal];
[button7 addTarget:self action:@selector(seven) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button7];
UIButton *button8=[UIButton buttonWithType:UIButtonTypeRoundedRect];
[button8 setFrame:CGRectMake(90, 240, 60, 60)];
[button8 setTitle:@"8" forState:UIControlStateNormal];
[button8 addTarget:self action:@selector(eight) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button8];
UIButton *button9=[UIButton buttonWithType:UIButtonTypeRoundedRect];
[button9 setFrame:CGRectMake(160, 240, 60, 60)];
[button9 setTitle:@"9" forState:UIControlStateNormal];
[button9 addTarget:self action:@selector(nine) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button9];
UIButton *button10=[UIButton buttonWithType:UIButtonTypeRoundedRect];
[button10 setFrame:CGRectMake(20, 310, 60, 60)];
[button10 setTitle:@"0" forState:UIControlStateNormal];
[button10 addTarget:self action:@selector(zero) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button10];
UIButton *button11=[UIButton buttonWithType:UIButtonTypeRoundedRect];
[button11 setFrame:CGRectMake(90, 310, 60, 60)];
[button11 setTitle:@"." forState:UIControlStateNormal];
[button11 addTarget:self action:@selector(dian) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button11];
UIButton *button12=[UIButton buttonWithType:UIButtonTypeRoundedRect];
[button12 setFrame:CGRectMake(230, 240, 60, 60)];
[button12 setTitle:@"*" forState:UIControlStateNormal];
[button12 addTarget:self action:@selector(chen) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button12];
UIButton *button13=[UIButton buttonWithType:UIButtonTypeRoundedRect];
[button13 setFrame:CGRectMake(160, 310, 60, 60)];
[button13 setTitle:@"AC" forState:UIControlStateNormal];
[button13 addTarget:self action:@selector(ac) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button13];
UIButton *button14=[UIButton buttonWithType:UIButtonTypeRoundedRect];
[button14 setFrame:CGRectMake(230, 310, 60, 60)];
[button14 setTitle:@"/" forState:UIControlStateNormal];
[button14 addTarget:self action:@selector(chu) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button14];
UIButton *button15=[UIButton buttonWithType:UIButtonTypeRoundedRect];
[button15 setFrame:CGRectMake(230, 110, 60, 60)];
[button15 setTitle:@"+" forState:UIControlStateNormal];
[button15 addTarget:self action:@selector(add) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button15];
UIButton *button16=[UIButton buttonWithType:UIButtonTypeRoundedRect];
[button16 setFrame:CGRectMake(230, 170, 60, 60)];
[button16 setTitle:@"-" forState:UIControlStateNormal];
[button16 addTarget:self action:@selector(jian) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button16];
}
-(void)one
{
str =@"1";
[str1 appendString:str];
atextField.text=str1;
a=[str1 doubleValue];
}
-(void)two
{
str =@"2";
[str1 appendString:str];
atextField.text=str1;
a=[str1 doubleValue];
}
-(void)three
{
str =@"3";
[str1 appendString:str];
atextField.text=str1;
a=[str1 doubleValue];
}
-(void)four
{
str =@"4";
[str1 appendString:str];
atextField.text=str1;
a=[str1 doubleValue];}
-(void)five
{
str =@"5";
[str1 appendString:str];
atextField.text=str1;
a=[str1 doubleValue];}
-(void)six
{
str =@"6";
[str1 appendString:str];
atextField.text=str1;
a=[str1 doubleValue];}
-(void)seven
{
str =@"7";
[str1 appendString:str];
atextField.text=str1;
a=[str1 doubleValue];}
-(void)eight
{
str =@"8";
[str1 appendString:str];
atextField.text=str1;
a=[str1 doubleValue];}
-(void)nine
{
str =@"9";
[str1 appendString:str];
atextField.text=str1;
a=[str1 doubleValue];}
-(void)add
{
str =@"+";
[str1 appendString:str];
atextField.text=str1;
b='1';c=a;
a=[str1 doubleValue];
[str1 release];
str1=[[NSMutableString alloc] init];}
-(void)jian
{
str =@"-";
[str1 appendString:str];
atextField.text=str1;
b='2';c=a;
a=[str1 doubleValue];
[str1 release];
str1=[[NSMutableString alloc] init];}
-(void)chen
{
str =@"*";
[str1 appendString:str];
atextField.text=str1;
b='3';c=a;
a=[str1 doubleValue];
[str1 release];
str1=[[NSMutableString alloc] init];}
-(void)chu
{
str =@"/";
[str1 appendString:str];
atextField.text=str1;
b='4';c=a;
a=[str1 doubleValue];
[str1 release];
str1=[[NSMutableString alloc] init];}
-(void)dian
{
str =@".";
[str1 appendString:str];
atextField.text=str1;
a=[str1 doubleValue];}
-(void)ac
{
str =@"0";
atextField.text=@"0";}
-(void)zero
{
str =@"0";
[str1 appendString:str];
atextField.text=str1;}
-(void)go
{if (b=='1') {<br/><p> atextField.text=[NSString stringWithFormat:@"%f",(a+c)];}
if (b=='2') {
atextField.text=[NSString stringWithFormat:@"%f",(c-a)];}
if (b=='3') {
atextField.text=[NSString stringWithFormat:@"%f",(a*c)];}
if (b=='4') {
atextField.text=[NSString stringWithFormat:@"%f",(a/c)];}
if (b=='5') {
atextField.text=[NSString stringWithFormat:@"0"];}
[str1 release];
str1=[[NSMutableString alloc] init];}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
}
- (BOOL):(UIInterfaceOrientation)interfaceOrientation
{return (interfaceOrientation == );}
@end
Ⅳ liteide 怎麼查看go語言自帶源碼包
LiteIDE是一款專門為Go語言開發的跨平台輕量級集成開發環境(IDE),由QT編寫。LiteIDE主要特點:支持主流操作系統WindowsLinuxMacOSXGo編譯環境管理和切換管理和切換多個Go編譯環境支持Go語言交叉編譯與Go標准一致的項目管理方式基於GOPAT
Ⅵ 如何創建,編譯,打包go語言的源代碼和工程
1.最簡單的方法:
public static String reverse1(String str)
{ return new StringBuffer(str).reverse().toString();
}
2.最常用的方法:
public static String reverse3(String s)
{ char[] array = s.toCharArray();
String reverse = ""; //注意這是空串,不是null
for (int i = array.length - 1; i >= 0; i--)
reverse += array[i];
return reverse;
}
3.常用方法的變形:
public static String reverse2(String s)
{ int length = s.length();
String reverse = ""; //注意這是空串,不是null
for (int i = 0; i < length; i++)
reverse = s.charAt(i) + reverse;//在字元串前面連接, 而非常見的後面
return reverse;
}