[Windows] Golang 1 사용해보기

12916 단어 go

소개



Windows에서 Pion/WebRtc를 사용하고 싶지만 약간의 Golang 코드를 작성했습니다.
  • Pion
  • pion/webrtc - GitHub

  • 그래서 이번에는 Golang을 작성해 봅니다.

    환경


  • Windows 11 내부자-미리보기-빌드-22598
  • Go ver.1.18.1 windows/amd64

  • 고패스



    Go 설치 프로그램은 GOPATH 환경 변수를 자동으로 설정합니다.
    하지만 PowerShell에서 "$GOPATH"처럼 사용할 수 없습니다.

    "$ENV:GOPATH"처럼 작성해야 합니다.
  • about Environment Variables - PowerShell | Microsoft Docs

  • 모듈



    README에 따르면 Pion/WebRtc 예제를 실행하려면 "GO111MODULE=on go get ~"을 실행해야 합니다.
    하지만 그렇게 하면 오류가 발생합니다.

    GO111MODULE=on : The term 'GO111MODULE=on' is not recognized as the name of a cmdlet, function, script file, or operabl
    e program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
    At line:1 char:1
    ...
    


    ver.1.13부터 GO111MODULE 환경 변수가 설정되지 않았기 때문입니다.
    그리고 대신 "mod init로 이동"해야 합니다.
  • How to Write Go Code - The Go Programming Language

  • Pion/WebRtc 예제를 실행하려면 Pion/WebRtc를 복제하고 실행하기만 하면 됩니다.

    git clone https://github.com/pion/webrtc.git $ENV:GOPATH/src/github.com/pion/webrtc
    cd $ENV:GOPATH/src/github.com/pion/webrtc/examples
    go run examples.go --address localhost:8080
    


    웹 애플리케이션을 만들어 보세요.



    새 프로젝트 만들기



    문서에 따르면 GOPATH에서 새 프로젝트를 만들어야 합니다.

    mkdir $ENV:GOPATH/src/sample/webappsample
    cd $ENV:GOPATH/src/sample/webappsample
    go mod init sample/webappsample
    


    gitignore.io으로 .gitignore 파일을 만듭니다.

    main.go




    package main
    
    import (
        "fmt"
        "log"
        "net/http"
    )
    
    func handler(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:])
    }
    func main() {
        http.HandleFunc("/", handler)
        log.Fatal(http.ListenAndServe(":8080", nil))
    }
    


  • Writing Web Applications - The Go Programming Language
  • A Tour of Go - The Go Programming Language

  • 방화벽



    이제 한 가지 문제가 있습니다.
    "go run main.go"를 실행할 때마다 방화벽 보안 경고가 표시됩니다.
    실행 파일 경로는 항상 새로 생성되기 때문입니다.



    이를 방지하기 위해 첫 번째 "ListenAndServe"인수를 "localhost:8080"으로 변경할 수 있습니다.

    main.go




    ...
    func main() {
        http.HandleFunc("/", handler)
        log.Fatal(http.ListenAndServe("localhost:8080", nil))
    }
    


  • Golang run on Windows without deal with the Firewall - StackOverflow

  • 하지만 그렇게 하면 IP 주소로 접속할 수 없습니다.
    따라서 "0.0.0.0:8080"과 같이 변경하면 첫 번째 문제가 다시 발생합니다 :(

    아마도 다른 기기에서 접근하고 싶을 때 먼저 빌드를 해야 할 것 같습니다.

    HTML 파일 표시



    index.html




    <!DOCTYPE html>
    <html>
        <head>
            <title>Go Sample</title>
            <meta charset="utf-8">
        </head>
        <body>
            <div>Hello world!</div>
        </body>
    </html>
    


    main.go




    package main
    
    import (
        "html/template"
        "log"
        "net/http"
        "path/filepath"
        "sync"
    )
    
    type templateHandler struct {
        once     sync.Once
        filename string
        templ    *template.Template
    }
    
    func (t *templateHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
        // "sync.Once" executes only one time.
        t.once.Do(func() {
            // "Must()" wraps "ParseFiles()" results, so I can put it into "templateHandler.templ" directly
            t.templ = template.Must(template.ParseFiles(filepath.Join("templates", t.filename)))
        })
        t.templ.Execute(w, nil)
    }
    
    func main() {
        // In this sample, "ServeHTTP()" is called twice.
        // The second time is for loading "favicon.ico"
        http.Handle("/", &templateHandler{filename: "index.html"})
        log.Fatal(http.ListenAndServe("localhost:8080", nil))
    }
    


  • Go言語によるWebアプリケーション開発(Go Programming Blueprints)

  • 정적 파일 로드



    CSS, JavaScript 등과 같은 정적 파일을 로드하는 것은 어떻습니까?

    "http.Handle()"을 다시 추가해야 합니다.

    main.go




    ...
    func main() {
        // load templates/css/*
        http.Handle("/css/", http.FileServer(http.Dir("templates")))
    
        // In this sample, "ServeHTTP()" is called twice.
        // The second time is for loading "favicon.ico"
        http.Handle("/", &templateHandler{filename: "index.html"})
        log.Fatal(http.ListenAndServe("localhost:8080", nil))
    }
    

    좋은 웹페이지 즐겨찾기