Goèšèªã¯ã¡ãã£ãšããããŒã«ãäœãã®ã«é©ããŠããŸããä»åã¯ããã©ãŠã¶ããã䜿ãããã€ããªãã¥ãŒã¯ãŒãäœã£ãŠã¿ãŸãããããã©ãŠã¶ãã䜿ãããšãããããŒã«ãæè»œã«äœ¿ããŸããããã§ããã€ããªãã¡ã€ã«ã®æ±ãã«å ããŠãããŒã«ããã©ãŠã¶å¯Ÿå¿ããæ¹æ³ã玹ä»ããŸãã
ãã€ããªãã¥ãŒã¯ãŒãšã¯ïŒ
ãã€ããª(è±èª:binary)ãšã¯äºé²æ°æ³ãæãèšèã§ãããã³ã³ãã¥ãŒã¿ãŒãåŠçããããŒã¿ãæããŠãã€ããªãšåŒã³ãŸããç§ãã¡ãã³ã³ãã¥ãŒã¿ãŒãä»ããŠãå©çšãããããããªãã¡ã€ã«ã¯å šãŠæ§ã ãªæ°å€ã®é£ç¶ã§æãç«ã£ãŠããŸãããããŠããã€ããªãã¥ãŒã¯ãŒïŒãŸãã¯ãšãã£ã¿ãŒïŒãšã¯ãããããæ§ã ãªãã¡ã€ã«ãæ°å€ïŒäžè¬çã«ã¯16鲿°)ã§ç¢ºèªïŒç·šéïŒã§ããããŒã«ãèšããŸãã
ãã€ããªã確èªãããšæ®æ®µå©çšããŠãããã¡ã€ã«ããã©ã®ãããªããŒã¿ã§æãç«ã£ãŠããã®ããèŠãããšãã§ããŸãããã ããå®éã«ãããããªãã¡ã€ã«ãèŠãŠã¿ããšåããã®ã§ãããäœã®ç¥èããªãã«èŠããšãæå³äžæãªããŒã¿ã䞊ãã§ããã ãã«èŠããŸãããããã詳ãããã¡ã€ã«åœ¢åŒã調ã¹ãŠã¿ããšãããããããŒã¿ã«ã©ããªæå³ãããã®ããåãããŸãã
Goèšèªã¯ãã€ããªãã¡ã€ã«ã®åãæ±ããåŸæãªã®ã§ããããããã€ããªãã¥ãŒã¯ãŒã®äœæãçšæã§ããæåã«ã³ãã³ãã©ã€ã³ã§ããŒã«ãäœãããã®åŸã§ãã©ãŠã¶å¯Ÿå¿ããŠã¿ãŸãããã
Goèšèªã§ãã€ããªãåŠçããæ¹æ³
æåã«ããã¡ã€ã«ãèªã¿èŸŒãã§ããã€ããªããŒã¿ãé£ç¶ã§åºåããããã°ã©ã ãäœã£ãŠã¿ãŸãããã以äžã¯ããã¹ããã¡ã€ã«ãtest.txtãã1ãã€ããã€èªã¿èŸŒãã§ç»é¢ã«è¡šç€ºããããã°ã©ã ã§ãã
package main
import (
"fmt"
"os"
)
// ãã¡ã€ã«ãèªã¿èŸŒãã§å
容ã衚瀺ãã
func PrintFile(filename string) {
// ãã¡ã€ã«ãéã --- (*1)
fp, err := os.Open(filename)
if err != nil {
panic(err)
}
// èªã¿èŸŒã¿ãããã¡ãçšæãã --- (*2)
buf := make([]byte, 1)
// ç¹°ãè¿ã衚瀺ãã --- (*3)
for {
// 1ãã€ãèªã¿èŸŒã --- (*4)
cnt, _ := fp.Read(buf)
if cnt == 0 {
break
}
// ç»é¢ã«è¡šç€ºãã --- (*5)
fmt.Printf("[%d]", buf[0])
}
}
func main() {
PrintFile("test.txt")
fmt.Printf("\n")
}
äžèšããã°ã©ã ããprintfile.goããšããååã§ä¿åããŸãããããŠãäŸãã°æ¬¡ã®ãããªããã¹ããã¡ã€ã«ãtest.txtããçšæããŸãã
Keep on asking, and it will be given you;
keep on seeking, and you will find;
keep on knocking, and it will be opened to you;
ãããŠãã³ãã³ãã©ã€ã³ã§ä»¥äžã®ãããªã³ãã³ããå®è¡ããŸãã
go run printfile.go
ãããšãã³ãã³ãã©ã€ã³ã«ãã¡ã€ã«ã®å 容ãäžãã€ããã€è¡šç€ºãããŸãã
ããã°ã©ã ã確èªããŠã¿ãŸãããã(ïŒ1)ã®éšåã§ãã¡ã€ã«ãéããŠæäœå¯èœãªç¶æ ã«ããŸãããããŠã(ïŒ2)ã®éšåã§ãã¡ã€ã«ã®å 容ãèªã¿èŸŒãã¡ã¢ãªããããã¡ïŒäžæèšæ¶é åïŒãšããŠçšæããŸãããããŠã(ïŒ3)ã®foræ§æãçšããŠç¹°ãè¿ããã¡ã€ã«ã®å 容ãèªã¿èŸŒã¿ãŸãããã®éã(ïŒ4)ã®éšåã§ãããã¡ã«1ãã€ãèªã¿èŸŒã¿ã(ïŒ5)ã®éšåã§ç»é¢ã«è¡šç€ºããŸãã
èªã¿ãããæããŠè¡šç€ºããã
ãã ãããã€ãåãé£ç¶ã§è¡šç€ºãããã ãã§ã¯èªã¿ã¥ããããã€ããªãã¥ãŒã¯ãŒãšããŠã¯äžäŸ¿ã§ãããã€ããªãã¥ãŒã¯ãŒã䜿ãå Žé¢ãšããã®ã¯ããã¡ã€ã«è§£æãããããšãå€ãã®ã§ãããã§ã¯äžäŸ¿ã§ããããã§ãèªã¿ããããã€ããªåãæããŠè¡šç€ºããŠã¿ãŸãããããŸã10鲿°ã§ã¯ãªãã16鲿°ã«çŽããŠè¡šç€ºããããã«ããŠã¿ãŸãããã
以äžã®ããã°ã©ã ããprintfile2.goããšããååã§ä¿åããŸãããã
package main
import (
"fmt"
"io/ioutil"
)
// ãã¡ã€ã«ãèªã¿èŸŒãã§å
容ã衚瀺ãã
func PrintFile(filename string) {
// ãã¡ã€ã«ã®å
容ãå
šéšèªã¿ --- (*1)
bytes, err := ioutil.ReadFile(filename)
if err != nil {
panic(err)
}
// ç¹°ãè¿ã衚瀺ãã --- (*2)
line := ""
aline := ""
for i := 0; i < len(bytes); i++ {
b := bytes[i]
// ã¢ã¹ããŒæåã®è¡šç€ºçš
c := string(b)
if b < 32 || b > 126 { c = "_" }
aline += c
// ç»é¢ã«è¡šç€ºãã --- (*3)
m := i % 16
if m == 0 { // ã¢ãã¬ã¹ã远å
line += fmt.Sprintf("%04d: ", i)
}
line += fmt.Sprintf("%02x", b)
switch m {
case 7: // èŠãããåºåãç·
line += "|"
case 15: // åºåãç·ãšã¢ã¹ããŒæå
fmt.Println(line + "|" + aline)
line = ""
aline = ""
default:
line += " "
}
}
// 衚瀺æ®ããåºå --- (*4)
if line != "" {
fmt.Printf("%-53s|%s\n", line, aline)
}
}
func main() {
PrintFile("test.txt")
}
ç¶ããŠã以äžã®ã³ãã³ããå®è¡ãããšãèŠããã16ãã€ãããšã«æ°å€ãåºåã£ãŠè¡šç€ºããŸãã
go run printfile2.go
ããã°ã©ã ã確èªããŠã¿ãŸãããã(ïŒ1)ã®éšåã§ã¯ãã¡ã€ã«ã®å 容ãèªã¿èŸŒã¿ãŸããäžã€åã®ããã°ã©ã ã§ã¯ãäžãã€ããã€èªã¿èŸŒããããªããã°ã©ã ãäœããŸããããããã§ã¯ãioutil.ReadFileãå©çšããŠãã¡ã€ã«ã®å 容ãå šéšèªã¿èŸŒã¿ãŸãã(ïŒ2)ã®éšåã§ã¯ç¹°ãè¿ã衚瀺ããŸãã(ïŒ3)ãš(ïŒ4)ã®éšåã§ã¯äœãã€ãç®ãã調ã¹ãŠãåºåãç·ãåèã®ã¢ã¹ããŒæåãåºåããŸãã
ãã©ãŠã¶ã§äœ¿ããããã«ããã
æåŸã«ããããã³ãã³ãã©ã€ã³ã§ã¯ãªããã©ãŠã¶ãã䜿ããããã«ããŠã¿ãŸãããã以äžã®ããã°ã©ã ããprintfile-server.goããšããååã§ä¿åããŸãã
package main
import (
"fmt"
"io/ioutil"
"net/http"
)
// ãµãŒããŒãèµ·å --- (*1)
func main() {
http.HandleFunc("/", indexHandler)
http.HandleFunc("/upload", uploadHandler)
http.ListenAndServe(":8888", nil)
}
// ã¢ã¯ã»ã¹ããã£ãæãã¢ããããŒããã©ãŒã ãè¿ã --- (*2)
func indexHandler(w http.ResponseWriter, r *http.Request) {
s := "<html><body>" +
"<h1>ãã¡ã€ã«ãæå®ããŠãã ãã</h1>" +
"<form action='/upload' method='post' " +
" enctype='multipart/form-data'>" +
"<input type='file' name='upfile'>" +
"<input type='submit' value='ã¢ããããŒã'>" +
"</form></body></html>";
w.Write([]byte(s))
}
// ãã¡ã€ã«ãæçš¿ããæ --- (*3)
func uploadHandler(w http.ResponseWriter, r *http.Request) {
file, _, err := r.FormFile("upfile") // ãã¡ã€ã«ãååŸ
if err != nil {
w.Write([]byte("ã¢ããããŒããšã©ãŒ"))
return
}
data, err := ioutil.ReadAll(file) // ãã¡ã€ã«ãèªã¿åºã
if err != nil {
w.Write([]byte("ã¢ããããŒããšã©ãŒ"))
return
}
s := getBinStr(data) // ããŒã¿ããã€ããªè¡šç€º
w.Write([]byte("<html><body>" + s +
"</body></html>"))
}
// ãã€ããªè¡šç€º --- (*4)
func getBinStr(bytes []byte) string {
// ç¹°ãè¿ã衚瀺ãã
result := "<style>" +
"th { background-color: #f0f0f0; } " +
".c { background-color: #fff0f0; } " +
"td { border-bottom: 1px solid silver } " +
"</style><table>"
line := "<tr>"
aline := ""
cnt := 2
for i := 0; i < len(bytes); i++ {
b := bytes[i]
// ã¢ã¹ããŒæåã®è¡šç€ºçš
c := string(b)
if b < 32 || b > 126 { c = "_" }
if c == ">" { c = ">" }
if c == "<" { c = "<" }
aline += c
// ç»é¢ã«è¡šç€ºãã
m := i % 16
if m == 0 { // ã¢ãã¬ã¹ã远å
line += fmt.Sprintf("<th>%04d:</th><td>", i)
}
line += fmt.Sprintf("%02x", b)
switch m {
case 3, 7, 11: // èŠãããåºåãç·
line += "</td><td>"
cnt -= 1
case 15: // åºåãç·ãšã¢ã¹ããŒæå
result += line + "</td>"
result += "<td class='c'>" + aline + "</td></tr>\n"
line = "<tr>"
aline = ""
cnt = 2
default:
line += " "
}
}
// 衚瀺æ®ããåºå
if line != "" {
result += line
for j := 0; j < cnt; j++ {
result += "</td><td>"
}
result += "</td><td class='c'>" + aline + "</td></tr>"
}
result += "</table>"
return result
}
ãããŠãã³ãã³ãã©ã€ã³ã§ãgo run printfile-server.goããšå®è¡ããŸãããããšãGoèšèªã§ãµãŒããŒãèµ·åããŸããç¶ããŠãWebãã©ãŠã¶ã§ãhttp://localhost:8888ããžã¢ã¯ã»ã¹ããŸãããããŠããã¡ã€ã«ãéžæããŠãã¢ããããŒãããã¿ã³ãã¯ãªãã¯ãããšããã€ããªè¡šç€ºã§ãã¡ã€ã«ã®å 容ã衚瀺ãããŸãã
ããã°ã©ã ãèŠãŠã¿ãŸãããã(ïŒ1)ã®éšåã§ã¯ãGoèšèªã§WebãµãŒããŒãèµ·åããŸããããã§ã¯ãlocalhostã®ããŒã8888çªã§ãµãŒããŒãèµ·åããŸããç¶ããŠã(ïŒ2)ã®éšåã§ã¯ããã©ãŠã¶ããã«ãŒãã«ã¢ã¯ã»ã¹ããã£ãæã®åŠçãèšè¿°ããŸããããã§ã¯ããã¡ã€ã«ã®ã¢ããããŒããã©ãŒã ã®HTMLãè¿ããŸãã(ïŒ3)ã®éšåã§ã¯ããã¡ã€ã«ãã¢ããããŒãããæã®åŠçãèšè¿°ããŸããã¢ããããŒãããããã¡ã€ã«ã®å 容ãååŸããŠãgetBinStr颿°ãåŒã³åºããŠãã€ããªè¡šç€ºã®å 容ãåŸãŠãã©ãŠã¶ã®ç»é¢ã«æžãåºããŸãããã®getBinStr颿°ã®å 容ã¯ãäžã€åã®ããã°ã©ã ã®PrintFile颿°ãšã»ãšãã©åãã§ãããã¹ãã§ã¯ãªãHTMLã®ã¿ã°ãå ããŠæååãšããŠè¿ãããã«ä¿®æ£ãããã®ã§ãã
ãªããWebãµãŒããŒã«é¢ããŠã¯ãæ¬é£èŒã®3åç®ã§è©³ãã玹ä»ããŠããŸãã®ã§ãåèã«ããŠã¿ãŠãã ããã
ãŸãšã
以äžãä»åã¯ããã©ãŠã¶ãã䜿ãããã€ããªãã¥ãŒã¯ãŒãäœã£ãŠã¿ãŸãããæ§ã ãªãã¡ã€ã«ããã€ããªè¡šç€ºããŠã¿ããšé¢çœãããšã§ãããããŸããããããã¡ãã£ãšããããŒã«ããã©ãŠã¶ãã䜿ããããã«ãããªããããæè»œã«äœ¿ã£ãŠããããããšãåããããšã§ããããæ¬çš¿ããã€ããªããŒã¿ã®æ±ãããããŒã«ã®ãã©ãŠã¶å¯Ÿå¿ã®åèã«ãªãã°å¹žãã§ãã
èªç±åããã°ã©ããŒããããã¯ãã©ã«ãŠãããã°ã©ãã³ã°ã®æ¥œãããäŒããæŽ»åãããŠããã代衚äœã«ãæ¥æ¬èªããã°ã©ãã³ã°èšèªããªã§ããã ãããã¹ã鳿¥œããµã¯ã©ããªã©ã2001幎ãªã³ã©ã€ã³ãœãã倧è³å ¥è³ã2004幎床æªèžãŠãŒã¹ ã¹ãŒããŒã¯ãªãšãŒã¿ã2010幎 OSSè²¢ç®è ç« åè³ãæè¡æžãå€ãå·çããŠããã



