「詳解GO言語WEBアプリケーション」の本(p127 kindole版はp130?)
を読んでいた時に少しハマったのでメモしておきます.
本: 詳解GO言語WEBアプリケーション
問題
「詳解GO言語WEBアプリケーション」の本(p127 kindole版はp130?)のコードを実行した際に
アプリケーション“main”へのネットワーク受信接続を許可しますか?
と出る.
この 承諾ボタン を押すのが一回きりならいいのですが, ctrl + c でプログラムを終了して,
再度プログラムを走らせる度に出てきます.
コード
package main
import (
"fmt"
"net/http"
"os"
)
func main() {
err := http.ListenAndServe(
":18080",
http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello%s!", r.URL.Path[1:])
}),
)
if err != nil {
fmt.Printf("failed to terminate server: %v", err)
os.Exit(1)
}
}
結論
ポートの指定を ":18080" から "localhost:18080" に修正する
package main
import (
"fmt"
"net/http"
"os"
)
func main() {
err := http.ListenAndServe(
// ここをlocalhost:18080に変える
"localhost:18080",
http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello%s!", r.URL.Path[1:])
}),
)
if err != nil {
fmt.Printf("failed to terminate server: %v", err)
os.Exit(1)
}
}
原因はportの指定を ":18080" のようにしているからです
":18080"は省略している書き方で 内部では "0.0.0.0:18080" としていることになっている
この 0.0.0.0 というのが問題で、これでサーバーを起動すると
このままだとMacの外部にポート開放しようとしてるけど大丈夫?という意味で
「ネットワーク受信接続を許可しますか?」
とMacのファイアウォールが聞いてくることになる
詳しい0.0.0.0の意味はこちらの記事を参考にすると良いと思います
解決方法は簡単で
":18080" から "localhost:18080" に修正するだけです
"localhost:18080" は "127.0.0.1:18080" を表している
"127.0.0.1" の部分はループバックアドレスと呼ばれていて、localhostでアクセスする時のアレです
ループバックアドレスとは?
ローカルループバックアドレスとは、自分自身を表す特別なIPアドレスの1つであり、TCP/IPが有効なコンピュータでは常に利用可能なIPアドレスです. 一般的には以下のIPアドレスが利用されます.
IPv4の場合: 127.0.0.1
IPv6の場合: ::1(0000:0000:0000:0000:0000:0000:0000:0001)
IPv4の場合、IPアドレスの最上位のバイト(最上位の8bit)の内容が「127」であればよいので
「127.0.0.1~127.255.255.254」の範囲内ならばどのIPアドレスでも利用できます
(「127.0.0.0」と「127.255.255.255」の2つはブロードキャストアドレスのため除外される)
ex)
127.0.0.2 や 127.1.2.3