﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-咖啡伴侣-随笔分类-Golang</title><link>http://www.blogjava.net/oathleo/category/53779.html</link><description>呆在上海</description><language>zh-cn</language><lastBuildDate>Sun, 22 Dec 2013 13:54:37 GMT</lastBuildDate><pubDate>Sun, 22 Dec 2013 13:54:37 GMT</pubDate><ttl>60</ttl><item><title>golang 之 接口</title><link>http://www.blogjava.net/oathleo/archive/2013/12/22/407869.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Sun, 22 Dec 2013 04:45:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2013/12/22/407869.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/407869.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2013/12/22/407869.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/407869.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/407869.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->conn,&nbsp;err&nbsp;=&nbsp;ln.Accept()<br />go&nbsp;handleConnection(conn)</div><strong><span>看到这里我曾经有个疑问，为什么不是&nbsp;</span><span style="font-size: 13px; background-color: #eeeeee;">&nbsp;handleConnection(&amp;conn) ?<br /></span></strong><br />下面这个例子解释这个问题<br /><br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->package&nbsp;main<br />
<br />
import&nbsp;(<br />
&nbsp;&nbsp;&nbsp;&nbsp;"fmt"<br />
)<br />
<br />
type&nbsp;Interface&nbsp;<span style="color: #0000FF; ">interface</span>&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;say()&nbsp;<span style="color: #0000FF; ">string</span><br />
}<br />
<br />
type&nbsp;Object&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;{<br />
}<br />
<br />
func&nbsp;(<span style="color: #0000FF; ">this</span>&nbsp;*Object)&nbsp;say()&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;"hello"<br />
}<br />
<br />
func&nbsp;<span style="color: #0000FF; ">do</span>(i&nbsp;Interface)&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;i.say()<br />
}<br />
<br />
func&nbsp;main()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;o&nbsp;:=&nbsp;Object{}<br />
&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println(<span style="color: #0000FF; ">do</span>(&amp;o))<br />
&nbsp;&nbsp;&nbsp;&nbsp;fmt.Printf("CCCCCCCCCCC:%T",&nbsp;o)<br />
}<br />
</div>
<br />
函数的参数以接口定义，编译器会自己判断参数是对象还是对象的指针<br />
比如，say是指针上的方法，所以do只接受<span style="background-color: #eeeeee;"><font size="2">Object的指针做参数，do(o)是编译不过的</font><br />
<br />
<font size="2">所以看到库里接口做参数类型定义的时候，可以简单认为，这个接口肯定是个对象指针（虽然也可以用对象，单估计没有哪个类库会用）</font><br />
<br />
例如：<br />
</span><span style="white-space: pre;">	</span>conn, err = ln.Accept()<br />
<span style="white-space:pre">	</span>go handleConnection(conn)<br />
<br />
这里conn是个接口，不需要&nbsp;go handleConnection(&amp;conn)<img src ="http://www.blogjava.net/oathleo/aggbug/407869.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2013-12-22 12:45 <a href="http://www.blogjava.net/oathleo/archive/2013/12/22/407869.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>golang定时定点任务</title><link>http://www.blogjava.net/oathleo/archive/2013/12/19/407774.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Thu, 19 Dec 2013 08:15:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2013/12/19/407774.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/407774.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2013/12/19/407774.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/407774.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/407774.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->package&nbsp;main<br /><br />import&nbsp;(<br />&nbsp;&nbsp;&nbsp;&nbsp;"fmt"<br />&nbsp;&nbsp;&nbsp;&nbsp;"mag/common"<br />&nbsp;&nbsp;&nbsp;&nbsp;"time"<br />)<br /><br />func&nbsp;main()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;:=&nbsp;make(chan&nbsp;<span style="color: #0000FF; ">bool</span>,&nbsp;10)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;tt&nbsp;:=&nbsp;common.GetTodayGivenTime("161300")<br />&nbsp;&nbsp;&nbsp;&nbsp;dd&nbsp;:=&nbsp;common.SinceNow(tt)<br />&nbsp;&nbsp;&nbsp;&nbsp;time.AfterFunc(dd,&nbsp;func()&nbsp;{&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">非阻塞<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">后续每24小时建立目录</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ticker24h&nbsp;:=&nbsp;time.NewTicker(5&nbsp;*&nbsp;time.Second)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;select&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">case</span>&nbsp;&lt;-ticker24h.C:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println("print")<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;})<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;-c<br />}</div><img src ="http://www.blogjava.net/oathleo/aggbug/407774.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2013-12-19 16:15 <a href="http://www.blogjava.net/oathleo/archive/2013/12/19/407774.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>golang append时slice len 和 cap</title><link>http://www.blogjava.net/oathleo/archive/2013/11/20/406595.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Wed, 20 Nov 2013 10:48:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2013/11/20/406595.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/406595.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2013/11/20/406595.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/406595.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/406595.html</trackback:ping><description><![CDATA[<div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2;"><div>声明:</div><div>源slice= src</div><div>添加slice = app</div><div>结果slice=tar</div></div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2;"></div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2;">append时</div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2;">len tar ===&nbsp;len src +&nbsp;&nbsp;&nbsp;len&nbsp;app</div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2;"></div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2;">1）如果len(src) + len(app) &lt;= cap(src)&nbsp; &nbsp;&nbsp;cap&nbsp;tar &nbsp;= &nbsp;&nbsp;cap(src)</div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2;">2）否则&nbsp;</div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2;">&nbsp; &nbsp; &nbsp; a)&nbsp;len(src) + len(app) &gt; 2* cap(src) &nbsp; &nbsp;&nbsp;cap&nbsp;tar &nbsp;= &nbsp;&nbsp;len(src) + len(app)</div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2;">&nbsp; &nbsp; &nbsp; b)&nbsp;cap(src) &lt;&nbsp;len(src) + len(app) &lt;= 2* cap(src)&nbsp; &nbsp;&nbsp;cap&nbsp;tar&nbsp;=&nbsp;2* cap(src)</div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2;"></div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2;"></div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2;"><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->&nbsp; &nbsp; data&nbsp;:=&nbsp;make([]<span style="color: #0000FF; ">int</span>,&nbsp;10,&nbsp;20)<br />&nbsp;&nbsp;&nbsp;&nbsp;data[0]&nbsp;=&nbsp;1<br />&nbsp;&nbsp;&nbsp;&nbsp;data[1]&nbsp;=&nbsp;2<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;dataappend&nbsp;:=&nbsp;make([]<span style="color: #0000FF; ">int</span>,&nbsp;12,&nbsp;30)<span style="color: #008000; ">//</span><span style="color: #008000; ">修改这个len&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;dataappend[0]&nbsp;=&nbsp;1<br />&nbsp;&nbsp;&nbsp;&nbsp;dataappend[1]&nbsp;=&nbsp;2<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;:=&nbsp;append(data,&nbsp;dataappend<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;result[0]&nbsp;=&nbsp;99<br />&nbsp;&nbsp;&nbsp;&nbsp;result[11]&nbsp;=&nbsp;98<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println("length:",&nbsp;len(data),&nbsp;"cap:",&nbsp;cap(data),&nbsp;":",&nbsp;data)<br />&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println("result&nbsp;length:",&nbsp;len(result),&nbsp;"cap:",&nbsp;cap(result),&nbsp;":",&nbsp;result)<br />&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println("length:",&nbsp;len(dataappend),&nbsp;"cap:",&nbsp;cap(dataappend),&nbsp;":",&nbsp;dataappend)</div></div><img src ="http://www.blogjava.net/oathleo/aggbug/406595.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2013-11-20 18:48 <a href="http://www.blogjava.net/oathleo/archive/2013/11/20/406595.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>golang slice分割和append copy还是引用</title><link>http://www.blogjava.net/oathleo/archive/2013/11/20/406594.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Wed, 20 Nov 2013 10:46:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2013/11/20/406594.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/406594.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2013/11/20/406594.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/406594.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/406594.html</trackback:ping><description><![CDATA[<div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2;">1.slice1:= slice[0:2]</div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2;"><span style="color: red;">引用，非复制</span>，所以任何对slice1或slice的修改都会影响对方</div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2;"></div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2;"><div><span style="white-space: pre; ">	</span>data := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}</div><div><span style="white-space: pre; ">	</span>data1 := data[0:2]</div><div></div><div><span style="white-space: pre; ">	</span>data1[0] = 99</div><div><span style="white-space: pre; ">	</span>fmt.Println(data1)</div><div><span style="white-space: pre; ">	</span>fmt.Println(data)</div></div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2;"></div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2;"><div>[99 2]</div><div>[99 2 3 4 5 6 7 8 9 0]</div></div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2;"></div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2;">2.append</div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2;">append 比较特殊</div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2;">声明:</div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2;">源slice= src</div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2;">添加slice = app</div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2;">结果slice=tar</div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2;">1）如果len(src) + len(app) &lt;= cap(src) &nbsp;src和tar 是指向同一数据引用 ，即<span style="color: red;">修改src或tar，会影响对方</span></div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2;">2）否则 tar 是copy的方式&nbsp;src + app ，<span style="color: #ff0000; ">即修改src或tar，不会影响对方</span></div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2;">无论哪种情况不会影响app，因为app都会用copy的方式进入tar</div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2;">&nbsp;</div><div style="font-family: 微软雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2;"><div>func test2() {</div><div><span style="white-space: pre; ">	</span>data := make([]int, 10, 20)</div><div><span style="white-space: pre; ">	</span>data[0] = 1</div><div><span style="white-space: pre; ">	</span>data[1] = 2</div><div></div><div><span style="white-space: pre; ">	</span>dataappend := make([]int, 10, 20)//len &lt;=10 则&nbsp;<span style="white-space: pre; ">	</span>result[0] = 99 会 影响源Slice</div><div><span style="white-space: pre; ">	</span>dataappend[0] = 1</div><div><span style="white-space: pre; ">	</span>dataappend[1] = 2</div><div></div><div><span style="white-space: pre; ">	</span>result := append(data, dataappend...)</div><div></div><div><span style="white-space: pre; ">	</span>result[0] = 99</div><div><span style="white-space: pre; ">	</span>result[11] = 98</div><div></div><div><span style="white-space: pre; ">	</span>fmt.Println("length:", len(data), ":", data)</div><div><span style="white-space: pre; ">	</span>fmt.Println("length:", len(result), ":", result)</div><div><span style="white-space: pre; ">	</span>fmt.Println("length:", len(dataappend), ":", dataappend)</div><div>}</div></div><img src ="http://www.blogjava.net/oathleo/aggbug/406594.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2013-11-20 18:46 <a href="http://www.blogjava.net/oathleo/archive/2013/11/20/406594.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>golang 之  去掉定长数组里的0 []byte 转 string</title><link>http://www.blogjava.net/oathleo/archive/2013/11/19/406513.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Tue, 19 Nov 2013 02:16:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2013/11/19/406513.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/406513.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2013/11/19/406513.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/406513.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/406513.html</trackback:ping><description><![CDATA[<div><span style="white-space:pre">		</span>index := bytes.IndexByte(buf_PN, 0)</div><div><span style="white-space:pre">		</span>rbyf_pn := buf_PN[0:index]</div><img src ="http://www.blogjava.net/oathleo/aggbug/406513.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2013-11-19 10:16 <a href="http://www.blogjava.net/oathleo/archive/2013/11/19/406513.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>golang之 windows下杀进程</title><link>http://www.blogjava.net/oathleo/archive/2013/11/15/406377.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Fri, 15 Nov 2013 06:07:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2013/11/15/406377.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/406377.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2013/11/15/406377.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/406377.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/406377.html</trackback:ping><description><![CDATA[<div><span style="white-space:pre">	</span>c := exec.Command("taskkill.exe", "/f", "/im", "test.exe")</div><div><span style="white-space:pre">	</span>err := c.Start()</div><img src ="http://www.blogjava.net/oathleo/aggbug/406377.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2013-11-15 14:07 <a href="http://www.blogjava.net/oathleo/archive/2013/11/15/406377.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>golang slice Append </title><link>http://www.blogjava.net/oathleo/archive/2013/11/05/406016.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Tue, 05 Nov 2013 08:39:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2013/11/05/406016.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/406016.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2013/11/05/406016.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/406016.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/406016.html</trackback:ping><description><![CDATA[s2 := append(s1, *)<br /><br />切片s1上记录的切片信息复制给s2，<br /><br />1.如果s1指向的底层array长度不够，append的过程会发生如下操作：内存中不仅新开辟一块区域存储append后的切片信息，而且需要新开辟一块区域存储底层array（复制原来的array至这块新array中），最后再append新数据进新array中，这样，s2指向新array。<br /><br />2.如果s1指向的底层array长度够,<br />s2和s1指向同一个array，append的结果是内存中新开辟一个区域存储新切片信息。<br /><br />开辟一块区域存储底层array 使用下面的策略：<br /><span style="color: red;">1.如果 增加的 len &lt; s的cap 则 新s的cap*2</span><br /><span style="color: red;">2.如果&nbsp;增加的 len &gt; s的cap 则 新s的cap = 老cap +&nbsp;增加数据的 len</span><img src ="http://www.blogjava.net/oathleo/aggbug/406016.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2013-11-05 16:39 <a href="http://www.blogjava.net/oathleo/archive/2013/11/05/406016.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>golang 定时</title><link>http://www.blogjava.net/oathleo/archive/2013/10/10/404842.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Thu, 10 Oct 2013 07:07:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2013/10/10/404842.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/404842.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2013/10/10/404842.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/404842.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/404842.html</trackback:ping><description><![CDATA[<div style="display: inline-block;">
<pre class="brush:go;gutter:false;" style="color: #333333; line-height: normal; background-color: #fefefe;"><br />
</pre>
</div>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all">
<pre style="font-size: 14px; color: #333333; line-height: normal; background-color: #fefefe;"> <span style="font-size: 13px; font-family: verdana, 'courier new'; line-height: 21px; color: #008000;">//</span><span style="font-size: 13px; font-family: verdana, 'courier new'; line-height: 21px; color: #008000;">&nbsp;(A)</span></pre>
time.AfterFunc(5&nbsp;*&nbsp;time.Minute,&nbsp;func()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;fmt.Printf("expired")<br />
}<br />
<br />
<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;(B)&nbsp;create&nbsp;a&nbsp;Timer&nbsp;object</span><span style="color: #008000; "><br />
</span>timer&nbsp;:=&nbsp;time.NewTimer(5&nbsp;*&nbsp;time.Minute)<br />
&lt;-timer.C<br />
fmt.Printf("expired")<br />
<br />
<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;(C)&nbsp;time.After()&nbsp;returns&nbsp;timer.C&nbsp;internally</span><span style="color: #008000; "><br />
</span>&lt;-time.After(5&nbsp;*&nbsp;time.Minute)<br />
fmt.Printf("expired")</div><img src ="http://www.blogjava.net/oathleo/aggbug/404842.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2013-10-10 15:07 <a href="http://www.blogjava.net/oathleo/archive/2013/10/10/404842.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>golang 非缓冲通道 recv 的操作 肯定 在 send 操作 之前发生</title><link>http://www.blogjava.net/oathleo/archive/2013/10/10/404830.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Thu, 10 Oct 2013 02:56:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2013/10/10/404830.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/404830.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2013/10/10/404830.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/404830.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/404830.html</trackback:ping><description><![CDATA[对亍非缓冲通道,&#8220;从通道接收数据&#8221;的操作<br />
一定会在
&#8220;向通道发送数据&#8221;的操作完成前发生。<br />
<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->package&nbsp;main<br />
<br />
import&nbsp;(<br />
&nbsp;&nbsp;&nbsp;&nbsp;"fmt"<br />
)<br />
<br />
var&nbsp;c&nbsp;=&nbsp;make(chan&nbsp;<span style="color: #0000FF; ">int</span>)<br />
var&nbsp;str&nbsp;<span style="color: #0000FF; ">string</span><br />
<br />
func&nbsp;ready()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;=&nbsp;"abc"<br />
&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println("ready1")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;-c&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">get</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println("ready2")<br />
}<br />
<br />
func&nbsp;main()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;go&nbsp;ready()<br />
&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;&lt;-&nbsp;1&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">put</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println(str)<br />
}</div>
<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->ready1<br />ready2<br />abc</div><img src ="http://www.blogjava.net/oathleo/aggbug/404830.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2013-10-10 10:56 <a href="http://www.blogjava.net/oathleo/archive/2013/10/10/404830.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Go指针 new make</title><link>http://www.blogjava.net/oathleo/archive/2013/10/08/404721.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Tue, 08 Oct 2013 02:49:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2013/10/08/404721.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/404721.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2013/10/08/404721.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/404721.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/404721.html</trackback:ping><description><![CDATA[<div>new(T) 分配了零值填充的T</div><div>类型的内存空间,并且返回其地址,一个*T 类型的值。用Go 的术语说,它返回了一个</div><div>指针,指向新分配的类型T 的零值。有一点非常重要:</div><div><span style="color: red;">new 返回指针。<br /><br /></span><div>内建函数make(T, args) 与new(T) 有着不同的功能。它只能创建slice,map</div><div>和channel,并且<span style="color: red;">返回一个有初始值(非零)的T 类型,而不是*T。</span>本质来讲,导致这</div><div>三个类型有所不同的原因是指向数据结构的引用在使用前必须被初始化。<br /><br /><div>T{name:"aaa",age:11}<br /><span style="color: red;">返回 T类型 而不是*T</span><br /></div></div></div><img src ="http://www.blogjava.net/oathleo/aggbug/404721.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2013-10-08 10:49 <a href="http://www.blogjava.net/oathleo/archive/2013/10/08/404721.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>go原生数据效率</title><link>http://www.blogjava.net/oathleo/archive/2013/09/29/404597.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Sun, 29 Sep 2013 01:57:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2013/09/29/404597.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/404597.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2013/09/29/404597.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/404597.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/404597.html</trackback:ping><description><![CDATA[接着上回，对象序列化和反序的效率已经很高，试试原生数据的效率<br />
<br />
先上代码<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->package&nbsp;main<br />
<br />
import&nbsp;(<br />
&nbsp;&nbsp;&nbsp;&nbsp;"fmt"<br />
&nbsp;&nbsp;&nbsp;&nbsp;"math/rand"<br />
&nbsp;&nbsp;&nbsp;&nbsp;"opbuf"<br />
&nbsp;&nbsp;&nbsp;&nbsp;"time"<br />
)<br />
<br />
type&nbsp;RTValue&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;Time&nbsp;&nbsp;&nbsp;int32<br />
&nbsp;&nbsp;&nbsp;&nbsp;Status&nbsp;int16<br />
&nbsp;&nbsp;&nbsp;&nbsp;Value&nbsp;&nbsp;float32<br />
}<br />
<br />
func&nbsp;main()&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;size&nbsp;:=&nbsp;1000000<br />
&nbsp;&nbsp;&nbsp;&nbsp;col&nbsp;:=&nbsp;make([]RTValue,&nbsp;size)<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;i&nbsp;:=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;size;&nbsp;i++&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;col[i]&nbsp;=&nbsp;RTValue{Time:&nbsp;int32(i),&nbsp;Status:&nbsp;int16(i),&nbsp;Value:&nbsp;rand.Float32()}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println("send&nbsp;data:",&nbsp;col[size-1])<br />
&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;opbuff&nbsp;*opbuf.OPBuffer&nbsp;=&nbsp;opbuf.NewOPBuffer()<br />
&nbsp;&nbsp;&nbsp;&nbsp;start&nbsp;:=&nbsp;time.Now().UnixNano()<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;i&nbsp;:=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;size;&nbsp;i++&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;opbuff.PutByte(col[i].Data)</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;opbuff.PutInt32(col[i].Time)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;opbuff.PutInt16(col[i].Status)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;opbuff.PutFloat32(col[i].Value)<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println("send&nbsp;cost:",&nbsp;(time.Now().UnixNano()-start)/1000000)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;opbuff.Flush()<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;start&nbsp;=&nbsp;time.Now().UnixNano()<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;i&nbsp;:=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;size;&nbsp;i++&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;col[i].Time,_&nbsp;=&nbsp;opbuff.GetInt32()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;col[i].Status,_&nbsp;=&nbsp;opbuff.GetInt16()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;col[i].Value,_&nbsp;=&nbsp;opbuff.GetFloat32()<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println("rev&nbsp;cost:",&nbsp;(time.Now().UnixNano()-start)/1000000)<br />
&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println("rev&nbsp;data:",&nbsp;col[size-1])<br />
<br />
}</div>
123<br /><br /><div> <div> <div>Go原生代码性能：</div></div> <div>total&nbsp;record:&nbsp;1000000</div> <div>send&nbsp;data:&nbsp;{999999&nbsp;16959&nbsp;0.69153386}</div> <div>send&nbsp;cost:&nbsp;93</div> <div>rev&nbsp;cost:&nbsp;61</div> <div>rev&nbsp;data:&nbsp;{999999&nbsp;16959&nbsp;0.69153386}</div> <div>&nbsp;</div> <div>结论：</div> <div>1.不管什么语言，<span style="color: #ff0000">大批量同类型数据的传输</span>，原生性能还是比第三方序列化  效率高很多 </div> <div>2.C++ 使用<span style="color: #ff0000">memcpy </span>put  原始类型，效率还是比go高很多<br /><div> <div>C++原生代码性能：</div> <div>total&nbsp;record&nbsp;1000000</div> <div>time&nbsp;pack&nbsp;11&nbsp;ms</div> <div>time&nbsp;unpack&nbsp;57&nbsp;ms</div> <div>&nbsp;</div></div> <div>&nbsp;</div></div></div><img src ="http://www.blogjava.net/oathleo/aggbug/404597.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2013-09-29 09:57 <a href="http://www.blogjava.net/oathleo/archive/2013/09/29/404597.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>go对象序列化和反序列化</title><link>http://www.blogjava.net/oathleo/archive/2013/09/29/go_ser.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Sun, 29 Sep 2013 01:52:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2013/09/29/go_ser.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/404595.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2013/09/29/go_ser.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/404595.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/404595.html</trackback:ping><description><![CDATA[模拟测试1,000, 000条数据 每条10个字节&nbsp; 也就是10M不到的 数据(高度结构化的数据)<br />过程<br />1.对象序列化为 byte<br />2.byte反序为对象<br />3.gzip压缩byte<br /><br />测试语言go<br />测试方案：  raw byte，json ,bson, msgpack （protostuff需要先做对象配置文件，比较麻烦，通常认为和msgpack性能相当  ）<br />结果：msgpack 胜出<br /><br /> <table border="1" cellpadding="2" cellspacing="2" width="100%">   <tbody>   <tr>     <td valign="top"><br /></td>     <td valign="top">大小<br /></td>     <td valign="top">gzip压缩后大小<br /></td>     <td valign="top">对象到byte耗时<br /></td>     <td valign="top">byte到对象耗时<br /></td></tr>   <tr>     <td valign="top">raw</td>     <td valign="top">10000000<br /></td>     <td valign="top">6573252（65%）</td>     <td valign="top">未测试<br /></td>     <td valign="top">未测试</td></tr>   <tr>     <td valign="top">json<br /></td>     <td valign="top">47515988</td>     <td valign="top">7919511 (17%)</td>     <td valign="top">3248ms</td>     <td valign="top">5280ms</td></tr>   <tr>     <td valign="top">bson<br /></td>     <td valign="top">49888910</td>     <td valign="top">9506965 （19%）<br /></td>     <td valign="top">3863ms</td>     <td valign="top">6235ms</td></tr>   <tr>     <td valign="top">msgpack<br /></td>     <td valign="top">29934223</td>     <td valign="top">7448484</td>     <td valign="top">2046ms</td>     <td valign="top">3113ms</td></tr></tbody></table><br /><br />raw data: 1000000<br />raw  data gzip compress: 6573252 //gzip压缩后大小<br /><br />start: 1000000<br />Marshal cost:  3248&nbsp; //json 序列化耗时<br />json string:  47515988&nbsp; <br />json byte: 47515988&nbsp;  //二进制数组大小<br />Unmarshal cost: 5280&nbsp; //json 反序列化耗时<br />test data: {1 100  0.9405091}<br />json gzip compress: 7919511 //gzip压缩后大小<br /><br />start<br />Marshal  cost: 3863<br />bson byte: 49888910<br />Unmarshal cost:  6235<br />test data: {1 100 0.9405091}<br />bson gzip compress:  9506965<br /><br /><br />start: 1000000<br />Marshal cost: 2046<br />msgpack: 29934223<br />Unmarshal cost: 3113<br />test data: {1  100 0.9405091}<br />msgpack gzip compress:  7448484<img src ="http://www.blogjava.net/oathleo/aggbug/404595.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2013-09-29 09:52 <a href="http://www.blogjava.net/oathleo/archive/2013/09/29/go_ser.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>bson和json</title><link>http://www.blogjava.net/oathleo/archive/2013/09/23/Bson_Json.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Mon, 23 Sep 2013 06:08:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2013/09/23/Bson_Json.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/404326.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2013/09/23/Bson_Json.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/404326.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/404326.html</trackback:ping><description><![CDATA[测试1000个数据 每个数据10个字节，分别使用字节、json、bson方式 存储，并用gzip压缩<br />
<br />
结果bson比json还大一点，确实出乎意料<br />
<br />
个人结论是BSON对比json更加适合存储，在传输上没有太大优势<br /><br /><div>　　BSON相对JSon</div><div>1.更快的遍历速度</div><div>2.操作更简易</div><div>3.增加了额外的数据类型</div>
<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->raw&nbsp;data:&nbsp;10000<br />
raw&nbsp;data&nbsp;gzip&nbsp;compress:&nbsp;6553<br />
<br />
json&nbsp;string:&nbsp;44524<br />
json&nbsp;<span style="color: #0000FF; ">byte</span>:&nbsp;44524<br />
json&nbsp;gzip&nbsp;compress:&nbsp;8125<br />
<br />
bson&nbsp;<span style="color: #0000FF; ">byte</span>:&nbsp;46910<br />
bson&nbsp;gzip&nbsp;compress:&nbsp;9721</div>
<br />
<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->package&nbsp;main<br />
<br />
import&nbsp;(<br />
&nbsp;&nbsp;&nbsp;&nbsp;"bytes"<br />
&nbsp;&nbsp;&nbsp;&nbsp;"compress/gzip"<br />
&nbsp;&nbsp;&nbsp;&nbsp;"fmt"<br />
&nbsp;&nbsp;&nbsp;&nbsp;"labix.org/v2/mgo/bson"<br />
&nbsp;&nbsp;&nbsp;&nbsp;"math/rand"<br />
)<br />
<br />
type&nbsp;HisCollection&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;RTValues&nbsp;[]RTValue<br />
}<br />
<br />
type&nbsp;RTValue&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;Time&nbsp;&nbsp;&nbsp;int32<br />
&nbsp;&nbsp;&nbsp;&nbsp;Status&nbsp;int16<br />
&nbsp;&nbsp;&nbsp;&nbsp;Value&nbsp;&nbsp;float32<br />
}<br />
<br />
func&nbsp;main()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println("start")<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;size&nbsp;:=&nbsp;1000<br />
&nbsp;&nbsp;&nbsp;&nbsp;col&nbsp;:=&nbsp;make([]RTValue,&nbsp;size)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;i&nbsp;:=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;size;&nbsp;i++&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;col[i]&nbsp;=&nbsp;RTValue{Time:&nbsp;int32(i),&nbsp;Status:&nbsp;100,&nbsp;Value:&nbsp;rand.Float32()}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;his&nbsp;:=&nbsp;HisCollection{RTValues:&nbsp;col}<br />
&nbsp;&nbsp;&nbsp;&nbsp;data,&nbsp;err&nbsp;:=&nbsp;bson.Marshal(&amp;his)<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;err&nbsp;!=&nbsp;nil&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;panic(err)<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println(data)</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println("bson&nbsp;byte:",&nbsp;len(data))<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;compress_data_buf&nbsp;bytes.Buffer<br />
&nbsp;&nbsp;&nbsp;&nbsp;writer&nbsp;:=&nbsp;gzip.NewWriter(&amp;compress_data_buf)<br />
&nbsp;&nbsp;&nbsp;&nbsp;defer&nbsp;writer.Close()<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;writer.Write(data)<br />
&nbsp;&nbsp;&nbsp;&nbsp;writer.Flush()<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println("bson&nbsp;gzip&nbsp;compress:",len(compress_data_buf.Bytes()))<br />
<br />
}</div>
<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->package&nbsp;main<br />
<br />
import&nbsp;(<br />
&nbsp;&nbsp;&nbsp;&nbsp;"bytes"<br />
&nbsp;&nbsp;&nbsp;&nbsp;"compress/gzip"<br />
&nbsp;&nbsp;&nbsp;&nbsp;"fmt"<br />
&nbsp;&nbsp;&nbsp;&nbsp;"math/rand"<br />
&nbsp;&nbsp;&nbsp;&nbsp;"openplant/opnet"<br />
)<br />
<br />
func&nbsp;main()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;compress_data_buf&nbsp;bytes.Buffer<br />
&nbsp;&nbsp;&nbsp;&nbsp;writer&nbsp;:=&nbsp;gzip.NewWriter(&amp;compress_data_buf)<br />
&nbsp;&nbsp;&nbsp;&nbsp;defer&nbsp;writer.Close()<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;size&nbsp;:=&nbsp;1000<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;i&nbsp;:=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;size;&nbsp;i++&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.Write(opnet.WarpInt32ToByte(int32(i)))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.Write(opnet.WarpInt16ToByte(int16(100)))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.Write(opnet.WarpFloat32ToByte(rand.Float32()))<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;writer.Flush()<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println("raw&nbsp;data:",&nbsp;10000)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println("raw&nbsp;data&nbsp;gzip&nbsp;compress:",&nbsp;len(compress_data_buf.Bytes()))<br />
<br />
}</div>
111<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->package&nbsp;main<br /><br />import&nbsp;(<br />&nbsp;&nbsp;&nbsp;&nbsp;"bytes"<br />&nbsp;&nbsp;&nbsp;&nbsp;"compress/gzip"<br />&nbsp;&nbsp;&nbsp;&nbsp;"encoding/json"<br />&nbsp;&nbsp;&nbsp;&nbsp;"fmt"<br />&nbsp;&nbsp;&nbsp;&nbsp;"math/rand"<br />)<br /><br />type&nbsp;HisCollection&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;RTValues&nbsp;[]RTValue<br />}<br /><br />type&nbsp;RTValue&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;Time&nbsp;&nbsp;&nbsp;int32<br />&nbsp;&nbsp;&nbsp;&nbsp;Status&nbsp;int16<br />&nbsp;&nbsp;&nbsp;&nbsp;Value&nbsp;&nbsp;float32<br />}<br /><br />func&nbsp;main()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println("start")<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;size&nbsp;:=&nbsp;1000<br />&nbsp;&nbsp;&nbsp;&nbsp;col&nbsp;:=&nbsp;make([]RTValue,&nbsp;size)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;i&nbsp;:=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;size;&nbsp;i++&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;col[i]&nbsp;=&nbsp;RTValue{Time:&nbsp;int32(i),&nbsp;Status:&nbsp;100,&nbsp;Value:&nbsp;rand.Float32()}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;his&nbsp;:=&nbsp;HisCollection{RTValues:&nbsp;col}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;data,&nbsp;err&nbsp;:=&nbsp;json.Marshal(&amp;his)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println("json&nbsp;string:",&nbsp;<span style="color: #0000FF; ">string</span>(data))<br />&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println("json&nbsp;string:",&nbsp;len(<span style="color: #0000FF; ">string</span>(data)))<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;err&nbsp;!=&nbsp;nil&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;panic(err)<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println(data)</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println("json&nbsp;byte:",&nbsp;len(data))<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;compress_data_buf&nbsp;bytes.Buffer<br />&nbsp;&nbsp;&nbsp;&nbsp;writer&nbsp;:=&nbsp;gzip.NewWriter(&amp;compress_data_buf)<br />&nbsp;&nbsp;&nbsp;&nbsp;defer&nbsp;writer.Close()<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;writer.Write(data)<br />&nbsp;&nbsp;&nbsp;&nbsp;writer.Flush()<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println("json&nbsp;gzip&nbsp;compress:",&nbsp;len(compress_data_buf.Bytes()))<br /><br />}</div><img src ="http://www.blogjava.net/oathleo/aggbug/404326.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2013-09-23 14:08 <a href="http://www.blogjava.net/oathleo/archive/2013/09/23/Bson_Json.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>golang 之  bson 与 struct 转换</title><link>http://www.blogjava.net/oathleo/archive/2013/09/22/golang_bson_struct_mongo.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Sun, 22 Sep 2013 08:08:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2013/09/22/golang_bson_struct_mongo.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/404287.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2013/09/22/golang_bson_struct_mongo.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/404287.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/404287.html</trackback:ping><description><![CDATA[<div>bson的介绍不说了<br />golang下的解析包找到2个 一个是mongo的<a href="http://labix.org/gobson">http://labix.org/gobson</a><br />，另外一个比较小众<a href="https://github.com/sbunce/bson">https://github.com/sbunce/bson<br /><br /></a>这里用的是mongo的作为例子。<br />对象加上不同的注解，<br />可以轻松转成xml json bson 想想都兴奋&nbsp;</div><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->package&nbsp;main<br />
<br />
import&nbsp;(<br />
&nbsp;&nbsp;&nbsp;&nbsp;"fmt"<br />
&nbsp;&nbsp;&nbsp;&nbsp;"labix.org/v2/mgo/bson"<br />
)<br />
<br />
type&nbsp;TestStruct&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;Name&nbsp;<span style="color: #0000FF; ">string</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;ID&nbsp;&nbsp;&nbsp;int32<br />
}<br />
<br />
func&nbsp;main()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println("start")<br />
&nbsp;&nbsp;&nbsp;&nbsp;data,&nbsp;err&nbsp;:=&nbsp;bson.Marshal(&amp;TestStruct{Name:&nbsp;"Bob"})<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;err&nbsp;!=&nbsp;nil&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;panic(err)<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println("%q",&nbsp;data)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;value&nbsp;:=&nbsp;TestStruct{}<br />
&nbsp;&nbsp;&nbsp;&nbsp;err2&nbsp;:=&nbsp;bson.Unmarshal(data,&nbsp;&amp;value)<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;err2&nbsp;!=&nbsp;nil&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;panic(err)<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println("value:",&nbsp;value)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;mmap&nbsp;:=&nbsp;bson.M{}<br />
&nbsp;&nbsp;&nbsp;&nbsp;err3&nbsp;:=&nbsp;bson.Unmarshal(data,&nbsp;mmap)<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;err3&nbsp;!=&nbsp;nil&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;panic(err)<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println("mmap:",&nbsp;mmap)<br />
<br />
}</div><img src ="http://www.blogjava.net/oathleo/aggbug/404287.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2013-09-22 16:08 <a href="http://www.blogjava.net/oathleo/archive/2013/09/22/golang_bson_struct_mongo.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Golang 异常处理</title><link>http://www.blogjava.net/oathleo/archive/2013/09/22/404272.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Sun, 22 Sep 2013 01:32:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2013/09/22/404272.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/404272.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2013/09/22/404272.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/404272.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/404272.html</trackback:ping><description><![CDATA[<h2>Panic和Recover</h2><p style="margin-right: 0px; margin-bottom: 10px; margin-left: 0px; color: #333333; line-height: 26px; font-family: Helvetica, arial, sans-serif; background-color: #ffffff;">Go没有像Java那样的异常机制，它不能抛出异常，而是使用了<code style="margin: 0px 2px; padding: 0px 5px; white-space: nowrap; border: 1px solid #eaeaea; background-color: #f8f8f8; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; font-family: consolas, courier; font-size: 13px; line-height: 20px;">panic</code>和<code style="margin: 0px 2px; padding: 0px 5px; white-space: nowrap; border: 1px solid #eaeaea; background-color: #f8f8f8; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; font-family: consolas, courier; font-size: 13px; line-height: 20px;">recover</code>机制。一定要记住，你应当把它作为最后的手段来使用，也就是说，你的代码中应当没有，或者很少有<code style="margin: 0px 2px; padding: 0px 5px; white-space: nowrap; border: 1px solid #eaeaea; background-color: #f8f8f8; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; font-family: consolas, courier; font-size: 13px; line-height: 20px;">panic</code>的东西。这是个强大的工具，请明智地使用它。那么，我们应该如何使用它呢？</p><h3>Panic</h3><p style="margin-right: 0px; margin-bottom: 10px; margin-left: 0px; color: #333333; line-height: 26px; font-family: Helvetica, arial, sans-serif; background-color: #ffffff;">是一个内建函数，可以中断原有的控制流程，进入一个令人恐慌的流程中。当函数<code style="margin: 0px 2px; padding: 0px 5px; white-space: nowrap; border: 1px solid #eaeaea; background-color: #f8f8f8; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; font-family: consolas, courier; font-size: 13px; line-height: 20px;">F</code>调用<code style="margin: 0px 2px; padding: 0px 5px; white-space: nowrap; border: 1px solid #eaeaea; background-color: #f8f8f8; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; font-family: consolas, courier; font-size: 13px; line-height: 20px;">panic</code>，函数<code style="margin: 0px 2px; padding: 0px 5px; white-space: nowrap; border: 1px solid #eaeaea; background-color: #f8f8f8; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; font-family: consolas, courier; font-size: 13px; line-height: 20px;">F</code>的执行被中断，但是<code style="margin: 0px 2px; padding: 0px 5px; white-space: nowrap; border: 1px solid #eaeaea; background-color: #f8f8f8; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; font-family: consolas, courier; font-size: 13px; line-height: 20px;">F</code>中的延迟函数会正常执行，然后<code style="margin: 0px 2px; padding: 0px 5px; white-space: nowrap; border: 1px solid #eaeaea; background-color: #f8f8f8; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; font-family: consolas, courier; font-size: 13px; line-height: 20px;">F</code>返回到调用它的地方。在调用的地方，<code style="margin: 0px 2px; padding: 0px 5px; white-space: nowrap; border: 1px solid #eaeaea; background-color: #f8f8f8; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; font-family: consolas, courier; font-size: 13px; line-height: 20px;">F</code>的行为就像调用了<code style="margin: 0px 2px; padding: 0px 5px; white-space: nowrap; border: 1px solid #eaeaea; background-color: #f8f8f8; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; font-family: consolas, courier; font-size: 13px; line-height: 20px;">panic</code>。这一过程继续向上，直到发生<code style="margin: 0px 2px; padding: 0px 5px; white-space: nowrap; border: 1px solid #eaeaea; background-color: #f8f8f8; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; font-family: consolas, courier; font-size: 13px; line-height: 20px;">panic</code>的<code style="margin: 0px 2px; padding: 0px 5px; white-space: nowrap; border: 1px solid #eaeaea; background-color: #f8f8f8; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; font-family: consolas, courier; font-size: 13px; line-height: 20px;">goroutine</code>中所有调用的函数返回，此时程序退出。恐慌可以直接调用<code style="margin: 0px 2px; padding: 0px 5px; white-space: nowrap; border: 1px solid #eaeaea; background-color: #f8f8f8; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; font-family: consolas, courier; font-size: 13px; line-height: 20px;">panic</code>产生。也可以由运行时错误产生，例如访问越界的数组。</p><h3>Recover</h3><p style="margin-right: 0px; margin-bottom: 10px; margin-left: 0px; color: #333333; line-height: 26px; font-family: Helvetica, arial, sans-serif; background-color: #ffffff;">是一个内建的函数，可以让进入令人恐慌的流程中的<code style="margin: 0px 2px; padding: 0px 5px; white-space: nowrap; border: 1px solid #eaeaea; background-color: #f8f8f8; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; font-family: consolas, courier; font-size: 13px; line-height: 20px;">goroutine</code>恢复过来。<code style="margin: 0px 2px; padding: 0px 5px; white-space: nowrap; border: 1px solid #eaeaea; background-color: #f8f8f8; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; font-family: consolas, courier; font-size: 13px; line-height: 20px;">recover</code>仅在延迟函数中有效。在正常的执行过程中，调用<code style="margin: 0px 2px; padding: 0px 5px; white-space: nowrap; border: 1px solid #eaeaea; background-color: #f8f8f8; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; font-family: consolas, courier; font-size: 13px; line-height: 20px;">recover</code>会返回<code style="margin: 0px 2px; padding: 0px 5px; white-space: nowrap; border: 1px solid #eaeaea; background-color: #f8f8f8; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; font-family: consolas, courier; font-size: 13px; line-height: 20px;">nil</code>，并且没有其它任何效果。如果当前的<code style="margin: 0px 2px; padding: 0px 5px; white-space: nowrap; border: 1px solid #eaeaea; background-color: #f8f8f8; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; font-family: consolas, courier; font-size: 13px; line-height: 20px;">goroutine</code>陷入恐慌，调用<code style="margin: 0px 2px; padding: 0px 5px; white-space: nowrap; border: 1px solid #eaeaea; background-color: #f8f8f8; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; font-family: consolas, courier; font-size: 13px; line-height: 20px;">recover</code>可以捕获到<code style="margin: 0px 2px; padding: 0px 5px; white-space: nowrap; border: 1px solid #eaeaea; background-color: #f8f8f8; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; font-family: consolas, courier; font-size: 13px; line-height: 20px;">panic</code>的输入值，并且恢复正常的执行。</p><p style="margin-right: 0px; margin-bottom: 10px; margin-left: 0px; color: #333333; line-height: 26px; font-family: Helvetica, arial, sans-serif; background-color: #ffffff;"><strong>下面这个函数演示了如何在过程中使用<code style="margin: 0px 2px; padding: 0px 5px; white-space: nowrap; border: 1px solid #eaeaea; background-color: #f8f8f8; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; font-family: consolas, courier; font-size: 13px; line-height: 20px;">panic</code></strong></p><pre style="margin-top: 5px; margin-bottom: 5px; color: #333333; background-color: #f8f8f8; border: 1px solid #cccccc; font-size: 12px; line-height: 19px; overflow: auto; padding: 6px 10px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;"><code style="margin: 0px; padding: 0px; white-space: pre-wrap; border: none; background-color: transparent; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; font-family: consolas, courier; font-size: 13px; line-height: 20px; word-break: break-all; background-position: initial initial; background-repeat: initial initial;">var user = os.Getenv("USER")  func init() {     if user == "" {         panic("no value for $USER")     } } </code></pre><p style="margin-right: 0px; margin-bottom: 10px; margin-left: 0px; color: #333333; line-height: 26px; font-family: Helvetica, arial, sans-serif; background-color: #ffffff;"><strong>下面这个函数检查作为其参数的函数在执行时是否会产生<code style="margin: 0px 2px; padding: 0px 5px; white-space: nowrap; border: 1px solid #eaeaea; background-color: #f8f8f8; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; font-family: consolas, courier; font-size: 13px; line-height: 20px;">panic</code>：</strong></p><pre style="margin-top: 5px; margin-bottom: 5px; color: #333333; background-color: #f8f8f8; border: 1px solid #cccccc; font-size: 12px; line-height: 19px; overflow: auto; padding: 6px 10px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;"><code style="margin: 0px; padding: 0px; white-space: pre-wrap; border: none; background-color: transparent; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; font-family: consolas, courier; font-size: 13px; line-height: 20px; word-break: break-all; background-position: initial initial; background-repeat: initial initial;">func throwsPanic(f func()) (b bool) {     defer func() {         if x := recover(); x != nil {             b = true         }     }()     f() //执行函数f，如果f中出现了panic，那么就可以恢复回来     return } </code></pre><p style="margin-right: 0px; margin-bottom: 10px; margin-left: 0px; color: #333333; line-height: 26px; font-family: Helvetica, arial, sans-serif; background-color: #ffffff;">最容易理解就是给个例子，文章里有例子：</p><pre style="margin-top: 5px; margin-bottom: 5px; color: #333333; background-color: #f8f8f8; border: 1px solid #cccccc; font-size: 12px; line-height: 19px; overflow: auto; padding: 6px 10px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;"><code style="margin: 0px; padding: 0px; white-space: pre-wrap; border: none; background-color: transparent; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; font-family: consolas, courier; font-size: 13px; line-height: 20px; word-break: break-all; background-position: initial initial; background-repeat: initial initial;">package main  import(     "fmt"     //"os" )  var user = "" func inita() {     defer func(){         fmt.Print("defer##\n")     }()     if user == "" {         fmt.Print("@@@before panic\n")         panic("no value for user\n")         fmt.Print("!!after panic\n")     } }  func throwsPanic (f func()) (b bool){     defer func(){         if x:= recover(); x != nil{             fmt.Print(x)             b = true         }     }()     f()     fmt.Print("after the func run")     return }  func main(){     throwsPanic(inita) } </code></pre><p style="margin-right: 0px; margin-bottom: 10px; margin-left: 0px; color: #333333; line-height: 26px; font-family: Helvetica, arial, sans-serif; background-color: #ffffff;">执行结果：</p><blockquote style="margin-right: 0px; margin-left: 0px; border-left-width: 4px; border-left-color: #dddddd; padding: 0px 15px; font-family: consolas, courier; font-size: 12px; background-color: #ffffff;"><p style="margin: 0px; line-height: 26px;">D:\go&gt;go run b.go<br />@@@before panic<br />defer##<br />no value for user</p></blockquote><p style="margin-right: 0px; margin-bottom: 10px; margin-left: 0px; color: #333333; line-height: 26px; font-family: Helvetica, arial, sans-serif; background-color: #ffffff;">如上面所说的：</p><p style="margin-right: 0px; margin-bottom: 10px; margin-left: 0px; color: #333333; line-height: 26px; font-family: Helvetica, arial, sans-serif; background-color: #ffffff;"><code style="margin: 0px 2px; padding: 0px 5px; white-space: nowrap; border: 1px solid #eaeaea; background-color: #f8f8f8; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; font-family: consolas, courier; font-size: 13px; line-height: 20px;">panic</code>在<code style="margin: 0px 2px; padding: 0px 5px; white-space: nowrap; border: 1px solid #eaeaea; background-color: #f8f8f8; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; font-family: consolas, courier; font-size: 13px; line-height: 20px;">user=""</code>时，打断了函数的执行，<code style="margin: 0px 2px; padding: 0px 5px; white-space: nowrap; border: 1px solid #eaeaea; background-color: #f8f8f8; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; font-family: consolas, courier; font-size: 13px; line-height: 20px;">fmt.Print("!!after panic\n")</code>没有执行。 但函数中的延迟函数会正常执行，打印了&nbsp;<code style="margin: 0px 2px; padding: 0px 5px; white-space: nowrap; border: 1px solid #eaeaea; background-color: #f8f8f8; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; font-family: consolas, courier; font-size: 13px; line-height: 20px;">defer##</code>。然后返回到调用该函数的地方，继续上面的过程。</p><p style="margin-right: 0px; margin-bottom: 10px; margin-left: 0px; color: #333333; line-height: 26px; font-family: Helvetica, arial, sans-serif; background-color: #ffffff;">直到执行完所有函数的<code style="margin: 0px 2px; padding: 0px 5px; white-space: nowrap; border: 1px solid #eaeaea; background-color: #f8f8f8; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; font-family: consolas, courier; font-size: 13px; line-height: 20px;">defer</code>，退出程序。<code style="margin: 0px 2px; padding: 0px 5px; white-space: nowrap; border: 1px solid #eaeaea; background-color: #f8f8f8; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; font-family: consolas, courier; font-size: 13px; line-height: 20px;">Recover</code>可以捕获到<code style="margin: 0px 2px; padding: 0px 5px; white-space: nowrap; border: 1px solid #eaeaea; background-color: #f8f8f8; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; font-family: consolas, courier; font-size: 13px; line-height: 20px;">panic</code>的值，上面的打印<code style="margin: 0px 2px; padding: 0px 5px; white-space: nowrap; border: 1px solid #eaeaea; background-color: #f8f8f8; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; font-family: consolas, courier; font-size: 13px; line-height: 20px;">no value for user</code>。并且恢复正常的执行。</p><img src ="http://www.blogjava.net/oathleo/aggbug/404272.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2013-09-22 09:32 <a href="http://www.blogjava.net/oathleo/archive/2013/09/22/404272.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Go语言的传参和传引用</title><link>http://www.blogjava.net/oathleo/archive/2013/09/16/404106.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Mon, 16 Sep 2013 01:23:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2013/09/16/404106.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/404106.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2013/09/16/404106.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/404106.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/404106.html</trackback:ping><description><![CDATA[<div style="padding-top: 5px; padding-bottom: 5px; margin: 0px 0px 10px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13px; line-height: normal; background-color: #ffffff;"><h1>Go语言的传参和传引用[OSC源创会主题补充1]</h1><div style="margin: 0px; color: #666666;"><span style="padding: 0px; margin: 0px; float: right;"><span id="p_attention_count" style="padding: 0px; margin: 0px 2px; font-weight: bold; color: #aa0000;">66</span>人收藏此文章,&nbsp;<span id="attention_it" style="padding: 0px; margin: 0px;"><a id="favor_trigger" title="添加到收藏夹" style="padding: 0px; margin: 0px; color: #aa0000; outline: 0px;">我要收藏</a></span></span>发表于2天前(2013-09-14 22:10) , 已有<strong style="padding: 0px; margin: 0px 2px; color: #aa0000;">1496</strong>次阅读 ，共<strong style="padding: 0px; margin: 0px 2px; color: #aa0000;"><a href="http://my.oschina.net/chai2010/blog/161384?p=2#comments" style="padding: 0px; margin: 0px; color: #aa0000; outline: 0px;">12</a></strong>个评论</div></div><div style="padding: 20px; margin: 0px; background-color: #f6f6f6; line-height: 23px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; font-size: 13px;"><p style="padding: 0px; margin: 0px; font-size: 18px; color: #15a230;">目录：[&nbsp;<span style="padding: 0px; margin: 0px; font-size: 14px;"><a href="http://my.oschina.net/chai2010/blog/161384?p=2#" id="AnchorContentToggle" title="收起" style="padding: 0px; margin: 0px; color: #4466bb; outline: 0px; text-decoration: none;">-</a></span>&nbsp;]</p><div id="AnchorContent" style="padding: 10px; margin: 0px;"><li style="padding: 3px 0px; margin: 0px; list-style: none; text-indent: 20px;"><a href="http://my.oschina.net/chai2010/blog/161384?p=2#OSC_h2_1" style="padding: 0px; margin: 0px; color: #4466bb; outline: 0px; text-decoration: none;">传参和传引用的问题</a></li><li style="padding: 3px 0px; margin: 0px; list-style: none; text-indent: 20px;"><a href="http://my.oschina.net/chai2010/blog/161384?p=2#OSC_h2_2" style="padding: 0px; margin: 0px; color: #4466bb; outline: 0px; text-decoration: none;">slice不是引用!</a></li><li style="padding: 3px 0px; margin: 0px; list-style: none; text-indent: 20px;"><a href="http://my.oschina.net/chai2010/blog/161384?p=2#OSC_h2_3" style="padding: 0px; margin: 0px; color: #4466bb; outline: 0px; text-decoration: none;">什么叫引用?</a></li><li style="padding: 3px 0px; margin: 0px; list-style: none; text-indent: 20px;"><a href="http://my.oschina.net/chai2010/blog/161384?p=2#OSC_h2_4" style="padding: 0px; margin: 0px; color: #4466bb; outline: 0px; text-decoration: none;">为什么slice不是引用?</a></li><li style="padding: 3px 0px; margin: 0px; list-style: none; text-indent: 20px;"><a href="http://my.oschina.net/chai2010/blog/161384?p=2#OSC_h2_5" style="padding: 0px; margin: 0px; color: #4466bb; outline: 0px; text-decoration: none;">为什么很多人误以为slice是引用呢?</a></li><li style="padding: 3px 0px; margin: 0px; list-style: none; text-indent: 20px;"><a href="http://my.oschina.net/chai2010/blog/161384?p=2#OSC_h2_6" style="padding: 0px; margin: 0px; color: #4466bb; outline: 0px; text-decoration: none;">传指针和传引用是等价的吗?</a></li><li style="padding: 3px 0px; margin: 0px; list-style: none; text-indent: 20px;"><a href="http://my.oschina.net/chai2010/blog/161384?p=2#OSC_h2_7" style="padding: 0px; margin: 0px; color: #4466bb; outline: 0px; text-decoration: none;">所有类型的函数参数都是传值的!</a></li><li style="padding: 3px 0px; margin: 0px; list-style: none; text-indent: 20px;"><a href="http://my.oschina.net/chai2010/blog/161384?p=2#OSC_h2_8" style="padding: 0px; margin: 0px; color: #4466bb; outline: 0px; text-decoration: none;">那Go语言有传引用的说法吗?</a></li><li style="padding: 3px 0px; margin: 0px; list-style: none; text-indent: 20px;"><a href="http://my.oschina.net/chai2010/blog/161384?p=2#OSC_h2_9" style="padding: 0px; margin: 0px; color: #4466bb; outline: 0px; text-decoration: none;">总结</a></li></div></div><div style="margin: 0px; font-size: 10.5pt; overflow: hidden; color: #333333; line-height: 25px; font-family: 微软雅黑, Verdana, sans-serif, 宋体; background-color: #ffffff;"><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">OSC源创会主题补充系列:</p><ol style="padding: 0px; margin: 10px 20px; list-style-position: inside;"><li style="padding: 0px; margin: 0px;"><a href="http://my.oschina.net/chai2010/blog/161384" rel="nofollow" style="padding: 0px; margin: 0px; color: #4466bb; outline: 0px;">Go语言的传参和传引用</a></li><li style="padding: 0px; margin: 0px;"><a href="http://my.oschina.net/chai2010/blog/161418" rel="nofollow" style="padding: 0px; margin: 0px; color: #4466bb; outline: 0px;">Go语言的类型转换和类型断言</a></li></ol><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">Go语言规范虽然很简单, 但是深入掌握Go语言却需要很多底层知识.</p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">本来<a href="http://city.oschina.net/wuhan/event/121649" rel="nofollow" style="padding: 0px; margin: 0px; color: #4466bb; outline: 0px;">第20期的武汉OSC源创会</a>有Go语言的专题讲座, 谁知道说取消就取消了.</p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">我最近也整理了一些Go语言资料, 有Go语言的历史/现状/未来发展的八卦和Go语言常见的问题和陷阱两个部分, 本来打算OSC源创会能和武汉的Gopher分享 下的, 谁知道(由于不是赞助商也不是微软的大牛)主办方根本不给任何的机会.</p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">100+人数的交流会基本都是扯淡, 还是小规模的讨论沙龙比较靠谱, 以后再也不会去OSC源创会当听众了.</p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">现在计划将各个小问题暂时作为博客发表.</p><h2>传参和传引用的问题</h2><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">很多非官方的文档和教材(包括一些已经出版的图书), 对Go语言的传参和引用的讲解 都有很多问题. 导致众多Go语言新手对Go的函数参数传参有很多误解.</p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">而传参和传引用是编程语言的根本问题, 如果这个问题理解错误可能会导致很多问题.</p><h2>slice不是引用!</h2><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">首先, Go语言的函数调用参数全部是传值的, 包括&nbsp;<code style="padding: 2px 5px; margin: 0px 2px; border: 1px solid #dddddd; background-color: #f6f6f6; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-break: break-all;">slice</code>/<code style="padding: 2px 5px; margin: 0px 2px; border: 1px solid #dddddd; background-color: #f6f6f6; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-break: break-all;">map</code>/<code style="padding: 2px 5px; margin: 0px 2px; border: 1px solid #dddddd; background-color: #f6f6f6; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-break: break-all;">chan</code>&nbsp;在内所有类型, 没有传引用的说法.</p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">具体请看Go语言的规范:</p><blockquote style="padding: 20px 60px; margin: 15px 0px; quotes: '', ''; position: relative; background-color: #f6f6f6;"><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">After they are evaluated,&nbsp;<strong style="padding: 0px; margin: 0px;">the parameters of the call are passed by value</strong>&nbsp;to the function and the called function begins execution.</p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">from:&nbsp;<a href="http://golang.org/ref/spec#Calls" rel="nofollow" style="padding: 0px; margin: 0px; color: #4466bb; outline: 0px;">http://golang.org/ref/spec#Calls</a></p></blockquote><h2>什么叫引用?</h2><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">比如有以下代码:</p><pre style="padding: 5px; margin-top: 10px; margin-bottom: 10px; line-height: 18px; font-size: 9pt; font-family: 'Courier New', Arial; border-width: 1px 1px 1px 5px; border-style: solid; border-color: #dddddd #dddddd #dddddd #6ce26c; background-color: #f6f6f6;"><code style="padding: 0px; margin: 0px; border: none; background-color: transparent; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-break: break-all;">var a Object doSomething(a) // 修改a的值 print(a) </code></pre><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">如果函数<code style="padding: 2px 5px; margin: 0px 2px; border: 1px solid #dddddd; background-color: #f6f6f6; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-break: break-all;">doSomething</code>修改<code style="padding: 2px 5px; margin: 0px 2px; border: 1px solid #dddddd; background-color: #f6f6f6; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-break: break-all;">a</code>的值, 然后<code style="padding: 2px 5px; margin: 0px 2px; border: 1px solid #dddddd; background-color: #f6f6f6; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-break: break-all;">print</code>打印出来的也是修改后的值, 那么就可以认为<code style="padding: 2px 5px; margin: 0px 2px; border: 1px solid #dddddd; background-color: #f6f6f6; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-break: break-all;">doSomething</code>是通过引用的方式使用了参数<code style="padding: 2px 5px; margin: 0px 2px; border: 1px solid #dddddd; background-color: #f6f6f6; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-break: break-all;">a</code>.</p><h2>为什么slice不是引用?</h2><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">我们构造以下的代码:</p><pre style="padding: 5px; margin-top: 10px; margin-bottom: 10px; line-height: 18px; font-size: 9pt; font-family: 'Courier New', Arial; border-width: 1px 1px 1px 5px; border-style: solid; border-color: #dddddd #dddddd #dddddd #6ce26c; background-color: #f6f6f6;"><code style="padding: 0px; margin: 0px; border: none; background-color: transparent; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-break: break-all;">func main() {     a := []int{1,2,3}     fmt.Println(a)     modifySlice(a)     fmt.Println(a) }  func modifySlice(data []int) {     data = nil } </code></pre><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">其中<code style="padding: 2px 5px; margin: 0px 2px; border: 1px solid #dddddd; background-color: #f6f6f6; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-break: break-all;">modifySlice</code>修改了切片<code style="padding: 2px 5px; margin: 0px 2px; border: 1px solid #dddddd; background-color: #f6f6f6; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-break: break-all;">a</code>, 输出结果如下:</p><pre style="padding: 5px; margin-top: 10px; margin-bottom: 10px; line-height: 18px; font-size: 9pt; font-family: 'Courier New', Arial; border-width: 1px 1px 1px 5px; border-style: solid; border-color: #dddddd #dddddd #dddddd #6ce26c; background-color: #f6f6f6;"><code style="padding: 0px; margin: 0px; border: none; background-color: transparent; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-break: break-all;">[1 2 3] [1 2 3] </code></pre><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">说明<code style="padding: 2px 5px; margin: 0px 2px; border: 1px solid #dddddd; background-color: #f6f6f6; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-break: break-all;">a</code>在调用<code style="padding: 2px 5px; margin: 0px 2px; border: 1px solid #dddddd; background-color: #f6f6f6; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-break: break-all;">modifySlice</code>前后并没有任何变化, 因此<code style="padding: 2px 5px; margin: 0px 2px; border: 1px solid #dddddd; background-color: #f6f6f6; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-break: break-all;">a</code>必然是传值的!</p><h2>为什么很多人误以为slice是引用呢?</h2><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">可能是 因为很多新接触Go语言的新手, 看到Go语言的文档说Go的切片和C语言的数组类型, 而C语言的数组是传地址的(注意: 不是传引用!).</p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">下面这个代码可能是错误的根源:</p><pre style="padding: 5px; margin-top: 10px; margin-bottom: 10px; line-height: 18px; font-size: 9pt; font-family: 'Courier New', Arial; border-width: 1px 1px 1px 5px; border-style: solid; border-color: #dddddd #dddddd #dddddd #6ce26c; background-color: #f6f6f6;"><code style="padding: 0px; margin: 0px; border: none; background-color: transparent; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-break: break-all;">func main() {     a := []int{1,2,3}     fmt.Println(a)     modifySliceData(a)     fmt.Println(a) }  func modifySliceData(data []int) {     data[0] = 0 } </code></pre><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">输出为:</p><pre style="padding: 5px; margin-top: 10px; margin-bottom: 10px; line-height: 18px; font-size: 9pt; font-family: 'Courier New', Arial; border-width: 1px 1px 1px 5px; border-style: solid; border-color: #dddddd #dddddd #dddddd #6ce26c; background-color: #f6f6f6;"><code style="padding: 0px; margin: 0px; border: none; background-color: transparent; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-break: break-all;">[1 2 3] [0 2 3] </code></pre><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">函数<code style="padding: 2px 5px; margin: 0px 2px; border: 1px solid #dddddd; background-color: #f6f6f6; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-break: break-all;">modifySliceData</code>确实通过参数修改了切片的内容.</p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">但是请注意: 修改通过函数修改参数内容的机制有很多, 其中传参数的地址就可以修改参数的值(其实是修改参数中指针指向的数据), 并不是只有引用一种方式!</p><h2>传指针和传引用是等价的吗?</h2><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">比如有以下代码:</p><pre style="padding: 5px; margin-top: 10px; margin-bottom: 10px; line-height: 18px; font-size: 9pt; font-family: 'Courier New', Arial; border-width: 1px 1px 1px 5px; border-style: solid; border-color: #dddddd #dddddd #dddddd #6ce26c; background-color: #f6f6f6;"><code style="padding: 0px; margin: 0px; border: none; background-color: transparent; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-break: break-all;">func main() {     a := new(int)     fmt.Println(a)     modify(a)     fmt.Println(a) }  func modify(a *int) {     a = nil } </code></pre><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">输出为:</p><pre style="padding: 5px; margin-top: 10px; margin-bottom: 10px; line-height: 18px; font-size: 9pt; font-family: 'Courier New', Arial; border-width: 1px 1px 1px 5px; border-style: solid; border-color: #dddddd #dddddd #dddddd #6ce26c; background-color: #f6f6f6;"><code style="padding: 0px; margin: 0px; border: none; background-color: transparent; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-break: break-all;">0xc010000000 0xc010000000 </code></pre><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">可以看出指针<code style="padding: 2px 5px; margin: 0px 2px; border: 1px solid #dddddd; background-color: #f6f6f6; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-break: break-all;">a</code>本身并没有变化. 传指针或传地址也只能修改指针指向的内存的值, 并不能改变指针本身在值.</p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;"><strong style="padding: 0px; margin: 0px;">因此, 函数参数传传指针也是传值的, 并不是传引用!</strong></p><h2>所有类型的函数参数都是传值的!</h2><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">包括<code style="padding: 2px 5px; margin: 0px 2px; border: 1px solid #dddddd; background-color: #f6f6f6; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-break: break-all;">slice</code>/<code style="padding: 2px 5px; margin: 0px 2px; border: 1px solid #dddddd; background-color: #f6f6f6; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-break: break-all;">map</code>/<code style="padding: 2px 5px; margin: 0px 2px; border: 1px solid #dddddd; background-color: #f6f6f6; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-break: break-all;">chan</code>等基础类型和自定义的类型都是传值的.</p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">但是因为<code style="padding: 2px 5px; margin: 0px 2px; border: 1px solid #dddddd; background-color: #f6f6f6; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-break: break-all;">slice</code>和<code style="padding: 2px 5px; margin: 0px 2px; border: 1px solid #dddddd; background-color: #f6f6f6; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-break: break-all;">map</code>/<code style="padding: 2px 5px; margin: 0px 2px; border: 1px solid #dddddd; background-color: #f6f6f6; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-break: break-all;">chan</code>底层结构的差异, 又导致了它们传值的影响并不完全等同.</p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">重点归纳如下:</p><ul style="padding: 0px; margin: 10px 20px; list-style-position: inside;"><li style="padding: 0px; margin: 0px;">GoSpec: the parameters of the call are passed by value!</li><li style="padding: 0px; margin: 0px;">map/slice/chan 都是传值, 不是传引用</li><li style="padding: 0px; margin: 0px;">map/chan 对应指针, 和引用类似</li><li style="padding: 0px; margin: 0px;"><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">slice 是结构体和指针的混合体</p></li><li style="padding: 0px; margin: 0px;"><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">slice 含 values/count/capacity 等信息, 是按值传递</p></li><li style="padding: 0px; margin: 0px;">slice 中的 values 是指针, 按值传递</li><li style="padding: 0px; margin: 0px;"><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">按值传递的 slice 只能修改values指向的数据, 其他都不能修改</p></li><li style="padding: 0px; margin: 0px;"><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">以指针或结构体的角度看, 都是值传递!</p></li></ul><h2>那Go语言有传引用的说法吗?</h2><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">Go语言其实也是有传引用的地方的, 但是不是函数的参数, 而是闭包对外部环境是通过引用访问的.</p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">查看以下的代码:</p><pre style="padding: 5px; margin-top: 10px; margin-bottom: 10px; line-height: 18px; font-size: 9pt; font-family: 'Courier New', Arial; border-width: 1px 1px 1px 5px; border-style: solid; border-color: #dddddd #dddddd #dddddd #6ce26c; background-color: #f6f6f6;"><code style="padding: 0px; margin: 0px; border: none; background-color: transparent; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-break: break-all;">func main() {     a := new(int)     fmt.Println(a)     func() {         a = nil     }()     fmt.Println(a) } </code></pre><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">输出为:</p><pre style="padding: 5px; margin-top: 10px; margin-bottom: 10px; line-height: 18px; font-size: 9pt; font-family: 'Courier New', Arial; border-width: 1px 1px 1px 5px; border-style: solid; border-color: #dddddd #dddddd #dddddd #6ce26c; background-color: #f6f6f6;"><code style="padding: 0px; margin: 0px; border: none; background-color: transparent; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-break: break-all;">0xc010000000 &lt;nil&gt; </code></pre><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">因为闭包是通过引用的方式使用外部环境的<code style="padding: 2px 5px; margin: 0px 2px; border: 1px solid #dddddd; background-color: #f6f6f6; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-break: break-all;">a</code>变量, 因此可以直接修改<code style="padding: 2px 5px; margin: 0px 2px; border: 1px solid #dddddd; background-color: #f6f6f6; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-break: break-all;">a</code>的值.</p><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">比如下面2段代码的输出是截然不同的, 原因就是第二个代码是通过闭包引用的方式输出<code style="padding: 2px 5px; margin: 0px 2px; border: 1px solid #dddddd; background-color: #f6f6f6; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-break: break-all;">i</code>变量:</p><pre style="padding: 5px; margin-top: 10px; margin-bottom: 10px; line-height: 18px; font-size: 9pt; font-family: 'Courier New', Arial; border-width: 1px 1px 1px 5px; border-style: solid; border-color: #dddddd #dddddd #dddddd #6ce26c; background-color: #f6f6f6;"><code style="padding: 0px; margin: 0px; border: none; background-color: transparent; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-break: break-all;">for i := 0; i &lt; 5; i++ {     defer fmt.Printf("%d ", i)     // Output: 4 3 2 1 0 }  fmt.Printf("\n")     for i := 0; i &lt; 5; i++ {     defer func(){ fmt.Printf("%d ", i) } ()     // Output: 5 5 5 5 5 } </code></pre><p style="padding: 0px; margin: 12px 0px; letter-spacing: 1px;">像第二个代码就是于闭包引用导致的副作用, 回避这个副作用的办法是通过参数传值或每次闭包构造不同的临时变量:</p><pre style="padding: 5px; margin-top: 10px; margin-bottom: 10px; line-height: 18px; font-size: 9pt; font-family: 'Courier New', Arial; border-width: 1px 1px 1px 5px; border-style: solid; border-color: #dddddd #dddddd #dddddd #6ce26c; background-color: #f6f6f6;"><code style="padding: 0px; margin: 0px; border: none; background-color: transparent; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-break: break-all;">// 方法1: 每次循环构造一个临时变量 i for i := 0; i &lt; 5; i++ {     i := i     defer func(){ fmt.Printf("%d ", i) } ()     // Output: 4 3 2 1 0 } // 方法2: 通过函数参数传惨 for i := 0; i &lt; 5; i++ {     defer func(i int){ fmt.Printf("%d ", i) } (i)     // Output: 4 3 2 1 0 } </code></pre><h2>总结</h2><ul style="padding: 0px; margin: 10px 20px; list-style-position: inside;"><li style="padding: 0px; margin: 0px;">函数参数传值, 闭包传引用!</li><li style="padding: 0px; margin: 0px;">slice 含 values/count/capacity 等信息, 是按值传递</li><li style="padding: 0px; margin: 0px;">按值传递的 slice 只能修改values指向的数据, 其他都不能修改</li><li style="padding: 0px; margin: 0px;">slice 是结构体和指针的混合体</li></ul></div><img src ="http://www.blogjava.net/oathleo/aggbug/404106.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2013-09-16 09:23 <a href="http://www.blogjava.net/oathleo/archive/2013/09/16/404106.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数组和切片</title><link>http://www.blogjava.net/oathleo/archive/2013/09/12/403973.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Thu, 12 Sep 2013 01:20:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2013/09/12/403973.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/403973.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2013/09/12/403973.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/403973.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/403973.html</trackback:ping><description><![CDATA[<div id="cnblogs_post_body" style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; line-height: normal; background-color: #eeeedd; word-break: normal !important;"><div id="markdown-preview" style="line-height: 1.6; overflow: hidden;"><h3>数组 Arrays</h3><p style="margin: 0px 0px 15px; line-height: 21px;">数组是内置(build-in)类型,是一组同类型数据的集合，它是值类型，通过从0开始的下标索引访问元素值。在初始化后长度是固定的，无法修改其长度。当作为方法的入参传入时将复制一份数组而不是引用同一指针。数组的长度也是其类型的一部分，通过内置函数len(array)获取其长度。</p><h4>初始化</h4><p style="margin: 0px 0px 15px; line-height: 21px;">数组的初始化有多种形式,<a href="https://github.com/devYu/GoLangStudy/blob/master/codeDemo/arrays/arraysInitDemo.go" style="color: #770000; text-decoration: none;">查看示例代码</a>&nbsp;,&nbsp;<a href="http://play.golang.org/p/SHJBJ8hAw1" style="color: #770000; text-decoration: none;">在线运行示例代码</a></p><ul style="margin: 15px 0px 15px 45px; padding-left: 10px;"><li style="list-style: inherit;"><code style="margin: 0px 2px; padding: 0px 5px; border: 1px solid #eaeaea; background-color: #f8f8f8; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; white-space: nowrap; font-family: monospace, Monaco;">[5] int {1,2,3,4,5}</code>&nbsp;<br />长度为5的数组，其元素值依次为：1，2，3，4，5</li><li style="list-style: inherit;"><code style="margin: 0px 2px; padding: 0px 5px; border: 1px solid #eaeaea; background-color: #f8f8f8; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; white-space: nowrap; font-family: monospace, Monaco;">[5] int {1,2}</code>&nbsp;<br />长度为5的数组，其元素值依次为：1，2，0，0，0 。在初始化时没有指定初值的元素将会赋值为其元素类型int的默认值0,string的默认值是<strong>""</strong></li><li style="list-style: inherit;"><code style="margin: 0px 2px; padding: 0px 5px; border: 1px solid #eaeaea; background-color: #f8f8f8; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; white-space: nowrap; font-family: monospace, Monaco;">[...] int {1,2,3,4,5}</code>&nbsp;<br />长度为5的数组，其长度是根据初始化时指定的元素个数决定的</li><li style="list-style: inherit;"><code style="margin: 0px 2px; padding: 0px 5px; border: 1px solid #eaeaea; background-color: #f8f8f8; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; white-space: nowrap; font-family: monospace, Monaco;">[5] int { 2:1,3:2,4:3}</code>&nbsp;<br />长度为5的数组，key:value,其元素值依次为：0，0，1，2，3。在初始化时指定了2，3，4索引中对应的值：1，2，3</li><li style="list-style: inherit;"><code style="margin: 0px 2px; padding: 0px 5px; border: 1px solid #eaeaea; background-color: #f8f8f8; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; white-space: nowrap; font-family: monospace, Monaco;">[...] int {2:1,4:3}</code>&nbsp;<br />长度为5的数组，起元素值依次为：0，0，1，0，3。由于指定了最大索引4对应的值3，根据初始化的元素个数确定其长度为5</li></ul><h4><a name="-1" href="http://www.cnblogs.com/howDo/archive/2013/04/25/GoLang-Array-Slice.html#-1" style="color: rgb(119, 0, 0); text-decoration: none; display: block; padding-left: 30px; margin-left: -30px; cursor: pointer; position: absolute; top: 0px; left: 0px; bottom: 0px;"></a>赋值与使用</h4><p style="margin: 0px 0px 15px; line-height: 21px;">数组通过下标访问元素，可修改其元素值</p><pre style="margin: 15px; white-space: pre-wrap; word-wrap: break-word; background-color: #141414; border: 1px solid #cccccc; font-size: 13px; line-height: 19px; overflow: auto; padding: 6px 10px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; color: #f2f2f2; background-position: initial initial; background-repeat: initial initial;"><code style="margin: 0px; padding: 0px; border: none; background-color: transparent; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; white-space: pre; font-size: 14px; font-family: monospace, Monaco; background-position: initial initial; background-repeat: initial initial;">arr :=[...] int {1,2,3,4,5} arr[4]=arr[1]+len(arr)      //arr[4]=2+5 </code></pre><p style="margin: 15px 0px; line-height: 21px;">通过for遍历数组元素,<a href="https://github.com/devYu/GoLangStudy/blob/master/codeDemo/arrays/arraysForDemo.go" style="color: #770000; text-decoration: none;">查看示例代码</a>,<a href="http://play.golang.org/p/XyypK-D7Bk" style="color: #770000; text-decoration: none;">在线运行示例代码</a></p><pre style="margin: 15px; white-space: pre-wrap; word-wrap: break-word; background-color: #141414; border: 1px solid #cccccc; font-size: 13px; line-height: 19px; overflow: auto; padding: 6px 10px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; color: #f2f2f2; background-position: initial initial; background-repeat: initial initial;"><code style="margin: 0px; padding: 0px; border: none; background-color: transparent; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; white-space: pre; font-size: 14px; font-family: monospace, Monaco; background-position: initial initial; background-repeat: initial initial;">arr := [5]int{5, 4, 3}  for index, value := range arr {     fmt.Printf("arr[%d]=%d \n", index, value) }  for index := 0; index &lt; len(arr); index++ {     fmt.Printf("arr[%d]=%d \n", index, arr[index]) } </code></pre><p style="margin: 15px 0px; line-height: 21px;">数组是值类型，将一个数组赋值给另一个数组时将复制一份新的元素,<a href="https://github.com/devYu/GoLangStudy/blob/master/codeDemo/arrays/arraysValueDemo.go" style="color: #770000; text-decoration: none;">查看示例代码</a>,<a href="http://play.golang.org/p/3ejYrjlfnm" style="color: #770000; text-decoration: none;">在线运行示例代码</a></p><pre style="margin: 15px; white-space: pre-wrap; word-wrap: break-word; background-color: #141414; border: 1px solid #cccccc; font-size: 13px; line-height: 19px; overflow: auto; padding: 6px 10px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; color: #f2f2f2; background-position: initial initial; background-repeat: initial initial;"><code style="margin: 0px; padding: 0px; border: none; background-color: transparent; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; white-space: pre; font-size: 14px; font-family: monospace, Monaco; background-position: initial initial; background-repeat: initial initial;">arr2 := [5]int{1, 2}  arr5 := arr2 arr5[0] = 5 arr2[4] = 2 fmt.Printf(" arr5= %d \n arr2=%d \n arr5[0]==arr2[0]= %s \n", arr5, arr2, arr5[0] == arr2[0])  OutPut:  arr5=[5 2 0 0 0]   arr2=[1 2 0 0 2]   arr5[0]==arr2[0]= false </code></pre><h3><a name="-slices" href="http://www.cnblogs.com/howDo/archive/2013/04/25/GoLang-Array-Slice.html#-slices" style="color: rgb(119, 0, 0); text-decoration: none; display: block; padding-left: 30px; margin-left: -30px; cursor: pointer; position: absolute; top: 0px; left: 0px; bottom: 0px;"></a>切片 Slices</h3><p style="margin: 0px 0px 15px; line-height: 21px;">数组的长度不可改变，在特定场景中这样的集合就不太适用，Go中提供了一种灵活，功能强悍的内置类型<strong>Slices</strong>切片,与数组相比切片的长度是不固定的，可以追加元素，在追加时可能使切片的容量增大。切片中有两个概念：一是<strong>len长度</strong>，二是<strong>cap容量</strong>，长度是指已经被赋过值的最大下标+1，可通过内置函数len()获得。容量是指切片目前可容纳的最多元素个数，可通过内置函数cap()获得。切片是引用类型，因此在当传递切片时将引用同一指针，修改值将会影响其他的对象。</p><h4><a name="-2" href="http://www.cnblogs.com/howDo/archive/2013/04/25/GoLang-Array-Slice.html#-2" style="color: rgb(119, 0, 0); text-decoration: none; display: block; padding-left: 30px; margin-left: -30px; cursor: pointer; position: absolute; top: 0px; left: 0px; bottom: 0px;"></a>初始化</h4><p style="margin: 0px 0px 15px; line-height: 21px;">切片可以通过数组来初始化，也可以通过内置函数make()初始化 .初始化时len=cap,在追加元素时如果容量cap不足时将按len的<strong>2</strong>倍扩容&nbsp;<a href="https://github.com/devYu/GoLangStudy/blob/master/codeDemo/arrays/slicesInitDemo.go" style="color: #770000; text-decoration: none;">查看示例代码</a>，<a href="http://play.golang.org/p/7srUx-HM0p" style="color: #770000; text-decoration: none;">在线运行示例代码</a></p><ul style="margin: 15px 0px 15px 45px; padding-left: 10px;"><li style="list-style: inherit;"><code style="margin: 0px 2px; padding: 0px 5px; border: 1px solid #eaeaea; background-color: #f8f8f8; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; white-space: nowrap; font-family: monospace, Monaco;">s :=[] int {1,2,3 }</code>&nbsp;<br />直接初始化切片，<strong>[]</strong>表示是切片类型，<strong>{1,2,3}</strong>初始化值依次是1,2,3.其cap=len=3</li><li style="list-style: inherit;"><code style="margin: 0px 2px; padding: 0px 5px; border: 1px solid #eaeaea; background-color: #f8f8f8; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; white-space: nowrap; font-family: monospace, Monaco;">s := arr[:]</code>&nbsp;<br />初始化切片s,是数组arr的引用</li><li style="list-style: inherit;"><code style="margin: 0px 2px; padding: 0px 5px; border: 1px solid #eaeaea; background-color: #f8f8f8; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; white-space: nowrap; font-family: monospace, Monaco;">s := arr[startIndex:endIndex]</code>&nbsp;<br />将arr中从下标startIndex到endIndex-1 下的元素创建为一个新的切片</li><li style="list-style: inherit;"><code style="margin: 0px 2px; padding: 0px 5px; border: 1px solid #eaeaea; background-color: #f8f8f8; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; white-space: nowrap; font-family: monospace, Monaco;">s := arr[startIndex:]</code>&nbsp;<br />缺省endIndex时将表示一直到arr的最后一个元素</li><li style="list-style: inherit;"><code style="margin: 0px 2px; padding: 0px 5px; border: 1px solid #eaeaea; background-color: #f8f8f8; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; white-space: nowrap; font-family: monospace, Monaco;">s := arr[:endIndex]</code>&nbsp;<br />缺省startIndex时将表示从arr的第一个元素开始</li><li style="list-style: inherit;"><code style="margin: 0px 2px; padding: 0px 5px; border: 1px solid #eaeaea; background-color: #f8f8f8; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; white-space: nowrap; font-family: monospace, Monaco;">s1 := s[startIndex:endIndex]</code>&nbsp;<br />通过切片s初始化切片s1</li><li style="list-style: inherit;"><code style="margin: 0px 2px; padding: 0px 5px; border: 1px solid #eaeaea; background-color: #f8f8f8; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; white-space: nowrap; font-family: monospace, Monaco;">s :=make([]int,len,cap)</code>&nbsp;<br />通过内置函数make()初始化切片s,[]int 标识为其元素类型为int的切片</li></ul><h4><a name="-3" href="http://www.cnblogs.com/howDo/archive/2013/04/25/GoLang-Array-Slice.html#-3" style="color: rgb(119, 0, 0); text-decoration: none; display: block; padding-left: 30px; margin-left: -30px; cursor: pointer; position: absolute; top: 0px; left: 0px; bottom: 0px;"></a>赋值与使用</h4><p style="margin: 0px 0px 15px; line-height: 21px;">切片是引用类型，在使用时需要注意其操作。<a href="https://github.com/devYu/GoLangStudy/blob/master/codeDemo/arrays/slicesValueDemo.go" style="color: #770000; text-decoration: none;">查看示例代码</a>&nbsp;，<a href="http://play.golang.org/p/sQgYIurZoy" style="color: #770000; text-decoration: none;">在线运行示例代码</a>&nbsp;切片可以通过内置函数append(slice []Type,elems ...Type)追加元素，elems可以是一排type类型的数据，也可以是slice,因为追加的一个一个的元素，因此如果将一个slice追加到另一个slice中需要带上"<strong>...</strong>"，这样才能表示是将slice中的元素依次追加到另一个slice中。另外在通过下标访问元素时下标不能超过len大小，如同数组的下标不能超出len范围一样。</p><ul style="margin-top: 15px; margin-right: 0px; margin-left: 45px; padding-left: 10px; margin-bottom: 0px !important;"><li style="list-style: inherit;"><code style="margin: 0px 2px; padding: 0px 5px; border: 1px solid #eaeaea; background-color: #f8f8f8; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; white-space: nowrap; font-family: monospace, Monaco;">s :=append(s,1,2,3,4)</code></li><li style="list-style: inherit;"><code style="margin: 0px 2px; padding: 0px 5px; border: 1px solid #eaeaea; background-color: #f8f8f8; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; white-space: nowrap; font-family: monospace, Monaco;">s :=append(s,s1...)</code></li></ul></div></div><div id="MySignature" style="margin-top: 10px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; line-height: normal; background-color: #eeeedd;">转载时请注明出处！老虞http://www.cnblogs.com/howDo/</div><img src ="http://www.blogjava.net/oathleo/aggbug/403973.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2013-09-12 09:20 <a href="http://www.blogjava.net/oathleo/archive/2013/09/12/403973.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Socket read write</title><link>http://www.blogjava.net/oathleo/archive/2013/09/11/403935.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Wed, 11 Sep 2013 00:56:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2013/09/11/403935.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/403935.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2013/09/11/403935.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/403935.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/403935.html</trackback:ping><description><![CDATA[服务器端/客户端 在 login的时候经常多次read write<br />这个时候 read 要完整，第一次没有read完，就write，第二次read 到的仍然是上次没有read完的数据<img src ="http://www.blogjava.net/oathleo/aggbug/403935.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2013-09-11 08:56 <a href="http://www.blogjava.net/oathleo/archive/2013/09/11/403935.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>bufio 包</title><link>http://www.blogjava.net/oathleo/archive/2013/09/05/403714.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Thu, 05 Sep 2013 08:01:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2013/09/05/403714.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/403714.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2013/09/05/403714.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/403714.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/403714.html</trackback:ping><description><![CDATA[<div>// bufio 包实现了带缓存的 I/O 操作</div><div>// 它封装一个 io.Reader 或 io.Writer 对象</div><div>// 使其具有缓存和一些文本读写功能</div><div></div><div>------------------------------------------------------------</div><div></div><div>// bufio.go</div><div></div><div>------------------------------------------------------------</div><div></div><div>// Reader 实现了带缓存的 io.Reader 对象</div><div>type Reader struct {</div><div><span style="white-space:pre">	</span>// 私有字段</div><div>}</div><div></div><div>// NewReaderSize 将 rd 封装成一个拥有 size 大小缓存的 bufio.Reader 对象</div><div>// 如果 rd 的基类型就是 bufio.Reader 类型，而且拥有足够的缓存</div><div>// 则直接将 rd 转换为基类型并返回</div><div>func NewReaderSize(rd io.Reader, size int) *Reader</div><div></div><div>// NewReader 相当于 NewReaderSize(rd, 4096)</div><div>func NewReader(rd io.Reader) *Reader</div><div></div><div>------------------------------------------------------------</div><div></div><div>// Peek 返回缓存的一个切片，该切片引用缓存中前 n 字节数据</div><div>// 该操作不会将数据读出，只是引用</div><div>// 引用的数据在下一次读取操作之前是有效的</div><div>// 如果引用的数据长度小于 n，则返回一个错误信息</div><div>// 如果 n 大于缓存的总大小，则返回 ErrBufferFull</div><div>// 通过 Peek 的返回值，可以修改缓存中的数据</div><div>// 但是不能修改底层 io.Reader 中的数据</div><div>func (b *Reader) Peek(n int) ([]byte, error)</div><div></div><div>func main() {</div><div><span style="white-space:pre">	</span>s := strings.NewReader("ABCDEFG")</div><div><span style="white-space:pre">	</span>br := bufio.NewReader(s)</div><div></div><div><span style="white-space:pre">	</span>b, _ := br.Peek(5)</div><div><span style="white-space:pre">	</span>fmt.Printf("%s\n", b)</div><div><span style="white-space:pre">	</span>// ABCDE</div><div></div><div><span style="white-space:pre">	</span>b[0] = 'a'</div><div><span style="white-space:pre">	</span>b, _ = br.Peek(5)</div><div><span style="white-space:pre">	</span>fmt.Printf("%s\n", b)</div><div><span style="white-space:pre">	</span>// aBCDE</div><div>}</div><div></div><div>------------------------------------------------------------</div><div></div><div>// Read 从 b 中读出数据到 p 中，返回读出的字节数</div><div>// 如果 p 的大小 &gt;= 缓存的总大小，而且缓存不为空</div><div>// 则只能读出缓存中的数据，不会从底层 io.Reader 中提取数据</div><div>// 如果 p 的大小 &gt;= 缓存的总大小，而且缓存为空</div><div>// 则直接从底层 io.Reader 向 p 中读出数据，不经过缓存</div><div>// 只有当 b 中无可读数据时，才返回 (0, io.EOF)</div><div>func (b *Reader) Read(p []byte) (n int, err error)</div><div></div><div>func main() {</div><div><span style="white-space:pre">	</span>s := strings.NewReader("ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890")</div><div><span style="white-space:pre">	</span>br := bufio.NewReader(s)</div><div><span style="white-space:pre">	</span>b := make([]byte, 20)</div><div></div><div><span style="white-space:pre">	</span>n, err := br.Read(b)</div><div><span style="white-space:pre">	</span>fmt.Printf("%-20s %-2v %v\n", b[:n], n, err)</div><div><span style="white-space:pre">	</span>// ABCDEFGHIJKLMNOPQRST 20 &lt;nil&gt;</div><div></div><div><span style="white-space:pre">	</span>n, err = br.Read(b)</div><div><span style="white-space:pre">	</span>fmt.Printf("%-20s %-2v %v\n", b[:n], n, err)</div><div><span style="white-space:pre">	</span>// UVWXYZ1234567890 &nbsp; &nbsp; 16 &lt;nil&gt;&nbsp;</div><div></div><div><span style="white-space:pre">	</span>n, err = br.Read(b)</div><div><span style="white-space:pre">	</span>fmt.Printf("%-20s %-2v %v\n", b[:n], n, err)</div><div><span style="white-space:pre">	</span>// &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0 &nbsp;EOF</div><div>}</div><div></div><div>------------------------------------------------------------</div><div></div><div>// ReadByte 从 b 中读出一个字节并返回</div><div>// 如果 b 中无可读数据，则返回一个错误</div><div>func (b *Reader) ReadByte() (c byte, err error)</div><div></div><div>// UnreadByte 撤消最后一次读出的字节</div><div>// 只有最后读出的字节可以被撤消</div><div>// 无论任何操作，只要有内容被读出，就可以用 UnreadByte 撤消一个字节</div><div>func (b *Reader) UnreadByte() error</div><div></div><div>func main() {</div><div><span style="white-space:pre">	</span>s := strings.NewReader("ABCDEFG")</div><div><span style="white-space:pre">	</span>br := bufio.NewReader(s)</div><div></div><div><span style="white-space:pre">	</span>c, _ := br.ReadByte()</div><div><span style="white-space:pre">	</span>fmt.Printf("%c\n", c)</div><div><span style="white-space:pre">	</span>// A</div><div></div><div><span style="white-space:pre">	</span>c, _ = br.ReadByte()</div><div><span style="white-space:pre">	</span>fmt.Printf("%c\n", c)</div><div><span style="white-space:pre">	</span>// B</div><div></div><div><span style="white-space:pre">	</span>br.UnreadByte()</div><div><span style="white-space:pre">	</span>c, _ = br.ReadByte()</div><div><span style="white-space:pre">	</span>fmt.Printf("%c\n", c)</div><div><span style="white-space:pre">	</span>// B</div><div>}</div><div></div><div>------------------------------------------------------------</div><div></div><div>// ReadRune 从 b 中读出一个 UTF8 编码的字符并返回</div><div>// 同时返回该字符的 UTF8 编码长度</div><div>// 如果 UTF8 序列无法解码出一个正确的 Unicode 字符</div><div>// 则只读出 b 中的一个字节，并返回 U+FFFD 字符，size 返回 1</div><div>func (b *Reader) ReadRune() (r rune, size int, err error)</div><div></div><div>// UnreadRune 撤消最后一次读出的 Unicode 字符</div><div>// 如果最后一次执行的不是 ReadRune 操作，则返回一个错误</div><div>// 因此，UnreadRune 比 UnreadByte 更严格</div><div>func (b *Reader) UnreadRune() error</div><div></div><div>func main() {</div><div><span style="white-space:pre">	</span>s := strings.NewReader("你好，世界！")</div><div><span style="white-space:pre">	</span>br := bufio.NewReader(s)</div><div></div><div><span style="white-space:pre">	</span>c, size, _ := br.ReadRune()</div><div><span style="white-space:pre">	</span>fmt.Printf("%c %v\n", c, size)</div><div><span style="white-space:pre">	</span>// 你 3</div><div></div><div><span style="white-space:pre">	</span>c, size, _ = br.ReadRune()</div><div><span style="white-space:pre">	</span>fmt.Printf("%c %v\n", c, size)</div><div><span style="white-space:pre">	</span>// 好 3</div><div></div><div><span style="white-space:pre">	</span>br.UnreadRune()</div><div><span style="white-space:pre">	</span>c, size, _ = br.ReadRune()</div><div><span style="white-space:pre">	</span>fmt.Printf("%c %v\n", c, size)</div><div><span style="white-space:pre">	</span>// 好 3</div><div>}</div><div></div><div>------------------------------------------------------------</div><div></div><div>// Buffered 返回缓存中数据的长度</div><div>func (b *Reader) Buffered() int</div><div></div><div>func main() {</div><div><span style="white-space:pre">	</span>s := strings.NewReader("你好，世界！")</div><div><span style="white-space:pre">	</span>br := bufio.NewReader(s)</div><div></div><div><span style="white-space:pre">	</span>fmt.Println(br.Buffered())</div><div><span style="white-space:pre">	</span>// 0</div><div></div><div><span style="white-space:pre">	</span>br.Peek(1)</div><div><span style="white-space:pre">	</span>fmt.Println(br.Buffered())</div><div><span style="white-space:pre">	</span>// 18</div><div>}</div><div></div><div>------------------------------------------------------------</div><div></div><div>// ReadSlice 在 b 中查找 delim 并返回 delim 及其之前的所有数据的切片</div><div>// 该操作会读出数据，返回的切片是已读出数据的引用</div><div>// 切片中的数据在下一次读取操作之前是有效的</div><div>//</div><div>// 如果 ReadSlice 在找到 delim 之前遇到错误</div><div>// 则读出缓存中的所有数据并返回，同时返回遇到的错误（通常是 io.EOF）</div><div>// 如果在整个缓存中都找不到 delim，则 err 返回 ErrBufferFull</div><div>// 如果 ReadSlice 能找到 delim，则 err 始终返回 nil</div><div>//</div><div>// 因为返回的切片中的数据有可能被下一次读写操作修改</div><div>// 因此大多数操作应该使用 ReadBytes 或 ReadString，它们返回的不是数据引用</div><div>func (b *Reader) ReadSlice(delim byte) (line []byte, err error)</div><div></div><div>func main() {</div><div><span style="white-space:pre">	</span>s := strings.NewReader("ABC DEF GHI JKL")</div><div><span style="white-space:pre">	</span>br := bufio.NewReader(s)</div><div></div><div><span style="white-space:pre">	</span>w, _ := br.ReadSlice(' ')</div><div><span style="white-space:pre">	</span>fmt.Printf("%q\n", w)</div><div><span style="white-space:pre">	</span>// "ABC "</div><div></div><div><span style="white-space:pre">	</span>w, _ = br.ReadSlice(' ')</div><div><span style="white-space:pre">	</span>fmt.Printf("%q\n", w)</div><div><span style="white-space:pre">	</span>// "DEF "</div><div></div><div><span style="white-space:pre">	</span>w, _ = br.ReadSlice(' ')</div><div><span style="white-space:pre">	</span>fmt.Printf("%q\n", w)</div><div><span style="white-space:pre">	</span>// "GHI "</div><div>}</div><div></div><div>------------------------------------------------------------</div><div></div><div>// ReadLine 是一个低级的原始的行读取操作</div><div>// 大多数情况下，应该使用 ReadBytes('\n') 或 ReadString('\n')</div><div>// 或者使用一个 Scanner</div><div>//</div><div>// ReadLine 通过调用 ReadSlice 方法实现，返回的也是缓存的切片</div><div>// ReadLine 尝试返回一个单行数据，不包括行尾标记（\n 或 \r\n）</div><div>// 如果在缓存中找不到行尾标记，则设置 isPrefix 为 true，表示查找未完成</div><div>// 同时读出缓存中的数据并作为切片返回</div><div>// 只有在当前缓存中找到行尾标记，才将 isPrefix 设置为 false，表示查找完成</div><div>// 可以多次调用 ReadLine 来读出一行</div><div>// 返回的数据在下一次读取操作之前是有效的</div><div>// 如果 ReadLine 无法获取任何数据，则返回一个错误信息（通常是 io.EOF）</div><div>func (b *Reader) ReadLine() (line []byte, isPrefix bool, err error)</div><div></div><div>func main() {</div><div><span style="white-space:pre">	</span>s := strings.NewReader("ABC\nDEF\r\nGHI\r\nJKL")</div><div><span style="white-space:pre">	</span>br := bufio.NewReader(s)</div><div></div><div><span style="white-space:pre">	</span>w, isPrefix, _ := br.ReadLine()</div><div><span style="white-space:pre">	</span>fmt.Printf("%q %v\n", w, isPrefix)</div><div><span style="white-space:pre">	</span>// "ABC" false</div><div></div><div><span style="white-space:pre">	</span>w, isPrefix, _ = br.ReadLine()</div><div><span style="white-space:pre">	</span>fmt.Printf("%q %v\n", w, isPrefix)</div><div><span style="white-space:pre">	</span>// "DEF" false</div><div></div><div><span style="white-space:pre">	</span>w, isPrefix, _ = br.ReadLine()</div><div><span style="white-space:pre">	</span>fmt.Printf("%q %v\n", w, isPrefix)</div><div><span style="white-space:pre">	</span>// "GHI" false</div><div>}</div><div></div><div>------------------------------------------------------------</div><div></div><div>// ReadBytes 在 b 中查找 delim 并读出 delim 及其之前的所有数据</div><div>// 如果 ReadBytes 在找到 delim 之前遇到错误</div><div>// 则返回遇到错误之前的所有数据，同时返回遇到的错误（通常是 io.EOF）</div><div>// 只有当 ReadBytes 找不到 delim 时，err 才不为 nil</div><div>// 对于简单的用途，使用 Scanner 可能更方便</div><div>func (b *Reader) ReadBytes(delim byte) (line []byte, err error)</div><div></div><div>func main() {</div><div><span style="white-space:pre">	</span>s := strings.NewReader("ABC DEF GHI JKL")</div><div><span style="white-space:pre">	</span>br := bufio.NewReader(s)</div><div></div><div><span style="white-space:pre">	</span>w, _ := br.ReadBytes(' ')</div><div><span style="white-space:pre">	</span>fmt.Printf("%q\n", w)</div><div><span style="white-space:pre">	</span>// "ABC "</div><div></div><div><span style="white-space:pre">	</span>w, _ = br.ReadBytes(' ')</div><div><span style="white-space:pre">	</span>fmt.Printf("%q\n", w)</div><div><span style="white-space:pre">	</span>// "DEF "</div><div></div><div><span style="white-space:pre">	</span>w, _ = br.ReadBytes(' ')</div><div><span style="white-space:pre">	</span>fmt.Printf("%q\n", w)</div><div><span style="white-space:pre">	</span>// "GHI "</div><div>}</div><div></div><div>------------------------------------------------------------</div><div></div><div>// ReadString 功能同 ReadBytes，只不过返回的是一个字符串</div><div>func (b *Reader) ReadString(delim byte) (line string, err error)</div><div></div><div>func main() {</div><div><span style="white-space:pre">	</span>s := strings.NewReader("ABC DEF GHI JKL")</div><div><span style="white-space:pre">	</span>br := bufio.NewReader(s)</div><div></div><div><span style="white-space:pre">	</span>w, _ := br.ReadString(' ')</div><div><span style="white-space:pre">	</span>fmt.Printf("%q\n", w)</div><div><span style="white-space:pre">	</span>// "ABC "</div><div></div><div><span style="white-space:pre">	</span>w, _ = br.ReadString(' ')</div><div><span style="white-space:pre">	</span>fmt.Printf("%q\n", w)</div><div><span style="white-space:pre">	</span>// "DEF "</div><div></div><div><span style="white-space:pre">	</span>w, _ = br.ReadString(' ')</div><div><span style="white-space:pre">	</span>fmt.Printf("%q\n", w)</div><div><span style="white-space:pre">	</span>// "GHI "</div><div>}</div><div></div><div>------------------------------------------------------------</div><div></div><div>// WriteTo 实现了 io.WriterTo 接口</div><div>func (b *Reader) WriteTo(w io.Writer) (n int64, err error)</div><div></div><div>func main() {</div><div><span style="white-space:pre">	</span>s := strings.NewReader("ABCEFG")</div><div><span style="white-space:pre">	</span>br := bufio.NewReader(s)</div><div><span style="white-space:pre">	</span>b := bytes.NewBuffer(make([]byte, 0))</div><div></div><div><span style="white-space:pre">	</span>br.WriteTo(b)</div><div><span style="white-space:pre">	</span>fmt.Printf("%s\n", b)</div><div><span style="white-space:pre">	</span>// ABCEFG</div><div>}</div><div></div><div>------------------------------------------------------------</div><div></div><div>// Writer 实现了带缓存的 io.Writer 对象</div><div>// 如果在向 Writer 中写入数据的过程中遇到错误</div><div>// 则 Writer 不会再接受任何数据</div><div>// 而且后续的写入操作都将返回错误信息</div><div>type Writer struct {</div><div><span style="white-space:pre">	</span>// 私有字段</div><div>}</div><div></div><div>// NewWriterSize 将 wr 封装成一个拥有 size 大小缓存的 bufio.Writer 对象</div><div>// 如果 wr 的基类型就是 bufio.Writer 类型，而且拥有足够的缓存</div><div>// 则直接将 wr 转换为基类型并返回</div><div>func NewWriterSize(wr io.Writer, size int) *Writer</div><div></div><div>// NewWriter 相当于 NewWriterSize(wr, 4096)</div><div>func NewWriter(wr io.Writer) *Writer</div><div></div><div>------------------------------------------------------------</div><div></div><div>// Flush 将缓存中的数据提交到底层的 io.Writer 中</div><div>func (b *Writer) Flush() error</div><div></div><div>// Available 返回缓存中的可以空间</div><div>func (b *Writer) Available() int</div><div></div><div>// Buffered 返回缓存中未提交的数据长度</div><div>func (b *Writer) Buffered() int</div><div></div><div>// Write 将 p 中的数据写入 b 中，返回写入的字节数</div><div>// 如果写入的字节数小于 p 的长度，则返回一个错误信息</div><div>func (b *Writer) Write(p []byte) (nn int, err error)</div><div></div><div>// WriteString 同 Write，只不过写入的是字符串</div><div>func (b *Writer) WriteString(s string) (int, error)</div><div></div><div>func main() {</div><div><span style="white-space:pre">	</span>b := bytes.NewBuffer(make([]byte, 0))</div><div><span style="white-space:pre">	</span>bw := bufio.NewWriter(b)</div><div><span style="white-space:pre">	</span>fmt.Println(bw.Available()) // 4096</div><div><span style="white-space:pre">	</span>fmt.Println(bw.Buffered()) &nbsp;// 0</div><div></div><div><span style="white-space:pre">	</span>bw.WriteString("ABCDEFGH")</div><div><span style="white-space:pre">	</span>fmt.Println(bw.Available()) // 4088</div><div><span style="white-space:pre">	</span>fmt.Println(bw.Buffered()) &nbsp;// 8</div><div><span style="white-space:pre">	</span>fmt.Printf("%q\n", b) &nbsp; &nbsp; &nbsp; // ""</div><div></div><div><span style="white-space:pre">	</span>bw.Flush()</div><div><span style="white-space:pre">	</span>fmt.Println(bw.Available()) // 4096</div><div><span style="white-space:pre">	</span>fmt.Println(bw.Buffered()) &nbsp;// 0</div><div><span style="white-space:pre">	</span>fmt.Printf("%q\n", b) &nbsp; &nbsp; &nbsp; // "ABCEFG"</div><div>}</div><div></div><div>------------------------------------------------------------</div><div></div><div>// WriteByte 向 b 中写入一个字节</div><div>func (b *Writer) WriteByte(c byte) error</div><div></div><div>// WriteRune 向 b 中写入 r 的 UTF8 编码</div><div>// 返回 r 的编码长度</div><div>func (b *Writer) WriteRune(r rune) (size int, err error)</div><div></div><div>func main() {</div><div><span style="white-space:pre">	</span>b := bytes.NewBuffer(make([]byte, 0))</div><div><span style="white-space:pre">	</span>bw := bufio.NewWriter(b)</div><div><span style="white-space:pre">	</span>bw.WriteByte('H')</div><div><span style="white-space:pre">	</span>bw.WriteByte('e')</div><div><span style="white-space:pre">	</span>bw.WriteByte('l')</div><div><span style="white-space:pre">	</span>bw.WriteByte('l')</div><div><span style="white-space:pre">	</span>bw.WriteByte('o')</div><div><span style="white-space:pre">	</span>bw.WriteByte(' ')</div><div><span style="white-space:pre">	</span>bw.WriteRune('世')</div><div><span style="white-space:pre">	</span>bw.WriteRune('界')</div><div><span style="white-space:pre">	</span>bw.WriteRune('！')</div><div><span style="white-space:pre">	</span>bw.Flush()</div><div><span style="white-space:pre">	</span>fmt.Println(b) // Hello 世界！</div><div>}</div><div></div><div>------------------------------------------------------------</div><div></div><div>// ReadFrom 实现了 io.ReaderFrom 接口</div><div>func (b *Writer) ReadFrom(r io.Reader) (n int64, err error)</div><div></div><div>func main() {</div><div><span style="white-space:pre">	</span>b := bytes.NewBuffer(make([]byte, 0))</div><div><span style="white-space:pre">	</span>s := strings.NewReader("Hello 世界！")</div><div><span style="white-space:pre">	</span>bw := bufio.NewWriter(b)</div><div><span style="white-space:pre">	</span>bw.ReadFrom(s)</div><div><span style="white-space:pre">	</span>bw.Flush()</div><div><span style="white-space:pre">	</span>fmt.Println(b) // Hello 世界！</div><div>}</div><div></div><div>------------------------------------------------------------</div><div></div><div>// ReadWriter 集成了 bufio.Reader 和 bufio.Writer</div><div>// 它实现了 io.ReadWriter 接口</div><div>type ReadWriter struct {</div><div><span style="white-space:pre">	</span>*Reader</div><div><span style="white-space:pre">	</span>*Writer</div><div>}</div><div></div><div>// NewReadWriter 封装 r 和 w 为一个 bufio.ReadWriter 对象</div><div>func NewReadWriter(r *Reader, w *Writer) *ReadWriter</div><div></div><div>------------------------------------------------------------</div><div></div><div>// scan.go</div><div></div><div>------------------------------------------------------------</div><div></div><div>// Scanner 提供了一个方便的接口来读取数据，例如读取一个多行文本</div><div>// 连续调用 Scan 方法将扫描数据中的&#8220;指定部分&#8221;，跳过各个&#8220;指定部分&#8221;之间的数据</div><div>// Scanner 使用了缓存，所以&#8220;指定部分&#8221;的长度不能超出缓存的长度</div><div>// Scanner 需要一个 SplitFunc 类型的&#8220;切分函数&#8221;来确定&#8220;指定部分&#8221;的格式</div><div>// 本包中提供的&#8220;切分函数&#8221;有&#8220;行切分函数&#8221;、&#8220;字节切分函数&#8221;、&#8220;UTF8字符编码切分函数&#8221;</div><div>// 和&#8220;单词切分函数&#8221;，用户也可以自定义&#8220;切分函数&#8221;</div><div>// 默认的&#8220;切分函数&#8221;为&#8220;行切分函数&#8221;，用于获取数据中的一行数据（不包括行尾符）</div><div>//</div><div>// 扫描在遇到下面的情况时会停止：</div><div>// 1、数据扫描完毕，遇到 io.EOF</div><div>// 2、遇到读写错误</div><div>// 3、&#8220;指定部分&#8221;的长度超过了缓存的长度</div><div>// 如果要对数据进行更多的控制，比如的错误处理或扫描更大的&#8220;指定部分&#8221;或顺序扫描</div><div>// 则应该使用 bufio.Reader</div><div>type Scanner struct {</div><div><span style="white-space:pre">	</span>// 私有字段</div><div>}</div><div></div><div>// SplitFunc 用来定义&#8220;切分函数&#8221;类型</div><div>// data 是要扫描的数据</div><div>// atEOF 标记底层 io.Reader 中的数据是否已经读完</div><div>// advance 返回 data 中已处理的数据长度</div><div>// token 返回找到的&#8220;指定部分&#8221;</div><div>// err 返回错误信息</div><div>// 如果在 data 中无法找到一个完整的&#8220;指定部分&#8221;</div><div>// 则 SplitFunc 返回 (0, nil) 来告诉 Scanner</div><div>// 向缓存中填充更多数据，然后再次扫描</div><div>//</div><div>// 如果返回的 err 是非 nil 值，扫描将被终止，并返回错误信息</div><div>//</div><div>// 如果 data 为空，则&#8220;切分函数&#8221;将不被调用</div><div>// 意思是在 SplitFunc 中不必考虑 data 为空的情况</div><div>//</div><div>// SplitFunc 的作用很简单，从 data 中找出你感兴趣的数据，然后返回</div><div>// 并告诉调用者，data 中有多少数据你已经处理过了</div><div>type SplitFunc func(data []byte, atEOF bool) (advance int, token []byte, err error)</div><div></div><div>// NewScanner 创建一个 Scanner 来扫描 r</div><div>// 默认切分函数为 ScanLines</div><div>func NewScanner(r io.Reader) *Scanner</div><div></div><div>// Err 返回扫描过程中遇到的非 EOF 错误</div><div>// 供用户调用，以便获取错误信息</div><div>func (s *Scanner) Err() error</div><div></div><div>------------------------------------------------------------</div><div></div><div>// Bytes 将最后一次扫描出的&#8220;指定部分&#8221;作为一个切片返回（引用传递）</div><div>// 下一次的 Scan 操作会覆盖本次返回的结果</div><div>func (s *Scanner) Bytes() []byte</div><div></div><div>// Text 将最后一次扫描出的&#8220;指定部分&#8221;作为字符串返回（值传递）</div><div>func (s *Scanner) Text() string</div><div></div><div>------------------------------------------------------------</div><div></div><div>// Scan 在 Scanner 的数据中扫描&#8220;指定部分&#8221;</div><div>// 找到后，用户可以通过 Bytes 或 Text 方法来取出&#8220;指定部分&#8221;</div><div>// 如果扫描过程中遇到错误，则终止扫描，并返回 false</div><div>func (s *Scanner) Scan() bool</div><div></div><div>func main() {</div><div><span style="white-space:pre">	</span>s := strings.NewReader("ABC\nDEF\r\nGHI\nJKL")</div><div><span style="white-space:pre">	</span>bs := bufio.NewScanner(s)</div><div><span style="white-space:pre">	</span>for bs.Scan() {</div><div><span style="white-space:pre">		</span>fmt.Printf("%s %v\n", bs.Bytes(), bs.Text())</div><div><span style="white-space:pre">	</span>}</div><div><span style="white-space:pre">	</span>// ABC ABC</div><div><span style="white-space:pre">	</span>// DEF DEF</div><div><span style="white-space:pre">	</span>// GHI GHI</div><div><span style="white-space:pre">	</span>// JKL JKL</div><div>}</div><div></div><div>------------------------------------------------------------</div><div></div><div>// Split 用于设置 Scanner 的&#8220;切分函数&#8221;</div><div>// 这个函数必须在调用 Scan 前执行</div><div>func (s *Scanner) Split(split SplitFunc)</div><div></div><div>func main() {</div><div><span style="white-space:pre">	</span>s := strings.NewReader("ABC DEF GHI JKL")</div><div><span style="white-space:pre">	</span>bs := bufio.NewScanner(s)</div><div><span style="white-space:pre">	</span>bs.Split(bufio.ScanWords)</div><div><span style="white-space:pre">	</span>for bs.Scan() {</div><div><span style="white-space:pre">		</span>fmt.Println(bs.Text())</div><div><span style="white-space:pre">	</span>}</div><div><span style="white-space:pre">	</span>// ABC</div><div><span style="white-space:pre">	</span>// DEF</div><div><span style="white-space:pre">	</span>// GHI</div><div><span style="white-space:pre">	</span>// JKL</div><div>}</div><div></div><div>------------------------------------------------------------</div><div></div><div>// ScanBytes 是一个&#8220;切分函数&#8221;</div><div>// 用来找出 data 中的单个字节并返回</div><div>func ScanBytes(data []byte, atEOF bool) (advance int, token []byte, err error)</div><div></div><div>func main() {</div><div><span style="white-space:pre">	</span>s := strings.NewReader("Hello 世界！")</div><div><span style="white-space:pre">	</span>bs := bufio.NewScanner(s)</div><div><span style="white-space:pre">	</span>bs.Split(bufio.ScanBytes)</div><div><span style="white-space:pre">	</span>for bs.Scan() {</div><div><span style="white-space:pre">		</span>fmt.Printf("%s ", bs.Text())</div><div><span style="white-space:pre">	</span>}</div><div>}</div><div></div><div>------------------------------------------------------------</div><div></div><div>// ScanRunes 是一个&#8220;切分函数&#8221;</div><div>// 用来找出 data 中的单个 UTF8 字符的编码并返回</div><div>// 如果 UTF8 解码出错，则返回的 U+FFFD 会被做为 "\xef\xbf\xbd" 返回</div><div>// 这使得用户无法区分&#8220;真正的U+FFFD字符&#8221;和&#8220;解码错误的返回值&#8221;</div><div>func ScanRunes(data []byte, atEOF bool) (advance int, token []byte, err error)</div><div></div><div>func main() {</div><div><span style="white-space:pre">	</span>s := strings.NewReader("Hello 世界！")</div><div><span style="white-space:pre">	</span>bs := bufio.NewScanner(s)</div><div><span style="white-space:pre">	</span>bs.Split(bufio.ScanRunes)</div><div><span style="white-space:pre">	</span>for bs.Scan() {</div><div><span style="white-space:pre">		</span>fmt.Printf("%s ", bs.Text())</div><div><span style="white-space:pre">	</span>} // H e l l o &nbsp; 世 界 ！</div><div>}</div><div></div><div>------------------------------------------------------------</div><div></div><div>// ScanLines 是一个&#8220;切分函数&#8221;</div><div>// 用来找出 data 中的单行数据并返回（包括空行）</div><div>// 行尾标记可能是 \n 或 \r\n（返回值不包括行尾标记）</div><div>func ScanLines(data []byte, atEOF bool) (advance int, token []byte, err error)</div><div></div><div>------------------------------------------------------------</div><div></div><div>// ScanWords 是一个&#8220;切分函数&#8221;</div><div>// 用来找出 data 中的单词</div><div>// 单词以空白字符分隔，空白字符由 unicode.IsSpace 定义</div><div>func ScanWords(data []byte, atEOF bool) (advance int, token []byte, err error)</div><div></div><img src ="http://www.blogjava.net/oathleo/aggbug/403714.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2013-09-05 16:01 <a href="http://www.blogjava.net/oathleo/archive/2013/09/05/403714.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Golang 类型转换整理</title><link>http://www.blogjava.net/oathleo/archive/2013/08/30/403491.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Fri, 30 Aug 2013 03:37:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2013/08/30/403491.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/403491.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2013/08/30/403491.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/403491.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/403491.html</trackback:ping><description><![CDATA[<div style="margin: 5px 0px; font-size: 20px; line-height: 30px; font-family: 'Microsoft YaHei'; background-color: #ffffff;">&nbsp;<h3><a href="http://blog.csdn.net/wh_luosangnanka5/article/details/9664959" style="color: #000000; text-decoration: none;">Golang 类型转换整理</a></h3></div><div style="padding-top: 5px; padding-bottom: 5px; color: #999999; font-size: 12px; line-height: 24px; font-family: Arial; text-align: right; background-color: #ffffff;"><span style="margin: 0px 5px; float: left;">分类：&nbsp;<a href="http://blog.csdn.net/wh_luosangnanka5/article/category/1506687" style="color: #ca0000; text-decoration: none;">Go</a></span><span style="margin: 0px 5px 0px 0px;">2013-07-31 11:02</span>&nbsp;<span title="阅读次数" style="margin: 0px 5px; padding: 0px 0px 0px 14px; background-image: url(http://static.blog.csdn.net/images/ico_view.png); background-position: 0% 50%; background-repeat: no-repeat no-repeat;">177人阅读</span>&nbsp;<span title="评论次数" style="margin: 0px 5px; padding: 0px 0px 0px 14px; background-image: url(http://static.blog.csdn.net/images/ico_comm.png); background-position: 0% 50%; background-repeat: no-repeat no-repeat;"><a href="http://blog.csdn.net/wh_luosangnanka5/article/details/9664959#comments" style="color: #ca0000; text-decoration: none;">评论</a>(0)</span>&nbsp;<span style="margin: 0px 5px;"><a title="收藏" style="color: #ca0000;">收藏</a></span>&nbsp;<span style="margin: 0px 5px;"><a href="http://blog.csdn.net/wh_luosangnanka5/article/details/9664959#report" title="举报" style="color: #ca0000; text-decoration: none;">举报</a></span></div><div style="margin: 10px 0px; font-family: Arial, Console, Verdana, 'Courier New'; font-size: 12px; line-height: normal; background-color: #ffffff;"><a href="http://blog.csdn.net/tag/details.html?tag=golang" target="_blank" style="color: #ca0000; text-decoration: none; display: inline-block; padding: 4px 10px; line-height: 12px; margin-right: 10px; border: 1px solid #eeeeee; background-color: #eeeeee; border-top-left-radius: 10px; border-top-right-radius: 10px; border-bottom-right-radius: 10px; border-bottom-left-radius: 10px;">golang</a><a href="http://blog.csdn.net/tag/details.html?tag=String" target="_blank" style="color: #ca0000; text-decoration: none; display: inline-block; padding: 4px 10px; line-height: 12px; margin-right: 10px; border: 1px solid #eeeeee; background-color: #eeeeee; border-top-left-radius: 10px; border-top-right-radius: 10px; border-bottom-right-radius: 10px; border-bottom-left-radius: 10px;">String</a></div><div id="article_content" style="margin: 20px 0px 0px; line-height: 26px; font-family: Arial; background-color: #ffffff;">1、整形到字符串：<br />&nbsp; &nbsp;&nbsp;<div bg_plain"="" style="width: 982.078125px;"><div><div><strong>[plain]</strong>&nbsp;<a href="http://blog.csdn.net/wh_luosangnanka5/article/details/9664959#" title="view plain" style="background-image: url(http://static.blog.csdn.net/scripts/SyntaxHighlighter/styles/images/default/ico_plain.gif); padding: 1px; display: inline-block; width: 16px; height: 16px; text-indent: -2000px; background-position: 0% 0%; background-repeat: no-repeat no-repeat;">view plain</a><a href="http://blog.csdn.net/wh_luosangnanka5/article/details/9664959#" title="copy" style="background-image: url(http://static.blog.csdn.net/scripts/SyntaxHighlighter/styles/images/default/ico_copy.gif); padding: 1px; display: inline-block; width: 16px; height: 16px; text-indent: -2000px; background-position: 0% 0%; background-repeat: no-repeat no-repeat;">copy</a><div style="position: absolute; left: 376px; top: 507px; width: 18px; height: 18px; z-index: 99;"></div></div></div><ol start="1"><li style="line-height: 18px;">var&nbsp;i&nbsp;int&nbsp;=&nbsp;1&nbsp;&nbsp;</li><li style="line-height: 18px;">var&nbsp;s&nbsp;string&nbsp;&nbsp;</li></ol></div><div bg_plain"="" style="width: 982.078125px;"><div><div><strong>[plain]</strong>&nbsp;<a href="http://blog.csdn.net/wh_luosangnanka5/article/details/9664959#" title="view plain" style="background-image: url(http://static.blog.csdn.net/scripts/SyntaxHighlighter/styles/images/default/ico_plain.gif); padding: 1px; display: inline-block; width: 16px; height: 16px; text-indent: -2000px; background-position: 0% 0%; background-repeat: no-repeat no-repeat;">view plain</a><a href="http://blog.csdn.net/wh_luosangnanka5/article/details/9664959#" title="copy" style="background-image: url(http://static.blog.csdn.net/scripts/SyntaxHighlighter/styles/images/default/ico_copy.gif); padding: 1px; display: inline-block; width: 16px; height: 16px; text-indent: -2000px; background-position: 0% 0%; background-repeat: no-repeat no-repeat;">copy</a><div style="position: absolute; left: 376px; top: 594px; width: 18px; height: 18px; z-index: 99;"></div></div></div><ol start="1"><li style="line-height: 18px;">s&nbsp;=&nbsp;strconv.Itoa(i)&nbsp;或者&nbsp;s&nbsp;=&nbsp;FormatInt(int64(i),&nbsp;10)&nbsp;&nbsp;</li></ol></div><br />2、字符串到整形<br />&nbsp; &nbsp;&nbsp;<div bg_plain"="" style="width: 982.078125px;"><div><div><strong>[plain]</strong>&nbsp;<a href="http://blog.csdn.net/wh_luosangnanka5/article/details/9664959#" title="view plain" style="background-image: url(http://static.blog.csdn.net/scripts/SyntaxHighlighter/styles/images/default/ico_plain.gif); padding: 1px; display: inline-block; width: 16px; height: 16px; text-indent: -2000px; background-position: 0% 0%; background-repeat: no-repeat no-repeat;">view plain</a><a href="http://blog.csdn.net/wh_luosangnanka5/article/details/9664959#" title="copy" style="background-image: url(http://static.blog.csdn.net/scripts/SyntaxHighlighter/styles/images/default/ico_copy.gif); padding: 1px; display: inline-block; width: 16px; height: 16px; text-indent: -2000px; background-position: 0% 0%; background-repeat: no-repeat no-repeat;">copy</a><div style="position: absolute; left: 376px; top: 759px; width: 18px; height: 18px; z-index: 99;"></div></div></div><ol start="1"><li style="line-height: 18px;">var&nbsp;s&nbsp;string&nbsp;=&nbsp;"1"&nbsp;&nbsp;</li><li style="line-height: 18px;">var&nbsp;i&nbsp;int&nbsp;&nbsp;</li><li style="line-height: 18px;">i,&nbsp;err&nbsp;=&nbsp;strconv.Atoi(s)&nbsp;或者&nbsp;i,&nbsp;err&nbsp;=&nbsp;ParseInt(s,&nbsp;10,&nbsp;0)&nbsp;&nbsp;</li></ol></div><br />3、字符串到float(32 / 64)<br />&nbsp; &nbsp;&nbsp;<div bg_plain"="" style="width: 982.078125px;"><div><div><strong>[plain]</strong>&nbsp;<a href="http://blog.csdn.net/wh_luosangnanka5/article/details/9664959#" title="view plain" style="background-image: url(http://static.blog.csdn.net/scripts/SyntaxHighlighter/styles/images/default/ico_plain.gif); padding: 1px; display: inline-block; width: 16px; height: 16px; text-indent: -2000px; background-position: 0% 0%; background-repeat: no-repeat no-repeat;">view plain</a><a href="http://blog.csdn.net/wh_luosangnanka5/article/details/9664959#" title="copy" style="background-image: url(http://static.blog.csdn.net/scripts/SyntaxHighlighter/styles/images/default/ico_copy.gif); padding: 1px; display: inline-block; width: 16px; height: 16px; text-indent: -2000px; background-position: 0% 0%; background-repeat: no-repeat no-repeat;">copy</a><div style="position: absolute; left: 376px; top: 960px; width: 18px; height: 18px; z-index: 99;"></div></div></div><ol start="1"><li style="line-height: 18px;">var&nbsp;s&nbsp;string&nbsp;=&nbsp;1&nbsp;&nbsp;</li><li style="line-height: 18px;">var&nbsp;f&nbsp;float32&nbsp;&nbsp;</li><li style="line-height: 18px;">f,&nbsp;err&nbsp;=&nbsp;ParseFloat(s,&nbsp;32)&nbsp;&nbsp;</li></ol></div><p style="margin: 0px; padding: 0px;"><br /></p><p style="margin: 0px; padding: 0px;">&nbsp;float 64的时候将上面函数中的32转为64即可</p><br />4、整形到float或者float到整形<br />&nbsp; &nbsp; 直接使用float(i) 或者 int(f) 直接进行转换即可</div><img src ="http://www.blogjava.net/oathleo/aggbug/403491.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2013-08-30 11:37 <a href="http://www.blogjava.net/oathleo/archive/2013/08/30/403491.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>golang strconv</title><link>http://www.blogjava.net/oathleo/archive/2013/08/30/403488.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Fri, 30 Aug 2013 03:26:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2013/08/30/403488.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/403488.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2013/08/30/403488.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/403488.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/403488.html</trackback:ping><description><![CDATA[<div clearfix"="" style="zoom: 1; padding: 21px 20px 13px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: #e2e2e2;"><h2>golang strconv</h2></div><div id="content" mod-cs-content="" text-content=""  clearfix"="" style="zoom: 1; width: 760px; overflow: visible; line-height: 1.5; margin: 7px 0px 10px; padding: 20px;"><p style="margin: 0px; padding: 0px; color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////<br /></p><p style="margin: 0px; padding: 0px; color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;"><br /></p><p style="margin: 0px; padding: 0px; color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">a:=strconv.FormatFloat(10.100,'f',-1,32)</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">输出:</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">10.1</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">a&nbsp;:=&nbsp;strconv.FormatFloat(10.101,&nbsp;'f',&nbsp;-1,&nbsp;64)</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">输出:</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">10.101</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">a&nbsp;:=&nbsp;strconv.FormatFloat(10.010,&nbsp;'f',&nbsp;-1,&nbsp;64)</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">输出：10.01</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">a:=strconv.FormatFloat(10.1,'f',2,64)</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">输出:10.10</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;"><br /></p><p style="margin: 0px; padding: 0px; color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">f&nbsp;参数可以时e,E,g,G</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">-1&nbsp;代表输出的精度小数点后的位数，如果是&lt;0的值，则返回最少的位数来表示该数，如果是大于0的则返回对应位数的值</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">64&nbsp;为float的类型，go中float分为32和64位，因此就需要传入32或者64</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;"><br /></p><p style="margin: 0px; padding: 0px; color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;">//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;"><br /></p><p style="margin: 0px; padding: 0px; color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;"><span style="font-family: 'Microsoft Yahei', Arial; color: #333333; background-color: #fefefe;">golang&nbsp;strconv.ParseInt&nbsp;是将字符串转换为数字的函数,功能灰常之强大,看的我口水直流.</span><br /><br /><span style="font-family: 'Microsoft Yahei', Arial; color: #333333; background-color: #fefefe;">func&nbsp;ParseInt(s&nbsp;string,&nbsp;base&nbsp;int,&nbsp;bitSize&nbsp;int)&nbsp;(i&nbsp;int64,&nbsp;err&nbsp;error)</span><br /><br /><span style="font-family: 'Microsoft Yahei', Arial; color: #333333; background-color: #fefefe;">参数1&nbsp;数字的字符串形式</span><br /><br /><span style="font-family: 'Microsoft Yahei', Arial; color: #333333; background-color: #fefefe;">参数2&nbsp;数字字符串的进制&nbsp;比如二进制&nbsp;八进制&nbsp;十进制&nbsp;十六进制</span><br /><br /><span style="font-family: 'Microsoft Yahei', Arial; color: #333333; background-color: #fefefe;">参数3&nbsp;返回结果的bit大小&nbsp;也就是int8&nbsp;int16&nbsp;int32&nbsp;int64</span><br /><br /><span style="font-family: 'Microsoft Yahei', Arial; color: #333333; background-color: #fefefe;">代码:</span><br /></p><div style="color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;"><div>01package&nbsp;main</div><div>02&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div><div>03import&nbsp;(</div><div>04&nbsp;&nbsp;&nbsp;&nbsp;"strconv"</div><div>05)</div><div>06&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div><div>07func&nbsp;main()&nbsp;{</div><div>08&nbsp;&nbsp;&nbsp;&nbsp;i,&nbsp;err&nbsp;:=&nbsp;strconv.ParseInt("123",&nbsp;10,&nbsp;32)</div><div>09&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;err&nbsp;!=&nbsp;nil&nbsp;{</div><div>10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;panic(err)</div><div>11&nbsp;&nbsp;&nbsp;&nbsp;}</div><div>12&nbsp;&nbsp;&nbsp;&nbsp;println(i)</div><div>13}</div></div><p style="margin: 0px; padding: 0px; color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;"><br /></p></div><img src ="http://www.blogjava.net/oathleo/aggbug/403488.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2013-08-30 11:26 <a href="http://www.blogjava.net/oathleo/archive/2013/08/30/403488.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Pragma: no-cache 对性能的影响</title><link>http://www.blogjava.net/oathleo/archive/2013/08/27/403367.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Tue, 27 Aug 2013 07:29:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2013/08/27/403367.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/403367.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2013/08/27/403367.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/403367.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/403367.html</trackback:ping><description><![CDATA[做了下go和java的http性能的简单比较<br />服务端直接输出字符串<br />使用JMeter<br />windows下<br />&nbsp;<img src="file:///C:/Users/Leo/AppData/Roaming/Foxmail/FoxmailTemp(2)/Catch2C57.jpg"  alt="" /><img src="http://www.blogjava.net/images/blogjava_net/oathleo/1.jpg" border="0" alt="" width="1023" height="87" /><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/oathleo/2.jpg" border="0" alt="" width="1014" height="77" /><br /><br />2000的并发，测试结果很出乎意料，go不会这么差吧<br /><br /><br />研究了半小时，原因如下<br />tomcat的servlet里加了<span style="background-color: #eeeeee; font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.setHeader(</span><span style="background-color: #eeeeee; font-size: 13px;">"</span><span style="background-color: #eeeeee; font-size: 13px;">Pragma</span><span style="background-color: #eeeeee; font-size: 13px;">"</span><span style="background-color: #eeeeee; font-size: 13px;">,&nbsp;</span><span style="background-color: #eeeeee; font-size: 13px;">"</span><span style="background-color: #eeeeee; font-size: 13px;">no-cache</span><span style="background-color: #eeeeee; font-size: 13px;">"</span><span style="background-color: #eeeeee; font-size: 13px;">);<br /></span>go里没有设置该参数<br /><br />设置后重新跑测试<br /><img src="http://www.blogjava.net/images/blogjava_net/oathleo/33.jpg" border="0" alt="" width="1021" height="84" /><br /><br /><br />可以了吧<br /><br /><br /><br /><br /><img src ="http://www.blogjava.net/oathleo/aggbug/403367.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2013-08-27 15:29 <a href="http://www.blogjava.net/oathleo/archive/2013/08/27/403367.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>golang html 与 golang客户端 上传文件 转载</title><link>http://www.blogjava.net/oathleo/archive/2013/08/27/403336.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Tue, 27 Aug 2013 01:10:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2013/08/27/403336.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/403336.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2013/08/27/403336.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/403336.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/403336.html</trackback:ping><description><![CDATA[<h2>golang html 与 golang客户端 上传文件</h2>
<div style="color: #888888; font-size: 12px; line-height: 23px; margin: 1em 2px 2em; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: #fafafa; font-family: 'Droid Sans', Arial, Helvetica, sans-serif; background-color: #ffffff;"><em style="display: inline-block; width: 14px; height: 14px; line-height: 14px; vertical-align: text-top; background-image: url(http://www.sudochina.com/static/themes/nannie/img/glyphicons-halflings.png); margin-top: 1px; background-position: -192px -120px; background-repeat: no-repeat no-repeat;"></em>&nbsp;May 30 , 2013 at 08:30 am -&nbsp;<em style="display: inline-block; width: 16px; height: 14px; line-height: 14px; vertical-align: text-top; background-image: url(http://www.sudochina.com/static/themes/nannie/img/glyphicons-halflings.png); margin-top: 1px; background-position: -408px -120px; background-repeat: no-repeat no-repeat;"></em>&nbsp;<a href="http://www.sudochina.com/user/0/" title="View all posts in " rel="category tag" style="color: #666666; text-decoration: none;"></a>-&nbsp;<a href="http://www.sudochina.com/archives/1/4/117.html###" title="263个点击" style="color: #666666; text-decoration: none;">263点击</a>&nbsp;-&nbsp;<em style="display: inline-block; width: 14px; height: 14px; line-height: 14px; vertical-align: text-top; background-image: url(http://www.sudochina.com/static/themes/nannie/img/glyphicons-halflings.png); margin-top: 1px; background-position: -240px -120px; background-repeat: no-repeat no-repeat;"></em>&nbsp;<a href="http://www.sudochina.com/view/117#respond" title="0 个评论" style="color: #666666; text-decoration: none;">0 评论</a></div>
<div style="color: #555555; font-family: 'Droid Sans', Arial, Helvetica, sans-serif; font-size: 13px; line-height: 24px; background-color: #ffffff;">
<p style="margin-right: 0px; margin-left: 0px;"><strong><span style="font-size: 26px;">小文件上传</span></strong></p>
<p style="margin-right: 0px; margin-left: 0px;">&nbsp;<span style="color: #000000; background-color: #eeeeee;">var&nbsp;buffer&nbsp;bytes.Buffer</span></p><div style="background-color: #eeeeee; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><span style="color: #000000; ">w&nbsp;:</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;multipart.NewWriter(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">buffer)<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Write&nbsp;fields&nbsp;and&nbsp;files</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">w.CreateFormField(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">input1</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br />w.WriteField(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">input1</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,</span><span style="color: #000000; ">"</span><span style="color: #000000; ">value1</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br />w.CreateFormFile(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">file</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,</span><span style="color: #000000; ">"</span><span style="color: #000000; ">filename.dat</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br /><br />resp,err&nbsp;:</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;http.Post(url,w.FormDataContentType(),</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">buffer)</span></div>
<p style="margin-right: 0px; margin-left: 0px;"><br /></p><div style="background-color: #eeeeee; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">服务器的handler:<br /><br />func&nbsp;uploadHandler(w&nbsp;http.ResponseWriter,&nbsp;r&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">http.Request){<br /><br />&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;r.URL.Path</span><span style="color: #000000; ">==</span><span style="color: #000000; ">"</span><span style="color: #000000; ">/upload.go</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;{&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fn,header,err:</span><span style="color: #000000; ">=</span><span style="color: #000000; ">r.FormFile(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">file</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;defer&nbsp;fn.Close()<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f,err:</span><span style="color: #000000; ">=</span><span style="color: #000000; ">os.Create(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">filenametosaveas</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;defer&nbsp;f.Close()<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;io.Copy(f,fn)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />}<br /><br /><br />客户端代码：<br />func&nbsp;Upload()&nbsp;(err&nbsp;error)&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Create&nbsp;buffer</span><span style="color: #008000; "><br /></span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;buf&nbsp;:</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">(bytes.Buffer)&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;caveat&nbsp;IMO&nbsp;dont&nbsp;use&nbsp;this&nbsp;for&nbsp;large&nbsp;files,&nbsp;\<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;create&nbsp;a&nbsp;tmpfile&nbsp;and&nbsp;assemble&nbsp;your&nbsp;multipart&nbsp;from&nbsp;there&nbsp;(not&nbsp;tested)</span><span style="color: #008000; "><br /></span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;w&nbsp;:</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;multipart.NewWriter(buf)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Create&nbsp;file&nbsp;field</span><span style="color: #008000; "><br /></span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;fw,&nbsp;err&nbsp;:</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;w.CreateFormFile(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">file</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">helloworld.go</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">这里的file很重要，必须和服务器端的FormFile一致</span><span style="color: #008000; "><br /></span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;err&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;nil&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">c</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;err<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;fd,&nbsp;err&nbsp;:</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;os.Open(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">helloworld.go</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;err&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;nil&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">d</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;err<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;defer&nbsp;fd.Close()<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Write&nbsp;file&nbsp;field&nbsp;from&nbsp;file&nbsp;to&nbsp;upload</span><span style="color: #008000; "><br /></span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;_,&nbsp;err&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;io.Copy(fw,&nbsp;fd)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;err&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;nil&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">e</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;err<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Important&nbsp;if&nbsp;you&nbsp;do&nbsp;not&nbsp;close&nbsp;the&nbsp;multipart&nbsp;writer&nbsp;you&nbsp;will&nbsp;not&nbsp;have&nbsp;a<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;terminating&nbsp;boundry</span><span style="color: #008000; "><br /></span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;w.Close()<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;req,&nbsp;err&nbsp;:</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;http.NewRequest(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">POST</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,</span><span style="color: #000000; ">"</span><span style="color: #000000; ">http://192.168.2.127/configure.go?portId=2</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;buf)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;err&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;nil&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">f</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;err<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;req.Header.Set(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Content-Type</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;w.FormDataContentType())<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;client&nbsp;http.Client<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;res,&nbsp;err&nbsp;:</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;client.Do(req)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;err&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;nil&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">g</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;err<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;io.Copy(os.Stderr,&nbsp;res.Body)&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Replace&nbsp;this&nbsp;with&nbsp;Status.Code&nbsp;check</span><span style="color: #008000; "><br /></span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">h</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;err<br /><br />}</span></div><p style="margin-right: 0px; margin-left: 0px;"><br />html上传，<a href="http://www.congci.com/item/golang-upload-file" style="color: #1570a6; text-decoration: none;">原文<br /></a></p><div style="background-color: #eeeeee; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">package&nbsp;main<br /><br />import&nbsp;(<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">fmt</span><span style="color: #000000; ">"</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">io</span><span style="color: #000000; ">"</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">net/http</span><span style="color: #000000; ">"</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">log</span><span style="color: #000000; ">"</span><span style="color: #000000; "><br />)<br /><br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;获取大小的接口</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">type&nbsp;Sizer&nbsp;</span><span style="color: #0000FF; ">interface</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;Size()&nbsp;int64<br />}<br /><br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;hello&nbsp;world,&nbsp;the&nbsp;web&nbsp;server</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">func&nbsp;HelloServer(w&nbsp;http.ResponseWriter,&nbsp;r&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">http.Request)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">POST</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;r.Method&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file,&nbsp;_,&nbsp;err&nbsp;:</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;r.FormFile(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">file</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;err&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;nil&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http.Error(w,&nbsp;err.Error(),&nbsp;</span><span style="color: #000000; ">500</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;defer&nbsp;file.Close()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f,err:</span><span style="color: #000000; ">=</span><span style="color: #000000; ">os.Create(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">filenametosaveas</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;defer&nbsp;f.Close()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;io.Copy(f,file)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fmt.Fprintf(w,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">上传文件的大小为:&nbsp;%d</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;file.(Sizer).Size())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;上传页面</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;w.Header().Add(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Content-Type</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">text/html</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;w.WriteHeader(</span><span style="color: #000000; ">200</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;html&nbsp;:</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;`<br /></span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">form&nbsp;enctype</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">multipart/form-data</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;action</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">/hello</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;method</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">POST</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;Send&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">&nbsp;file:&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">input&nbsp;name</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">file</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;type</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">file</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">/&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">input&nbsp;type</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">submit</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;value</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Send&nbsp;File</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">/&gt;</span><span style="color: #000000; "><br /></span><span style="color: #000000; ">&lt;/</span><span style="color: #000000; ">form</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />`<br />&nbsp;&nbsp;&nbsp;&nbsp;io.WriteString(w,&nbsp;html)<br />}<br /><br />func&nbsp;main()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;http.HandleFunc(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">/hello</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;HelloServer)<br />&nbsp;&nbsp;&nbsp;&nbsp;err&nbsp;:</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;http.ListenAndServe(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:12345</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;nil)<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;err&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;nil&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.Fatal(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">ListenAndServe:&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;err)<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</span></div><p style="margin-right: 0px; margin-left: 0px;"><a href="http://www.congci.com/item/golang-upload-file" style="color: #1570a6; text-decoration: none;"><br /><br /></a></p>
<p style="margin-right: 0px; margin-left: 0px;"><strong><span style="font-size: 26px;">大文件上传</span></strong></p>
<p style="margin-right: 0px; margin-left: 0px;">关键的不同是<strong>io.MultiReader<br /><br /></strong></p><div style="background-color: #eeeeee; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">package&nbsp;main&nbsp;<br /><br />import&nbsp;(&nbsp;<br />&nbsp;&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">fmt</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;<br />&nbsp;&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">net/http</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;<br />&nbsp;&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">mime/multipart</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;<br />&nbsp;&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">bytes</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;<br />&nbsp;&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">os</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;<br />&nbsp;&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">io</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;<br />&nbsp;&nbsp;)&nbsp;<br /><br /><br />func&nbsp;postFile(filename&nbsp;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">,&nbsp;target_url&nbsp;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">)&nbsp;(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">http.Response,&nbsp;error)&nbsp;{&nbsp;<br />&nbsp;&nbsp;body_buf&nbsp;:</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;bytes.NewBufferString(</span><span style="color: #000000; ">""</span><span style="color: #000000; ">)&nbsp;<br />&nbsp;&nbsp;body_writer&nbsp;:</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;multipart.NewWriter(body_buf)&nbsp;<br /><br />&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;use&nbsp;the&nbsp;body_writer&nbsp;to&nbsp;write&nbsp;the&nbsp;Part&nbsp;headers&nbsp;to&nbsp;the&nbsp;buffer&nbsp;</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;_,&nbsp;err&nbsp;:</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;body_writer.CreateFormFile(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">upfile</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;filename)&nbsp;<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;err&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;nil&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">error&nbsp;writing&nbsp;to&nbsp;buffer</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;nil,&nbsp;err&nbsp;<br />&nbsp;&nbsp;}&nbsp;<br /><br />&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;the&nbsp;file&nbsp;data&nbsp;will&nbsp;be&nbsp;the&nbsp;second&nbsp;part&nbsp;of&nbsp;the&nbsp;body&nbsp;</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;fh,&nbsp;err&nbsp;:</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;os.Open(filename)&nbsp;<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;err&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;nil&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">error&nbsp;opening&nbsp;file</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;nil,&nbsp;err&nbsp;<br />&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;defer&nbsp;fh.Close()<br />&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;need&nbsp;to&nbsp;know&nbsp;the&nbsp;boundary&nbsp;to&nbsp;properly&nbsp;close&nbsp;the&nbsp;part&nbsp;myself.&nbsp;</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;boundary&nbsp;:</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;body_writer.Boundary()<br />&nbsp;&nbsp;close_string&nbsp;:</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;fmt.Sprintf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">\r\n--%s--\r\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;boundary)<br />&nbsp;&nbsp;close_buf&nbsp;:</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;bytes.NewBufferString(close_string)<br />&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;use&nbsp;multi-reader&nbsp;to&nbsp;defer&nbsp;the&nbsp;reading&nbsp;of&nbsp;the&nbsp;file&nbsp;data&nbsp;until&nbsp;writing&nbsp;to&nbsp;the&nbsp;socket&nbsp;buffer.&nbsp;</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;request_reader&nbsp;:</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;io.MultiReader(body_buf,&nbsp;fh,&nbsp;close_buf)&nbsp;<br />&nbsp;&nbsp;fi,&nbsp;err&nbsp;:</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;fh.Stat()&nbsp;<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;err&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;nil&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;fmt.Printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Error&nbsp;Stating&nbsp;file:&nbsp;%s</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;filename)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;nil,&nbsp;err&nbsp;<br />&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;req,&nbsp;err&nbsp;:</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;http.NewRequest(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">POST</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;target_url,&nbsp;request_reader)&nbsp;<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;err&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;nil&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;nil,&nbsp;err&nbsp;<br />&nbsp;&nbsp;}&nbsp;<br /><br />&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Set&nbsp;headers&nbsp;for&nbsp;multipart,&nbsp;and&nbsp;Content&nbsp;Length&nbsp;</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;req.Header.Add(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Content-Type</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">multipart/form-data;&nbsp;boundary=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;boundary)&nbsp;<br />&nbsp;&nbsp;req.ContentLength&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;fi.Size()</span><span style="color: #000000; ">+</span><span style="color: #000000; ">int64(body_buf.Len())</span><span style="color: #000000; ">+</span><span style="color: #000000; ">int64(close_buf.Len())&nbsp;<br /><br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;http.DefaultClient.Do(req)&nbsp;<br />}</span></div><p style="margin-right: 0px; margin-left: 0px;"><strong><br /><br /></strong></p>
</div><img src ="http://www.blogjava.net/oathleo/aggbug/403336.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2013-08-27 09:10 <a href="http://www.blogjava.net/oathleo/archive/2013/08/27/403336.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>golang string rune len 可能不同</title><link>http://www.blogjava.net/oathleo/archive/2013/08/19/403027.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Mon, 19 Aug 2013 03:31:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2013/08/19/403027.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/403027.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2013/08/19/403027.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/403027.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/403027.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->&nbsp; &nbsp; &nbsp; &nbsp; rune_str&nbsp;:=&nbsp;[]rune(info)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fmt.Print("rune_len:"&nbsp;,&nbsp;len(rune_str))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fmt.Print("string_len:"&nbsp;,&nbsp;len(info))</div><br /><div>string 和对应的 rune数组的len不一定相同</div><br />如果info是有中文的，则两个length是不一样的，做string处理的时候，要注意<br /><img src ="http://www.blogjava.net/oathleo/aggbug/403027.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2013-08-19 11:31 <a href="http://www.blogjava.net/oathleo/archive/2013/08/19/403027.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>golang xml 处理之生成 属性必须大写</title><link>http://www.blogjava.net/oathleo/archive/2013/08/16/402934.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Fri, 16 Aug 2013 07:53:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2013/08/16/402934.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/402934.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2013/08/16/402934.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/402934.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/402934.html</trackback:ping><description><![CDATA[xml对应的struct 属性必须大写，否则无法实现！<br />
Code是必须的<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->package&nbsp;main<br />
<br />
import&nbsp;(<br />
&nbsp;&nbsp;&nbsp;&nbsp;"encoding/xml"<br />
&nbsp;&nbsp;&nbsp;&nbsp;"fmt"<br />
&nbsp;&nbsp;&nbsp;&nbsp;"os"<br />
)<br />
<br />
type&nbsp;xmldas&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;XMLName&nbsp;&nbsp;xml.Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`xml:"das"`<br />
&nbsp;&nbsp;&nbsp;&nbsp;DataPort&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`xml:"DataPort,attr"`<br />
&nbsp;&nbsp;&nbsp;&nbsp;Desc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`xml:"desc,attr"`<br />
&nbsp;&nbsp;&nbsp;&nbsp;Src&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlsource&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`xml:"source"`<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dest&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmldestination&nbsp;`xml:"destination"`<br />
}<br />
<br />
type&nbsp;xmlsource&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;Path&nbsp;&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;`xml:"path,attr"`<br />
&nbsp;&nbsp;&nbsp;&nbsp;Param&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;`xml:"param,attr"`<br />
}<br />
<br />
type&nbsp;xmldestination&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;Path&nbsp;&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;`xml:"path,attr"`<br />
&nbsp;&nbsp;&nbsp;&nbsp;Param&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;`xml:"param,attr"`<br />
}<br />
<br />
func&nbsp;main()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;v&nbsp;:=&nbsp;xmldas{DataPort:&nbsp;"8250",&nbsp;Desc:&nbsp;"123"}<br />
&nbsp;&nbsp;&nbsp;&nbsp;v.Src&nbsp;=&nbsp;xmlsource{Path:&nbsp;"123",&nbsp;Param:&nbsp;"456"}<br />
&nbsp;&nbsp;&nbsp;&nbsp;v.Dest&nbsp;=&nbsp;xmldestination{Path:&nbsp;"789",&nbsp;Param:&nbsp;"000"}<br />
&nbsp;&nbsp;&nbsp;&nbsp;output,&nbsp;err&nbsp;:=&nbsp;xml.MarshalIndent(v,&nbsp;"&nbsp;&nbsp;",&nbsp;"&nbsp;&nbsp;&nbsp;&nbsp;")<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;err&nbsp;!=&nbsp;nil&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fmt.Printf("error:&nbsp;%v\n",&nbsp;err)<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;os.Stdout.Write([]<span style="color: #0000FF; ">byte</span>(xml.Header))<br />
&nbsp;&nbsp;&nbsp;&nbsp;os.Stdout.Write(output)<br />
}</div><img src ="http://www.blogjava.net/oathleo/aggbug/402934.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2013-08-16 15:53 <a href="http://www.blogjava.net/oathleo/archive/2013/08/16/402934.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>golang xml 处理</title><link>http://www.blogjava.net/oathleo/archive/2013/08/12/402704.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Mon, 12 Aug 2013 09:03:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2013/08/12/402704.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/402704.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2013/08/12/402704.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/402704.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/402704.html</trackback:ping><description><![CDATA[<span style="color: #333333; font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 15px; line-height: 25px; background-color: #ffffff;">将xml文件解析成对应的struct对象是通过</span><code style="font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12px; margin: 0px 2px; padding: 0px 5px; border: 1px solid #dddddd; background-color: #f8f8f8; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; white-space: nowrap; color: #333333;">xml.Unmarshal</code><span style="color: #333333; font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 15px; line-height: 25px; background-color: #ffffff;">来完成的，这个过程是如何实现的？可以看到我们的struct定义后面多了一些类似于</span><code style="font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12px; margin: 0px 2px; padding: 0px 5px; border: 1px solid #dddddd; background-color: #f8f8f8; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; white-space: nowrap; color: #333333;">xml:"serverName"</code><span style="color: #333333; font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 15px; line-height: 25px; background-color: #ffffff;">这样的内容,这个是struct的一个特性，它们被称为 struct tag，它们是用来辅助反射的。<br />
<br />
<br />
</span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->package&nbsp;main<br /><br />import&nbsp;(<br />&nbsp;&nbsp;&nbsp;&nbsp;"encoding/xml"<br />&nbsp;&nbsp;&nbsp;&nbsp;"fmt"<br />&nbsp;&nbsp;&nbsp;&nbsp;"os"<br />)<br /><br />type&nbsp;Servers&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;XMLName&nbsp;xml.Name&nbsp;`xml:"servers"`<br />&nbsp;&nbsp;&nbsp;&nbsp;Version&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;&nbsp;&nbsp;`xml:"version,attr"`<br />&nbsp;&nbsp;&nbsp;&nbsp;Svs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[]server&nbsp;`xml:"server"`<br />}<br /><br />type&nbsp;server&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;ServerName&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;`xml:"serverName"`<br />&nbsp;&nbsp;&nbsp;&nbsp;ServerIP&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;`xml:"serverIP"`<br />}<br /><br />func&nbsp;main()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;v&nbsp;:=&nbsp;&amp;Servers{Version:&nbsp;"1"}<br />&nbsp;&nbsp;&nbsp;&nbsp;v.Svs&nbsp;=&nbsp;append(v.Svs,&nbsp;server{"Shanghai_VPN",&nbsp;"127.0.0.1"})<br />&nbsp;&nbsp;&nbsp;&nbsp;v.Svs&nbsp;=&nbsp;append(v.Svs,&nbsp;server{"Beijing_VPN",&nbsp;"127.0.0.2"})<br />&nbsp;&nbsp;&nbsp;&nbsp;output,&nbsp;err&nbsp;:=&nbsp;xml.MarshalIndent(v,&nbsp;"&nbsp;&nbsp;",&nbsp;"&nbsp;&nbsp;&nbsp;&nbsp;")<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;err&nbsp;!=&nbsp;nil&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fmt.Printf("error:&nbsp;%v\n",&nbsp;err)<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;os.Stdout.Write([]<span style="color: #0000FF; ">byte</span>(xml.Header))<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;os.Stdout.Write(output)<br />}</div><span style="color: #333333; font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 15px; line-height: 25px; background-color: #ffffff;">
<br />
<br />
</span><img src ="http://www.blogjava.net/oathleo/aggbug/402704.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2013-08-12 17:03 <a href="http://www.blogjava.net/oathleo/archive/2013/08/12/402704.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>exec start</title><link>http://www.blogjava.net/oathleo/archive/2013/08/08/402538.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Thu, 08 Aug 2013 01:07:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2013/08/08/402538.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/402538.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2013/08/08/402538.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/402538.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/402538.html</trackback:ping><description><![CDATA[<h3>exec卡住了，阻塞调用肯定卡住了<br />调用Start<br /><br />func (*Cmd)&nbsp;<a href="http://golang.org/src/pkg/os/exec/exec.go?s=5901:5926#L218" style="color: #375eab; text-decoration: none;">Run</a></h3><pre style="font-family: Menlo, monospace; line-height: 18px; margin: 20px; background-color: #e9e9e9; padding: 10px; border-top-left-radius: 5px; border-top-right-radius: 5px; border-bottom-right-radius: 5px; border-bottom-left-radius: 5px; color: #222222;">func (c *<a href="http://golang.org/pkg/os/exec/#Cmd" style="color: #375eab; text-decoration: none;">Cmd</a>) Run() <a href="http://golang.org/pkg/builtin/#error" style="color: #375eab; text-decoration: none;">error</a></pre><p style="margin: 20px; color: #222222; font-family: Helvetica, Arial, sans-serif; font-size: 16.363636016845703px; line-height: normal;">Run starts the specified command and waits for it to complete.</p><p style="margin: 20px; color: #222222; font-family: Helvetica, Arial, sans-serif; font-size: 16.363636016845703px; line-height: normal;">The returned error is nil if the command runs, has no problems copying stdin, stdout, and stderr, and exits with a zero exit status.</p><p style="margin: 20px; color: #222222; font-family: Helvetica, Arial, sans-serif; font-size: 16.363636016845703px; line-height: normal;">If the command fails to run or doesn't complete successfully, the error is of type *ExitError. Other error types may be returned for I/O problems.</p><h3>func (*Cmd)&nbsp;<a href="http://golang.org/src/pkg/os/exec/exec.go?s=6076:6103#L226" style="color: #375eab; text-decoration: none;">Start</a></h3><pre style="font-family: Menlo, monospace; line-height: 18px; margin: 20px; background-color: #e9e9e9; padding: 10px; border-top-left-radius: 5px; border-top-right-radius: 5px; border-bottom-right-radius: 5px; border-bottom-left-radius: 5px; color: #222222;">func (c *<a href="http://golang.org/pkg/os/exec/#Cmd" style="color: #375eab; text-decoration: none;">Cmd</a>) Start() <a href="http://golang.org/pkg/builtin/#error" style="color: #375eab; text-decoration: none;">error</a></pre><p style="margin: 20px; color: #222222; font-family: Helvetica, Arial, sans-serif; font-size: 16.363636016845703px; line-height: normal;">Start starts the specified command but does not wait for it to complete.</p><img src ="http://www.blogjava.net/oathleo/aggbug/402538.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2013-08-08 09:07 <a href="http://www.blogjava.net/oathleo/archive/2013/08/08/402538.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Golang语法与代码格式速记</title><link>http://www.blogjava.net/oathleo/archive/2013/08/02/402316.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Fri, 02 Aug 2013 08:15:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2013/08/02/402316.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/402316.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2013/08/02/402316.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/402316.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/402316.html</trackback:ping><description><![CDATA[<pre style="line-height: normal;"><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Description:&nbsp;Golang语法与代码格式速记<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Author:&nbsp;cxy<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Date:&nbsp;2013-04-01<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Version:&nbsp;0.3<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;TODO&nbsp;说明<br /><br /><br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;TODO&nbsp;package<br /><br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Go是采用语法解析器自动在每行末尾增加分号，所以在写代码的时候可以把分号省略。<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Go编程中只有几个地方需要手工增加分号，如:&nbsp;for循环使用分号把初始化，条件和遍历元素分开。在一行中有多条语句时，需要增加分号。<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;不能把控制语句(if,&nbsp;for,&nbsp;switch,&nbsp;or&nbsp;select)、函数、方法&nbsp;的左大括号单独放在一行，&nbsp;如果你这样作了语法解析器会在大括号之前插入一个分号，导致编译错误。<br /><br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;引用包名与导入路径的最后一个目录一致</span><span style="color: #008000; "><br /></span>import&nbsp;"fmt"<br />import&nbsp;"math/rand"<br />fmt.Println(rand.Intn(10))&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;0到10之间的非负伪随机数<br /><br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;用圆括号组合导入包，这是&#8220;factored&#8221;导入语句</span><span style="color: #008000; "><br /></span>import&nbsp;("fmt";&nbsp;"math")<br />import&nbsp;(<br />&nbsp;&nbsp;&nbsp;&nbsp;"fmt"<br />&nbsp;&nbsp;&nbsp;&nbsp;"math"<br />)<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;导入包可以定义别名，防止同名称的包冲突</span><span style="color: #008000; "><br /></span>import&nbsp;n&nbsp;"net/http"<br />import&nbsp;(<br />&nbsp;&nbsp;&nbsp;&nbsp;控制台&nbsp;"fmt"<br />&nbsp;&nbsp;&nbsp;&nbsp;m&nbsp;"math"<br />)<br />控制台.Println(m.Pi)<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;首字母大写的名称是被导出的,&nbsp;首字母小写的名称只能在同一包内访问(同包跨文件也能访问)</span><span style="color: #008000; "><br /></span>var&nbsp;In&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;In&nbsp;is&nbsp;public</span><span style="color: #008000; "><br /></span>var&nbsp;<span style="color: #0000FF; ">in</span>&nbsp;<span style="color: #0000FF; ">byte</span>&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;in&nbsp;is&nbsp;private</span><span style="color: #008000; "><br /></span>var&nbsp;看不见&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;看不见&nbsp;is&nbsp;private</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">const</span>&nbsp;Com&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;=&nbsp;<span style="color: #0000FF; ">false</span>&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Com&nbsp;is&nbsp;public</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">const</span>&nbsp;还是看不见&nbsp;uint8&nbsp;=&nbsp;1&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;还是看不见&nbsp;is&nbsp;private</span><span style="color: #008000; "><br /></span>type&nbsp;Integer&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Integer&nbsp;is&nbsp;public</span><span style="color: #008000; "><br /></span>type&nbsp;ブーリアン&nbsp;*<span style="color: #0000FF; ">bool</span>&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;ブーリアン&nbsp;is&nbsp;private</span><span style="color: #008000; "><br /></span>func&nbsp;Export()&nbsp;{<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />}&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Export&nbsp;is&nbsp;public</span><span style="color: #008000; "><br /></span>func&nbsp;导入()&nbsp;{<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />}&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;导入&nbsp;is&nbsp;private</span><span style="color: #008000; "><br /></span>func&nbsp;(me&nbsp;*Integer)&nbsp;valueOf(s&nbsp;<span style="color: #0000FF; ">string</span>)&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;{<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />}&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;valueOf&nbsp;is&nbsp;private</span><span style="color: #008000; "><br /></span>func&nbsp;(i&nbsp;ブーリアン)&nbsp;String()&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;{<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />}&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;String&nbsp;is&nbsp;public<br /><br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Go&nbsp;的基本类型：</span><span style="color: #008000; "><br /></span>&#9484;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9516;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9516;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9516;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9516;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9516;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9488;<br />&#9474;&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;&#9474;&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;&nbsp;&#9474;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#9474;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#9474;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#9474;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#9474;<br />&#9500;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9532;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9532;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9532;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9532;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9532;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9508;<br />&#9474;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;&nbsp;&#9474;&nbsp;int8&nbsp;&nbsp;&nbsp;&nbsp;&#9474;&nbsp;int16&nbsp;&nbsp;&#9474;&nbsp;int32&nbsp;&nbsp;&nbsp;&#9474;&nbsp;int64&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#9474;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#9474;<br />&#9474;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#9474;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#9474;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#9474;&nbsp;rune&nbsp;&nbsp;&nbsp;&nbsp;&#9474;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#9474;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#9474;<br />&#9500;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9532;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9532;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9532;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9532;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9532;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9508;<br />&#9474;&nbsp;<span style="color: #0000FF; ">uint</span>&nbsp;&#9474;&nbsp;uint8&nbsp;&nbsp;&nbsp;&#9474;&nbsp;uint16&nbsp;&#9474;&nbsp;uint32&nbsp;&nbsp;&#9474;&nbsp;uint64&nbsp;&nbsp;&nbsp;&nbsp;&#9474;&nbsp;uintptr&nbsp;&nbsp;&nbsp;&nbsp;&#9474;<br />&#9474;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#9474;&nbsp;<span style="color: #0000FF; ">byte</span>&nbsp;&nbsp;&nbsp;&nbsp;&#9474;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#9474;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#9474;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#9474;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#9474;<br />&#9500;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9532;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9532;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9532;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9532;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9532;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9508;<br />&#9474;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#9474;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#9474;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#9474;&nbsp;float32&nbsp;&#9474;&nbsp;float64&nbsp;&nbsp;&nbsp;&#9474;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#9474;<br />&#9500;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9532;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9532;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9532;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9532;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9532;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9508;<br />&#9474;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#9474;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#9474;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#9474;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#9474;&nbsp;complex64&nbsp;&#9474;&nbsp;complex128&nbsp;&#9474;<br />&#9492;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9524;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9524;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9524;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9524;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9524;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9496;<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;byte&nbsp;是&nbsp;uint8&nbsp;的别名<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;rune&nbsp;是&nbsp;int32&nbsp;的别名，代表一个Unicode码点<br /><br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;变量声明,&nbsp;使用var关键字&nbsp;&nbsp;&nbsp;&nbsp;(Go中只能使用var声明变量，无需显式初始化值）</span><span style="color: #008000; "><br /></span>var&nbsp;i&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;i&nbsp;=&nbsp;0</span><span style="color: #008000; "><br /></span>var&nbsp;s&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;s&nbsp;=&nbsp;""&nbsp;&nbsp;&nbsp;&nbsp;(Go中的string不存在nil(null)值，默认零值就是空串&nbsp;""&nbsp;或&nbsp;``)</span><span style="color: #008000; "><br /></span>var&nbsp;e&nbsp;error&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;e&nbsp;=&nbsp;nil,&nbsp;error是Go的内建接口类型，不是基本类型。<br /><br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;var&nbsp;语句声明了一个变量的列表，类型在变量名之后</span><span style="color: #008000; "><br /></span>var&nbsp;a,b,c&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;a&nbsp;=&nbsp;0,&nbsp;b&nbsp;=&nbsp;0,&nbsp;c&nbsp;=&nbsp;0</span><span style="color: #008000; "><br /></span>var&nbsp;(<br />&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;a&nbsp;=&nbsp;0</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;b&nbsp;=&nbsp;""</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;<span style="color: #0000FF; ">uint</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;c&nbsp;=&nbsp;0</span><span style="color: #008000; "><br /></span>)<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;变量定义时初始化赋值，每个变量对应一个值</span><span style="color: #008000; "><br /></span>var&nbsp;a&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;=&nbsp;0<br />var&nbsp;a,b&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;=&nbsp;0,&nbsp;1<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;初始化使用表达式时，可以省略类型，变量从初始值中获得类型</span><span style="color: #008000; "><br /></span>var&nbsp;a&nbsp;=&nbsp;'A'&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;a&nbsp;int32</span><span style="color: #008000; "><br /></span>c&nbsp;:=&nbsp;1&nbsp;+&nbsp;2i&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;c&nbsp;complex128</span><span style="color: #008000; "><br /></span>var&nbsp;a,b&nbsp;=&nbsp;0,&nbsp;"B"&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;a&nbsp;int,&nbsp;b&nbsp;string</span><span style="color: #008000; "><br /></span>a,&nbsp;b&nbsp;:=&nbsp;0,&nbsp;"B"&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;a&nbsp;int,&nbsp;b&nbsp;string</span><span style="color: #008000; "><br /></span>c&nbsp;:=&nbsp;`formatted<br />&nbsp;<span style="color: #0000FF; ">string</span>`&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;c&nbsp;string<br /><br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;:=&nbsp;结构不能使用在函数外，函数外的每个语法块都必须以关键字开始<br /><br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;常量可以是字符、字符串、布尔或数字类型的值，数值常量是高精度的值</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">const</span>&nbsp;x&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;=&nbsp;3<br /><span style="color: #0000FF; ">const</span>&nbsp;(<br />&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;<span style="color: #0000FF; ">byte</span>&nbsp;=&nbsp;'A'<br />&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;=&nbsp;"B"<br />&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span><br />&nbsp;&nbsp;&nbsp;&nbsp;d&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;=&nbsp;4<br />&nbsp;&nbsp;&nbsp;&nbsp;e&nbsp;float32&nbsp;=&nbsp;5.1<br />&nbsp;&nbsp;&nbsp;&nbsp;f&nbsp;complex64&nbsp;=&nbsp;6&nbsp;+&nbsp;6i<br />)<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;未指定类型的常量由常量值决定其类型</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">const</span>&nbsp;a&nbsp;=&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;a&nbsp;int</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">const</span>&nbsp;(<br />&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;=&nbsp;2.3&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;b&nbsp;float64</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;c&nbsp;bool</span><span style="color: #008000; "><br /></span>)<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;自动枚举常量&nbsp;iota<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;iota的枚举值可以赋值给数值兼容类型<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;每个常量单独声明时,&nbsp;iota不会自动递增(无意义)</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">const</span>&nbsp;a&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;=&nbsp;iota&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;a&nbsp;=&nbsp;0</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">const</span>&nbsp;b&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;=&nbsp;iota&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;b&nbsp;=&nbsp;0</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">const</span>&nbsp;c&nbsp;<span style="color: #0000FF; ">byte</span>&nbsp;=&nbsp;iota&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;c&nbsp;=&nbsp;0</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">const</span>&nbsp;d&nbsp;uint64&nbsp;=&nbsp;iota&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;d&nbsp;=&nbsp;0<br /><br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;常量组合声明时,&nbsp;iota每次引用会逐步自增,&nbsp;初始值为0,步进值为1</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">const</span>&nbsp;(<br />&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;uint8&nbsp;=&nbsp;iota&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;a&nbsp;=&nbsp;0</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;int16&nbsp;=&nbsp;iota&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;b&nbsp;=&nbsp;1</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;rune&nbsp;=&nbsp;iota&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;c&nbsp;=&nbsp;2</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;d&nbsp;float64&nbsp;=&nbsp;iota&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;d&nbsp;=&nbsp;3</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;e&nbsp;uintptr&nbsp;=&nbsp;iota&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;e&nbsp;=&nbsp;4</span><span style="color: #008000; "><br /></span>)<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;枚举的常量都为同一类型时,&nbsp;可以使用简单序列格式.</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">const</span>&nbsp;(<br />&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;=&nbsp;iota&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;a&nbsp;int32&nbsp;=&nbsp;0</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;b&nbsp;int32&nbsp;=&nbsp;1</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;c&nbsp;int32&nbsp;=&nbsp;2</span><span style="color: #008000; "><br /></span>)<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;枚举序列中的未指定类型的常量会跟随序列前面最后一次出现类型定义的类型</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">const</span>&nbsp;(<br />&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;<span style="color: #0000FF; ">byte</span>&nbsp;=&nbsp;iota&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;a&nbsp;uint8&nbsp;=&nbsp;0</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;b&nbsp;uint8&nbsp;=&nbsp;1</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;c&nbsp;uint8&nbsp;=&nbsp;2</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;d&nbsp;rune&nbsp;=&nbsp;iota&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;d&nbsp;int32&nbsp;=&nbsp;3</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;e&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;e&nbsp;int32&nbsp;=&nbsp;4</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;f&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;f&nbsp;int32&nbsp;=&nbsp;5</span><span style="color: #008000; "><br /></span>)<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;iota自增值只在一个常量定义组合中有效,跳出常量组合定义后iota值归0</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">const</span>&nbsp;(<br />&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;=&nbsp;iota&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;a&nbsp;int32&nbsp;=&nbsp;0</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;b&nbsp;int32&nbsp;=&nbsp;1</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;c&nbsp;int32&nbsp;=&nbsp;2</span><span style="color: #008000; "><br /></span>)<br /><span style="color: #0000FF; ">const</span>&nbsp;(<br />&nbsp;&nbsp;&nbsp;&nbsp;e&nbsp;=&nbsp;iota&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;e&nbsp;int32&nbsp;=&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;(iota重新初始化并自增)</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;f&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;f&nbsp;int32&nbsp;=&nbsp;1</span><span style="color: #008000; "><br /></span>)<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;定制iota序列初始值与步进值&nbsp;(通过数学公式实现)</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">const</span>&nbsp;(<br />&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;=&nbsp;(iota&nbsp;+&nbsp;2)&nbsp;*&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;a&nbsp;int32&nbsp;=&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;(a=(0+2)*3)&nbsp;初始值为6,步进值为3</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;b&nbsp;int32&nbsp;=&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;(b=(1+2)*3)</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;c&nbsp;int32&nbsp;=&nbsp;6&nbsp;&nbsp;&nbsp;&nbsp;(c=(2+2)*3)</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;d&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;d&nbsp;int32&nbsp;=&nbsp;9&nbsp;&nbsp;&nbsp;&nbsp;(d=(3+2)*3)</span><span style="color: #008000; "><br /></span>)<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;数组声明带有长度信息，数组的长度固定</span><span style="color: #008000; "><br /></span>var&nbsp;a&nbsp;[3]<span style="color: #0000FF; ">int</span>&nbsp;=&nbsp;[3]<span style="color: #0000FF; ">int</span>{0,&nbsp;1,&nbsp;2}&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;a&nbsp;=&nbsp;[0&nbsp;1&nbsp;2]</span><span style="color: #008000; "><br /></span>var&nbsp;b&nbsp;[3]<span style="color: #0000FF; ">int</span>&nbsp;=&nbsp;[3]<span style="color: #0000FF; ">int</span>{}&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;b&nbsp;=&nbsp;[0&nbsp;0&nbsp;0]</span><span style="color: #008000; "><br /></span>var&nbsp;c&nbsp;=&nbsp;[3]<span style="color: #0000FF; ">int</span>{}&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;c&nbsp;=&nbsp;[0&nbsp;0&nbsp;0]</span><span style="color: #008000; "><br /></span>d&nbsp;:=&nbsp;[3]<span style="color: #0000FF; ">int</span>{}&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;d&nbsp;=&nbsp;[0&nbsp;0&nbsp;0]</span><span style="color: #008000; "><br /></span>fmt.Printf("%T\t%#v\t%d\t%d\n",&nbsp;d,&nbsp;d,&nbsp;len(d),&nbsp;cap(d))&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;[3]int&nbsp;&nbsp;&nbsp;&nbsp;[3]int{0,&nbsp;0,&nbsp;0}&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;3<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;使用<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />自动计算数组初始数据的长度</span><span style="color: #008000; "><br /></span>var&nbsp;a&nbsp;=&nbsp;[<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />]<span style="color: #0000FF; ">int</span>{0,&nbsp;1,&nbsp;2}<br />x&nbsp;:=&nbsp;[<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />][3]<span style="color: #0000FF; ">int</span>{{0,&nbsp;1,&nbsp;2},&nbsp;{3,&nbsp;4,&nbsp;5}}<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;slice&nbsp;指向数组的值，并且同时包含了长度信息</span><span style="color: #008000; "><br /></span>var&nbsp;a&nbsp;[]<span style="color: #0000FF; ">int</span><br />fmt.Printf("%T\t%#v\t%d\t%d\n",&nbsp;a,&nbsp;a,&nbsp;len(a),&nbsp;cap(a))&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;[]int&nbsp;&nbsp;&nbsp;&nbsp;[]int(nil)&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;0</span><span style="color: #008000; "><br /></span>var&nbsp;a&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>([]<span style="color: #0000FF; ">int</span>)<br />fmt.Printf("%T\t%#v\t%d\t%d\n",&nbsp;a,&nbsp;a,&nbsp;len(*a),&nbsp;cap(*a))&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;*[]int&nbsp;&nbsp;&nbsp;&nbsp;&amp;[]int(nil)&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;0</span><span style="color: #008000; "><br /></span>var&nbsp;b&nbsp;=&nbsp;make([]<span style="color: #0000FF; ">int</span>,&nbsp;0)<br />fmt.Printf("%T\t%#v\t%d\t%d\n",&nbsp;b,&nbsp;b,&nbsp;len(b),&nbsp;cap(b))&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;[]int&nbsp;&nbsp;&nbsp;&nbsp;[]int{}&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;0</span><span style="color: #008000; "><br /></span>var&nbsp;c&nbsp;=&nbsp;make([]<span style="color: #0000FF; ">int</span>,&nbsp;3,&nbsp;10)<br />fmt.Printf("%T\t%#v\t%d\t%d\n",&nbsp;c,&nbsp;c,&nbsp;len(c),&nbsp;cap(c))&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;[]int&nbsp;&nbsp;&nbsp;&nbsp;[]int{}&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;10</span><span style="color: #008000; "><br /></span>var&nbsp;d&nbsp;[]<span style="color: #0000FF; ">int</span>&nbsp;=&nbsp;[]<span style="color: #0000FF; ">int</span>{0,&nbsp;1,&nbsp;2}<br />fmt.Printf("%T\t%#v\t%d\t%d\n",&nbsp;d,&nbsp;d,&nbsp;len(d),&nbsp;cap(d))&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;[]int&nbsp;&nbsp;&nbsp;&nbsp;[]int{0,&nbsp;1,&nbsp;2}&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;3<br /><br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;slice&nbsp;可以重新切片，创建一个新的&nbsp;slice&nbsp;值指向相同的数组</span><span style="color: #008000; "><br /></span>s&nbsp;:=&nbsp;[]<span style="color: #0000FF; ">int</span>{0,&nbsp;1,&nbsp;2,&nbsp;3,&nbsp;4}<br />fmt.Println(s[1,3])&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;[1&nbsp;2]&nbsp;&nbsp;&nbsp;&nbsp;(截取从开始索引到结束索引-1&nbsp;之间的片段)</span><span style="color: #008000; "><br /></span>fmt.Println(s[:4])&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;[0&nbsp;1&nbsp;2&nbsp;3]</span><span style="color: #008000; "><br /></span>fmt.Println(s[1:])&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;[1&nbsp;2&nbsp;3&nbsp;4]</span><span style="color: #008000; "><br /></span>fmt.Println(s[1:1])&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;[]<br /><br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;向slice中添加元素</span><span style="color: #008000; "><br /></span>s&nbsp;:=&nbsp;make([]<span style="color: #0000FF; ">string</span>,&nbsp;3)<br />s&nbsp;=&nbsp;append(s,&nbsp;"a")<br /><br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;map&nbsp;在使用之前必须用&nbsp;make&nbsp;来创建（不是&nbsp;new）；一个值为&nbsp;nil&nbsp;的&nbsp;map&nbsp;是空的，并且不能赋值</span><span style="color: #008000; "><br /></span>var&nbsp;m&nbsp;map[<span style="color: #0000FF; ">int</span>]<span style="color: #0000FF; ">int</span><br />m[0]&nbsp;=&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&#215;&nbsp;runtime&nbsp;error:&nbsp;assignment&nbsp;to&nbsp;entry&nbsp;in&nbsp;nil&nbsp;map</span><span style="color: #008000; "><br /></span>fmt.Printf("type:&nbsp;%T\n",&nbsp;m)&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;map[int]int</span><span style="color: #008000; "><br /></span>fmt.Printf("value:&nbsp;%#v\n",&nbsp;m)&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;map[int]int(nil)</span><span style="color: #008000; "><br /></span>fmt.Printf("value:&nbsp;%v\n",&nbsp;m)&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;map[]</span><span style="color: #008000; "><br /></span>fmt.Println("is&nbsp;nil:&nbsp;",&nbsp;nil&nbsp;==&nbsp;m)&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;true</span><span style="color: #008000; "><br /></span>fmt.Println("length:&nbsp;",&nbsp;len(m))&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;0，if&nbsp;m&nbsp;is&nbsp;nil,&nbsp;len(m)&nbsp;is&nbsp;zero.</span><span style="color: #008000; "><br /></span><br />var&nbsp;m&nbsp;map[<span style="color: #0000FF; ">int</span>]<span style="color: #0000FF; ">int</span>&nbsp;=&nbsp;make(map[<span style="color: #0000FF; ">int</span>]<span style="color: #0000FF; ">int</span>)<br />m[0]&nbsp;=&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;插入或修改元素</span><span style="color: #008000; "><br /></span>fmt.Printf("type:&nbsp;%T\n",&nbsp;m)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;map[int]int</span><span style="color: #008000; "><br /></span>fmt.Printf("value:&nbsp;%#v\n",&nbsp;m)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;map[int]int(0:0)</span><span style="color: #008000; "><br /></span>fmt.Printf("value:&nbsp;%v\n",&nbsp;m)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;map[0:0]</span><span style="color: #008000; "><br /></span>fmt.Println("is&nbsp;nil:&nbsp;",&nbsp;nil&nbsp;==&nbsp;m)&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;false</span><span style="color: #008000; "><br /></span>fmt.Println("length:&nbsp;",&nbsp;len(m))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;1</span><span style="color: #008000; "><br /></span><br />m&nbsp;=&nbsp;map[<span style="color: #0000FF; ">int</span>]<span style="color: #0000FF; ">int</span>{<br />0:0,<br />1:1,&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;最后的逗号是必须的</span><span style="color: #008000; "><br /></span>}<br />m&nbsp;=&nbsp;map[<span style="color: #0000FF; ">string</span>]S{<br />"a":S{0,1},<br />"b":{2,3},&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;类型名称可省略</span><span style="color: #008000; "><br /></span>}<br />a&nbsp;:=&nbsp;m["a"]&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;取值</span><span style="color: #008000; "><br /></span>a,&nbsp;ok&nbsp;:=&nbsp;m["a"]&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;取值,&nbsp;并通过ok(bool)判断key对应的元素是否存在.</span><span style="color: #008000; "><br /></span>delete(m,&nbsp;"a")&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;删除key对应的元素.<br /><br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;结构体（struct）就是一个字段的集合，&nbsp;type&nbsp;定义跟其字面意思相符</span><span style="color: #008000; "><br /></span>type&nbsp;S&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;A&nbsp;<span style="color: #0000FF; ">int</span><br />&nbsp;&nbsp;&nbsp;&nbsp;B,&nbsp;c&nbsp;<span style="color: #0000FF; ">string</span><br />}<br />type&nbsp;(<br />&nbsp;&nbsp;&nbsp;&nbsp;A&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;*S<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;B&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;组合</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;}<br />)<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;结构体文法表示通过结构体字段的值作为列表来新分配一个结构体。</span><span style="color: #008000; "><br /></span>var&nbsp;s&nbsp;S&nbsp;=&nbsp;S{0,&nbsp;"1",&nbsp;"2"}<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;使用&nbsp;Name:&nbsp;语法可以仅列出部分字段。（字段名的顺序无关。）</span><span style="color: #008000; "><br /></span>var&nbsp;s&nbsp;S&nbsp;=&nbsp;S{A:&nbsp;0,&nbsp;B:&nbsp;"1"}<br />var&nbsp;s&nbsp;S&nbsp;=&nbsp;S{}<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;特殊的前缀&nbsp;&amp;&nbsp;构造了指向结构体文法的指针。</span><span style="color: #008000; "><br /></span>var&nbsp;s&nbsp;*S&nbsp;=&nbsp;&amp;S{0,&nbsp;"1",&nbsp;"2"}<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;表达式&nbsp;new(T)&nbsp;分配了一个零初始化的&nbsp;T&nbsp;值，并返回指向它的指针</span><span style="color: #008000; "><br /></span>var&nbsp;s&nbsp;*S&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>(S)<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;有指针，但是没有指针运算，结构体字段使用点号来访问<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;结构体字段可以通过结构体指针来访问。通过指针间接的访问是透明的</span><span style="color: #008000; "><br /></span>fmt.Println(s.A)<br />fmt.Println((*s).A)<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;TODO&nbsp;interface</span><span style="color: #008000; "><br /></span>type&nbsp;IF&nbsp;<span style="color: #0000FF; ">interface</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;a()<br />}<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;TODO&nbsp;chanel<br /><br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;TODO&nbsp;error<br /><br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;if&nbsp;语句&nbsp;小括号&nbsp;(&nbsp;)是可选的，而&nbsp;{&nbsp;}&nbsp;是必须的。</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">if</span>&nbsp;(i&nbsp;&lt;&nbsp;0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;编译错误.</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;println(i)<br /><br /><span style="color: #0000FF; ">if</span>&nbsp;i&nbsp;&lt;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;编译错误.</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;println(i)<br /><br /><span style="color: #0000FF; ">if</span>&nbsp;(i&nbsp;&lt;&nbsp;0)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;编译通过.</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;println(i)<br />}<br /><span style="color: #0000FF; ">if</span>&nbsp;i&nbsp;&lt;&nbsp;0&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;println(i)<br />}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;println(i)<br />}<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;可以在条件之前执行一个简单的语句，由这个语句定义的变量的作用域仅在&nbsp;if/else&nbsp;范围之内</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">if</span>&nbsp;(i&nbsp;:=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;1)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;编译错误.</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;println(i)<br />}<br /><br /><span style="color: #0000FF; ">if</span>&nbsp;i&nbsp;:=&nbsp;0;&nbsp;(i&nbsp;&lt;&nbsp;1)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;编译通过.</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;println(i)<br />}<br /><br /><span style="color: #0000FF; ">if</span>&nbsp;i&nbsp;:=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;0&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;使用gofmt格式化代码会自动移除代码中不必要的小括号(&nbsp;)</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;println(i)<br />}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;i&nbsp;==&nbsp;0&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;println(i)<br />}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;println(i)<br />}<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;if语句作用域范围内定义的变量会覆盖外部同名变量,(与方法函数内局部变量覆盖全局变量相同)</span><span style="color: #008000; "><br /></span>a,&nbsp;b&nbsp;:=&nbsp;0,&nbsp;1<br /><span style="color: #0000FF; ">if</span>&nbsp;a,&nbsp;b&nbsp;:=&nbsp;3,&nbsp;4;&nbsp;a&nbsp;&gt;&nbsp;1&nbsp;&amp;&amp;&nbsp;b&nbsp;&gt;&nbsp;2&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;println(a,&nbsp;b)&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;3&nbsp;4</span><span style="color: #008000; "><br /></span>}<br />println(a,&nbsp;b)&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;0&nbsp;1<br /><br /><br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;只有一种循环结构，for&nbsp;循环。可以让前置、后置语句为空，或者全为空</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">for</span>&nbsp;i&nbsp;:=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;10;&nbsp;i++&nbsp;{<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />}<br /><span style="color: #0000FF; ">for</span>&nbsp;i&nbsp;:=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;10;&nbsp;{<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />}<br /><span style="color: #0000FF; ">for</span>&nbsp;;&nbsp;i&nbsp;&lt;&nbsp;10;&nbsp;i++&nbsp;{<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />}<br /><span style="color: #0000FF; ">for</span>&nbsp;;&nbsp;i&nbsp;&lt;&nbsp;10;&nbsp;{<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />}<br /><span style="color: #0000FF; ">for</span>&nbsp;i&nbsp;&lt;&nbsp;10&nbsp;{<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />}<br /><span style="color: #0000FF; ">for</span>&nbsp;;&nbsp;;&nbsp;{<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />}<br /><span style="color: #0000FF; ">for</span>&nbsp;{<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />}<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;小括号&nbsp;(&nbsp;)是可选的，而&nbsp;{&nbsp;}&nbsp;是必须的。</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">for</span>&nbsp;(i&nbsp;:=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;10;&nbsp;i++)&nbsp;{<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />}&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;编译错误.</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">for</span>&nbsp;i&nbsp;:=&nbsp;0;&nbsp;(i&nbsp;&lt;&nbsp;10);&nbsp;i++&nbsp;{<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />}&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;编译通过.</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">for</span>&nbsp;(i&nbsp;&lt;&nbsp;10)&nbsp;{<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />}&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;编译通过.<br /><br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;TODO&nbsp;continue<br /><br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;TODO&nbsp;for&nbsp;range<br /><br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;TODO&nbsp;switch<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;TODO&nbsp;fallthrough&nbsp;break<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;TODO&nbsp;type&nbsp;assertion<br /><br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;TODO&nbsp;select<br /><br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;TODO&nbsp;goto<br /><br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;函数可以没有参数或接受多个参数</span><span style="color: #008000; "><br /></span>func&nbsp;f()&nbsp;{<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />}<br />func&nbsp;f(a&nbsp;<span style="color: #0000FF; ">int</span>)&nbsp;{<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />}<br />func&nbsp;f(a&nbsp;<span style="color: #0000FF; ">int</span>,&nbsp;b&nbsp;<span style="color: #0000FF; ">byte</span>)&nbsp;{<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />}<br />func&nbsp;f(a&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /><span style="color: #0000FF; ">int</span>)&nbsp;{<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />}&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;可变参数</span><span style="color: #008000; "><br /></span>func&nbsp;f(a&nbsp;<span style="color: #0000FF; ">int</span>,&nbsp;b&nbsp;<span style="color: #0000FF; ">bool</span>,&nbsp;c&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /><span style="color: #0000FF; ">string</span>)&nbsp;{<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />}<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;函数可以返回任意数量的返回值</span><span style="color: #008000; "><br /></span>func&nbsp;f()&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0<br />}<br />func&nbsp;f()&nbsp;<span style="color: #0000FF; ">int</span>,&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0,&nbsp;"A"<br />}<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;函数返回结果参数，可以像变量那样命名和使用</span><span style="color: #008000; "><br /></span>func&nbsp;f()&nbsp;a&nbsp;<span style="color: #0000FF; ">int</span>,&nbsp;b&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;=&nbsp;1<br />&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;=&nbsp;"B"<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;或者&nbsp;return&nbsp;a,&nbsp;b</span><span style="color: #008000; "><br /></span>}<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;当两个或多个连续的函数命名参数是同一类型，则除了最后一个类型之外，其他都可以省略</span><span style="color: #008000; "><br /></span>func&nbsp;f(a,b,c&nbsp;<span style="color: #0000FF; ">int</span>)&nbsp;{<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />}<br />func&nbsp;f()&nbsp;a,b,c&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;{<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />}<br />func&nbsp;f(a,b,c&nbsp;<span style="color: #0000FF; ">int</span>)&nbsp;x,y,z&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;{<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />}<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;函数也是值，可以将函数赋值给变量</span><span style="color: #008000; "><br /></span>var&nbsp;f&nbsp;(func(i&nbsp;<span style="color: #0000FF; ">int</span>)&nbsp;<span style="color: #0000FF; ">int</span>)&nbsp;=&nbsp;func(i&nbsp;<span style="color: #0000FF; ">int</span>)&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;i<br />}<br />fmt.Println(f(3))&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;3</span><span style="color: #008000; "><br /></span>var&nbsp;f&nbsp;func()&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;=&nbsp;func()&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0<br />}<br />fmt.Println(f())&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;0</span><span style="color: #008000; "><br /></span>var&nbsp;f&nbsp;func()&nbsp;=&nbsp;func()&nbsp;{<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />}<br />var&nbsp;f&nbsp;=&nbsp;func()&nbsp;{<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />}<br />f&nbsp;:=&nbsp;func()&nbsp;{<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />}<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;TODO&nbsp;defer<br /><br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;TODO&nbsp;方法<br /><br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;TODO&nbsp;内建函数</span><span style="color: #008000; "><br /></span>append&nbsp;<br />cap&nbsp;<br />close&nbsp;<br />complex&nbsp;<br />copy&nbsp;<br />delete&nbsp;<br />imag&nbsp;<br />len&nbsp;<br />make&nbsp;<br /><span style="color: #0000FF; ">new</span>&nbsp;<br />panic&nbsp;<br />print&nbsp;<br />println&nbsp;<br />real&nbsp;<br />recover<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;TODO&nbsp;并发</span><span style="color: #008000; "><br /></span>go&nbsp;func()&nbsp;{<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />}</div></pre><img src ="http://www.blogjava.net/oathleo/aggbug/402316.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2013-08-02 16:15 <a href="http://www.blogjava.net/oathleo/archive/2013/08/02/402316.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Go语言文件操作</title><link>http://www.blogjava.net/oathleo/archive/2013/08/02/402287.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Fri, 02 Aug 2013 02:43:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2013/08/02/402287.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/402287.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2013/08/02/402287.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/402287.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/402287.html</trackback:ping><description><![CDATA[<p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: verdana, Arial, Helvetica, sans-serif; line-height: 25px; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; font-family: 宋体;"><span style="margin: 0px; padding: 0px;">写程序离不了文件操作，</span></span><span style="margin: 0px; padding: 0px;">这里总结下</span><span style="margin: 0px; padding: 0px; font-family: 'Times New Roman', serif;">go</span><span style="margin: 0px; padding: 0px;">语言文件操作。</span></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: verdana, Arial, Helvetica, sans-serif; line-height: 25px; background-color: #ffffff;">一、建立与打开</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: verdana, Arial, Helvetica, sans-serif; line-height: 25px; background-color: #ffffff;">建立文件函数：</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: verdana, Arial, Helvetica, sans-serif; line-height: 25px; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; font-family: 'Times New Roman', serif;"><span style="margin: 0px; padding: 0px; color: #000000;"><span style="margin: 0px; padding: 0px; font-family: monospace;"><span style="margin: 0px; padding: 0px; font-size: x-small;">func Create(name string) (file *File, err Error)</span></span></span></span></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: verdana, Arial, Helvetica, sans-serif; line-height: 25px; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; font-family: 'Times New Roman', serif;"><span style="margin: 0px; padding: 0px; color: #000000;"><span style="margin: 0px; padding: 0px; font-family: monospace;"><span style="margin: 0px; padding: 0px; font-size: x-small;">func NewFile(fd int, name string) *File</span></span></span></span></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: verdana, Arial, Helvetica, sans-serif; line-height: 25px; background-color: #ffffff;"><span style="margin: 0px; padding: 0px;">具体见官网：</span><span style="margin: 0px; padding: 0px; font-family: 'Times New Roman', serif;"><a href="http://golang.org/pkg/os/#Create" style="margin: 0px; padding: 0px; text-decoration: none; color: #000000; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #333333;">http://golang.org/pkg/os/#Create</a></span></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: verdana, Arial, Helvetica, sans-serif; line-height: 25px; background-color: #ffffff;">&nbsp;</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: verdana, Arial, Helvetica, sans-serif; line-height: 25px; background-color: #ffffff;">打开文件函数：</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: verdana, Arial, Helvetica, sans-serif; line-height: 25px; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; font-family: 'Times New Roman', serif;"><span style="margin: 0px; padding: 0px; color: #000000;"><span style="margin: 0px; padding: 0px; font-family: monospace;"><span style="margin: 0px; padding: 0px; font-size: x-small;">func Open(name string) (file *File, err Error)</span></span></span></span></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: verdana, Arial, Helvetica, sans-serif; line-height: 25px; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; font-family: 'Times New Roman', serif;"><span style="margin: 0px; padding: 0px; color: #000000;"><span style="margin: 0px; padding: 0px; font-family: monospace;"><span style="margin: 0px; padding: 0px; font-size: x-small;">func OpenFile(name string, flag int, perm uint32) (file *File, err Error)</span></span></span></span></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: verdana, Arial, Helvetica, sans-serif; line-height: 25px; background-color: #ffffff;"><span style="margin: 0px; padding: 0px;">具体见官网：</span><span style="margin: 0px; padding: 0px; font-family: 'Times New Roman', serif;"><a href="http://golang.org/pkg/os/#Open" style="margin: 0px; padding: 0px; text-decoration: none; color: #000000; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #333333;">http://golang.org/pkg/os/#Open</a></span></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: verdana, Arial, Helvetica, sans-serif; line-height: 25px; background-color: #ffffff;">&nbsp;</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: verdana, Arial, Helvetica, sans-serif; line-height: 25px; background-color: #ffffff;">二、写文件</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: verdana, Arial, Helvetica, sans-serif; line-height: 25px; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; font-family: 宋体;">写文件函数：</span></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: verdana, Arial, Helvetica, sans-serif; line-height: 25px; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; font-family: 'Times New Roman', serif;"><span style="margin: 0px; padding: 0px; color: #000000;"><span style="margin: 0px; padding: 0px; font-family: monospace;"><span style="margin: 0px; padding: 0px; font-size: x-small;">func (file *File) Write(b []byte) (n int, err Error)</span></span></span></span></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: verdana, Arial, Helvetica, sans-serif; line-height: 25px; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; font-family: 'Times New Roman', serif;"><span style="margin: 0px; padding: 0px; color: #000000;"><span style="margin: 0px; padding: 0px; font-family: monospace;"><span style="margin: 0px; padding: 0px; font-size: x-small;">func (file *File) WriteAt(b []byte, off int64) (n int, err Error)</span></span></span></span></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: verdana, Arial, Helvetica, sans-serif; line-height: 25px; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; font-family: 'Times New Roman', serif;"><span style="margin: 0px; padding: 0px; color: #000000;"><span style="margin: 0px; padding: 0px; font-family: monospace;"><span style="margin: 0px; padding: 0px; font-size: x-small;">func (file *File) WriteString(s string) (ret int, err Error)</span></span></span></span></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: verdana, Arial, Helvetica, sans-serif; line-height: 25px; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; font-family: 宋体;"><span style="margin: 0px; padding: 0px;">具体见官网：</span></span><span style="margin: 0px; padding: 0px; font-family: 'Times New Roman', serif;"><a href="http://golang.org/pkg/os/#File.Write" style="margin: 0px; padding: 0px; text-decoration: none; color: #000000; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #333333;">http://golang.org/pkg/os/#File.Write</a></span>&nbsp;</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: verdana, Arial, Helvetica, sans-serif; line-height: 25px; background-color: #ffffff;">写文件示例代码：</p><pre style="margin-top: 0px; margin-bottom: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; color: #333333; line-height: 25px; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; color: #000000;"><span style="margin: 0px; padding: 0px; color: #804040;"><strong style="margin: 0px; padding: 0px;">package</strong></span> main</span> <span style="margin: 0px; padding: 0px; color: #000000;"><span style="margin: 0px; padding: 0px; color: #804040;"><strong style="margin: 0px; padding: 0px;">import</strong></span> (</span> <span style="margin: 0px; padding: 0px; color: #000000;">        <span style="margin: 0px; padding: 0px; font-family: 'Courier New', monospace;"><span style="margin: 0px; padding: 0px; color: #ff00ff;"><span style="margin: 0px; padding: 0px; font-family: monospace;">"os"</span></span></span></span> <span style="margin: 0px; padding: 0px; color: #000000;">        <span style="margin: 0px; padding: 0px; font-family: 'Courier New', monospace;"><span style="margin: 0px; padding: 0px; color: #ff00ff;"><span style="margin: 0px; padding: 0px; font-family: monospace;">"fmt"</span></span></span></span> <span style="margin: 0px; padding: 0px; color: #000000;">)</span> <span style="margin: 0px; padding: 0px; color: #000000;"><span style="margin: 0px; padding: 0px; color: #804040;"><strong style="margin: 0px; padding: 0px;">func</strong></span> main() {</span> <span style="margin: 0px; padding: 0px; color: #000000;">        <span style="margin: 0px; padding: 0px; font-family: 'Courier New', monospace;"><span style="margin: 0px; padding: 0px; font-family: monospace;">userFile := </span><span style="margin: 0px; padding: 0px; color: #ff00ff;"><span style="margin: 0px; padding: 0px; font-family: monospace;">"test.txt"</span></span></span></span> <span style="margin: 0px; padding: 0px; color: #000000;">        <span style="margin: 0px; padding: 0px; font-family: 'Courier New', monospace;"><span style="margin: 0px; padding: 0px; font-family: monospace;">fout,err := os.Create(userFile)</span></span></span> <span style="margin: 0px; padding: 0px; color: #000000;">        <span style="margin: 0px; padding: 0px; font-family: 'Courier New', monospace;"><span style="margin: 0px; padding: 0px; color: #804040;"><span style="margin: 0px; padding: 0px; font-family: monospace;"><strong style="margin: 0px; padding: 0px;">defer</strong></span></span><span style="margin: 0px; padding: 0px; font-family: monospace;"> fout.Close()</span></span></span> <span style="margin: 0px; padding: 0px; color: #000000;">        <span style="margin: 0px; padding: 0px; font-family: 'Courier New', monospace;"><span style="margin: 0px; padding: 0px; color: #804040;"><span style="margin: 0px; padding: 0px; font-family: monospace;"><strong style="margin: 0px; padding: 0px;">if</strong></span></span><span style="margin: 0px; padding: 0px; font-family: monospace;"> err != </span><span style="margin: 0px; padding: 0px; color: #804040;"><span style="margin: 0px; padding: 0px; font-family: monospace;"><strong style="margin: 0px; padding: 0px;">nil</strong></span></span><span style="margin: 0px; padding: 0px; font-family: monospace;"> {</span></span></span> <span style="margin: 0px; padding: 0px; color: #000000;">                <span style="margin: 0px; padding: 0px; font-family: 'Courier New', monospace;"><span style="margin: 0px; padding: 0px; font-family: monospace;">fmt.Println(userFile,err)</span></span></span> <span style="margin: 0px; padding: 0px; color: #000000;">                <span style="margin: 0px; padding: 0px; font-family: 'Courier New', monospace;"><span style="margin: 0px; padding: 0px; color: #804040;"><span style="margin: 0px; padding: 0px; font-family: monospace;"><strong style="margin: 0px; padding: 0px;">return</strong></span></span></span></span> <span style="margin: 0px; padding: 0px; color: #000000;">        <span style="margin: 0px; padding: 0px; font-family: 'Courier New', monospace;"><span style="margin: 0px; padding: 0px; font-family: monospace;">}</span></span></span> <span style="margin: 0px; padding: 0px; color: #000000;">        <span style="margin: 0px; padding: 0px; font-family: 'Courier New', monospace;"><span style="margin: 0px; padding: 0px; color: #804040;"><span style="margin: 0px; padding: 0px; font-family: monospace;"><strong style="margin: 0px; padding: 0px;">for</strong></span></span><span style="margin: 0px; padding: 0px; font-family: monospace;"> i:= </span><span style="margin: 0px; padding: 0px; color: #ff00ff;"><span style="margin: 0px; padding: 0px; font-family: monospace;">0</span></span><span style="margin: 0px; padding: 0px; font-family: monospace;">;i&lt;</span><span style="margin: 0px; padding: 0px; color: #ff00ff;"><span style="margin: 0px; padding: 0px; font-family: monospace;">10</span></span><span style="margin: 0px; padding: 0px; font-family: monospace;">;i++ {</span></span></span> <span style="margin: 0px; padding: 0px; color: #000000;">                <span style="margin: 0px; padding: 0px; font-family: 'Courier New', monospace;"><span style="margin: 0px; padding: 0px; font-family: monospace;">fout.WriteString(</span><span style="margin: 0px; padding: 0px; color: #ff00ff;"><span style="margin: 0px; padding: 0px; font-family: monospace;">"Just a test!</span></span><span style="margin: 0px; padding: 0px; color: #6a5acd;"><span style="margin: 0px; padding: 0px; font-family: monospace;">\r\n</span></span><span style="margin: 0px; padding: 0px; color: #ff00ff;"><span style="margin: 0px; padding: 0px; font-family: monospace;">"</span></span><span style="margin: 0px; padding: 0px; font-family: monospace;">)</span></span></span> <span style="margin: 0px; padding: 0px; color: #000000;">                <span style="margin: 0px; padding: 0px; font-family: 'Courier New', monospace;"><span style="margin: 0px; padding: 0px; font-family: monospace;">fout.Write([]</span><span style="margin: 0px; padding: 0px; color: #2e8b57;"><span style="margin: 0px; padding: 0px; font-family: monospace;"><strong style="margin: 0px; padding: 0px;">byte</strong></span></span><span style="margin: 0px; padding: 0px; font-family: monospace;">(</span><span style="margin: 0px; padding: 0px; color: #ff00ff;"><span style="margin: 0px; padding: 0px; font-family: monospace;">"Just a test!</span></span><span style="margin: 0px; padding: 0px; color: #6a5acd;"><span style="margin: 0px; padding: 0px; font-family: monospace;">\r\n</span></span><span style="margin: 0px; padding: 0px; color: #ff00ff;"><span style="margin: 0px; padding: 0px; font-family: monospace;">"</span></span><span style="margin: 0px; padding: 0px; font-family: monospace;">))</span></span></span> <span style="margin: 0px; padding: 0px; color: #000000;">        <span style="margin: 0px; padding: 0px; font-family: 'Courier New', monospace;"><span style="margin: 0px; padding: 0px; font-family: monospace;">}</span></span></span> <span style="margin: 0px; padding: 0px; color: #000000;">}</span></pre><pre style="margin-top: 0px; margin-bottom: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; color: #333333; line-height: 25px; background-color: #ffffff;"></pre><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: verdana, Arial, Helvetica, sans-serif; line-height: 25px; background-color: #ffffff;">三、读文件</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: verdana, Arial, Helvetica, sans-serif; line-height: 25px; background-color: #ffffff;">读文件函数：</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: verdana, Arial, Helvetica, sans-serif; line-height: 25px; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; font-size: x-small; font-family: monospace;">func (file *File) Read(b []byte) (n int, err Error)</span></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: verdana, Arial, Helvetica, sans-serif; line-height: 25px; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; font-size: x-small; font-family: monospace;">func (file *File) ReadAt(b []byte, off int64) (n int, err Error)</span></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: verdana, Arial, Helvetica, sans-serif; line-height: 25px; background-color: #ffffff;"><span style="margin: 0px; padding: 0px;">具体见官网：</span><span style="margin: 0px; padding: 0px; font-family: 'Times New Roman', serif;"><a href="http://golang.org/pkg/os/#File.Read" style="margin: 0px; padding: 0px; text-decoration: none; color: #000000; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #333333;">http://golang.org/pkg/os/#File.Read</a></span></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: verdana, Arial, Helvetica, sans-serif; line-height: 25px; background-color: #ffffff;">读文件示例代码：</p><pre style="margin-top: 0px; margin-bottom: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; color: #333333; line-height: 25px; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; color: #000000;"><span style="margin: 0px; padding: 0px; color: #804040;"><strong style="margin: 0px; padding: 0px;">package</strong></span> main</span> <span style="margin: 0px; padding: 0px; color: #000000;"><span style="margin: 0px; padding: 0px; color: #804040;"><strong style="margin: 0px; padding: 0px;">import</strong></span> (</span> <span style="margin: 0px; padding: 0px; color: #000000;">        <span style="margin: 0px; padding: 0px; font-family: 'Courier New', monospace;"><span style="margin: 0px; padding: 0px; color: #ff00ff;"><span style="margin: 0px; padding: 0px; font-family: monospace;">"os"</span></span></span></span> <span style="margin: 0px; padding: 0px; color: #000000;">        <span style="margin: 0px; padding: 0px; font-family: 'Courier New', monospace;"><span style="margin: 0px; padding: 0px; color: #ff00ff;"><span style="margin: 0px; padding: 0px; font-family: monospace;">"fmt"</span></span></span></span> <span style="margin: 0px; padding: 0px; color: #000000;">)</span> <span style="margin: 0px; padding: 0px; color: #000000;"><span style="margin: 0px; padding: 0px; color: #804040;"><strong style="margin: 0px; padding: 0px;">func</strong></span> main() {</span> <span style="margin: 0px; padding: 0px; color: #000000;">        <span style="margin: 0px; padding: 0px; font-family: 'Courier New', monospace;"><span style="margin: 0px; padding: 0px; font-family: monospace;">userFile := </span><span style="margin: 0px; padding: 0px; color: #ff00ff;"><span style="margin: 0px; padding: 0px; font-family: monospace;">"test.txt"</span></span></span></span> <span style="margin: 0px; padding: 0px; color: #000000;">        <span style="margin: 0px; padding: 0px; font-family: 'Courier New', monospace;"><span style="margin: 0px; padding: 0px; font-family: monospace;">fin,err := os.Open(userFile)</span></span></span> <span style="margin: 0px; padding: 0px; color: #000000;">        <span style="margin: 0px; padding: 0px; font-family: 'Courier New', monospace;"><span style="margin: 0px; padding: 0px; color: #804040;"><span style="margin: 0px; padding: 0px; font-family: monospace;"><strong style="margin: 0px; padding: 0px;">defer</strong></span></span><span style="margin: 0px; padding: 0px; font-family: monospace;"> fin.Close()</span></span></span> <span style="margin: 0px; padding: 0px; color: #000000;">        <span style="margin: 0px; padding: 0px; font-family: 'Courier New', monospace;"><span style="margin: 0px; padding: 0px; color: #804040;"><span style="margin: 0px; padding: 0px; font-family: monospace;"><strong style="margin: 0px; padding: 0px;">if</strong></span></span><span style="margin: 0px; padding: 0px; font-family: monospace;"> err != </span><span style="margin: 0px; padding: 0px; color: #804040;"><span style="margin: 0px; padding: 0px; font-family: monospace;"><strong style="margin: 0px; padding: 0px;">nil</strong></span></span><span style="margin: 0px; padding: 0px; font-family: monospace;"> {</span></span></span> <span style="margin: 0px; padding: 0px; color: #000000;">                <span style="margin: 0px; padding: 0px; font-family: 'Courier New', monospace;"><span style="margin: 0px; padding: 0px; font-family: monospace;">fmt.Println(userFile,err)</span></span></span> <span style="margin: 0px; padding: 0px; color: #000000;">                <span style="margin: 0px; padding: 0px; font-family: 'Courier New', monospace;"><span style="margin: 0px; padding: 0px; color: #804040;"><span style="margin: 0px; padding: 0px; font-family: monospace;"><strong style="margin: 0px; padding: 0px;">return</strong></span></span></span></span> <span style="margin: 0px; padding: 0px; color: #000000;">        <span style="margin: 0px; padding: 0px; font-family: 'Courier New', monospace;"><span style="margin: 0px; padding: 0px; font-family: monospace;">}</span></span></span> <span style="margin: 0px; padding: 0px; color: #000000;">        <span style="margin: 0px; padding: 0px; font-family: 'Courier New', monospace;"><span style="margin: 0px; padding: 0px; font-family: monospace;">buf := </span><span style="margin: 0px; padding: 0px; color: #804040;"><span style="margin: 0px; padding: 0px; font-family: monospace;"><strong style="margin: 0px; padding: 0px;">make</strong></span></span><span style="margin: 0px; padding: 0px; font-family: monospace;">([]</span><span style="margin: 0px; padding: 0px; color: #2e8b57;"><span style="margin: 0px; padding: 0px; font-family: monospace;"><strong style="margin: 0px; padding: 0px;">byte</strong></span></span><span style="margin: 0px; padding: 0px; font-family: monospace;">, </span><span style="margin: 0px; padding: 0px; color: #ff00ff;"><span style="margin: 0px; padding: 0px; font-family: monospace;">1024</span></span><span style="margin: 0px; padding: 0px; font-family: monospace;">)</span></span></span> <span style="margin: 0px; padding: 0px; color: #000000;">        <span style="margin: 0px; padding: 0px; font-family: 'Courier New', monospace;"><span style="margin: 0px; padding: 0px; color: #804040;"><span style="margin: 0px; padding: 0px; font-family: monospace;"><strong style="margin: 0px; padding: 0px;">for</strong></span></span><span style="margin: 0px; padding: 0px; font-family: monospace;">{</span></span></span> <span style="margin: 0px; padding: 0px; color: #000000;">                <span style="margin: 0px; padding: 0px; font-family: 'Courier New', monospace;"><span style="margin: 0px; padding: 0px; font-family: monospace;">n, _ := fin.Read(buf)</span></span></span> <span style="margin: 0px; padding: 0px; color: #000000;">                <span style="margin: 0px; padding: 0px; font-family: 'Courier New', monospace;"><span style="margin: 0px; padding: 0px; color: #804040;"><span style="margin: 0px; padding: 0px; font-family: monospace;"><strong style="margin: 0px; padding: 0px;">if </strong></span></span><span style="margin: 0px; padding: 0px; color: #ff00ff;"><span style="margin: 0px; padding: 0px; font-family: monospace;">0</span></span><span style="margin: 0px; padding: 0px; font-family: monospace;"> == n { </span><span style="margin: 0px; padding: 0px; color: #804040;"><span style="margin: 0px; padding: 0px; font-family: monospace;"><strong style="margin: 0px; padding: 0px;">break</strong></span></span><span style="margin: 0px; padding: 0px; font-family: monospace;"> }</span></span></span> <span style="margin: 0px; padding: 0px; color: #000000;">                <span style="margin: 0px; padding: 0px; font-family: 'Courier New', monospace;"><span style="margin: 0px; padding: 0px; font-family: monospace;">os.Stdout.Write(buf[:n])</span></span></span> <span style="margin: 0px; padding: 0px; color: #000000;">        <span style="margin: 0px; padding: 0px; font-family: 'Courier New', monospace;"><span style="margin: 0px; padding: 0px; font-family: monospace;">}</span></span></span> <span style="margin: 0px; padding: 0px; color: #000000;">}</span></pre><pre style="margin-top: 0px; margin-bottom: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; color: #333333; line-height: 25px; background-color: #ffffff;"></pre><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: verdana, Arial, Helvetica, sans-serif; line-height: 25px; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; font-family: 宋体;">四、删除文件</span></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: verdana, Arial, Helvetica, sans-serif; line-height: 25px; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; font-family: 宋体;">函数：</span></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: verdana, Arial, Helvetica, sans-serif; line-height: 25px; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; font-size: x-small; font-family: monospace;">func Remove(name string) Error</span></p><img src ="http://www.blogjava.net/oathleo/aggbug/402287.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2013-08-02 10:43 <a href="http://www.blogjava.net/oathleo/archive/2013/08/02/402287.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>goLang 读取Int</title><link>http://www.blogjava.net/oathleo/archive/2013/08/02/402283.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Fri, 02 Aug 2013 02:13:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2013/08/02/402283.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/402283.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2013/08/02/402283.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/402283.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/402283.html</trackback:ping><description><![CDATA[windows下字节序和网络的相反<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->func&nbsp;readInt32(conn&nbsp;net.Conn)&nbsp;int32&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;num_byte&nbsp;:=&nbsp;make([]<span style="color: #0000FF; ">byte</span>,&nbsp;4)<br />&nbsp;&nbsp;&nbsp;&nbsp;conn.Read(num_byte)<br />&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;value&nbsp;int32&nbsp;=&nbsp;0<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">windows<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;byte2&nbsp;:=&nbsp;num_byte[2]<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;byte3&nbsp;:=&nbsp;num_byte[3]<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;num_byte[3]&nbsp;=&nbsp;num_byte[0]<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;num_byte[0]&nbsp;=&nbsp;byte3<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;num_byte[2]&nbsp;=&nbsp;num_byte[1]<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;num_byte[1]&nbsp;=&nbsp;byte2<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">windows<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">windows</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;num_byte[0],num_byte[1],num_byte[2],num_byte[3]&nbsp;=&nbsp;num_byte[3],num_byte[2],num_byte[1],num_byte[0]<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;i&nbsp;:=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;4;&nbsp;i++&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shift&nbsp;:=&nbsp;uint32((4&nbsp;-&nbsp;1&nbsp;-&nbsp;i)&nbsp;*&nbsp;8)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value&nbsp;=&nbsp;value&nbsp;+&nbsp;(int32(num_byte[i])&amp;0x000000FF)&lt;&lt;shift<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;value<br />}</div><img src ="http://www.blogjava.net/oathleo/aggbug/402283.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2013-08-02 10:13 <a href="http://www.blogjava.net/oathleo/archive/2013/08/02/402283.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>