見よう見まねでDBのCRUDのAPIだけGoで作ってみるかな。そのうち。ScriptよりC/C++に近いんだろう。
CRUD関連の情報だけここに移動した。後から増えてきたのでまた移動。https://seesaawiki.jp/lifewithslackzaurus_15_0/d/DB%a4%d8%a4%ceAPI
最近はRESTと言うのかな?(昔からでもっと広範囲だった。2023.07)
Go言語って、C–なのかな?(できることが減ってないならC+かも):2022.02
https://gihyo.jp/admin/serial/01/linux_containers/0001
DockerはDocker Inc.によって開発されたGo言語で書かれたソフトウェアです。
(興味が湧いたのでちょっと調べた)
https://type.jp/et/feature/9445/
Go言語の開発にはC言語を設計した世界的なエンジニアであるケン・トンプソンやUNIXの開発者として知られるロブ・パイクなどが関わっており、C言語と同様の「処理の速さ」とC言語にはない「シンプルさ」が特徴です。
https://udemy.benesse.co.jp/development/system/gol…
文法がシンプルである、高速な処理が可能(重要)、並列処理が得意(超重要)、メモリの安全性が高い
アプリ開発にgomobileを利用する(Android/iOS/Flutter) (Go言語 スマホ、でググった)
https://qiita.com/kabochapo/items/b37c03ea9d30572fbd59
FlutterとGoを組み合わせたモバイルアプリケーション開発
https://logmi.jp/tech/articles/324503
\
インストールはこっちにメモした。
https://seesaawiki.jp/lifewithslackzaurus_15_0/d/GoLang
practice800/~practice899/:
Instついでにfmt.Printf();を試した。
C言語 Go言語 違い、でググった: (2024.01)
https://qiita.com/m0a/items/2b03b189d746ae231756
\
この後、本文の下の方にある、とほほのGo言語入門を見ながら先に参考書籍をやってみる事にした。
Goでやるって事はDBのAPIだけでなくWebサーバも作るって事になるので、ちゃんと書籍読まないと
分からないだろう。
/*************************************************************************************/
Goプログラミング実践入門:参考書籍5
GoとCで型の宣言が逆になったとかinclude->importみたいな予約語の変更くらいかと思ったら、結構
細かく変わっててメンドクサ。でもやっぱり、Cで組んでる感覚になる。分からない所は、
とほほのGo言語入門を見ながら進める。
第1章 Go言語はWebアプリ開発に最適な言語 (2024.01)
(HTTP通信のおさらい)
HTTPのGETにて、ペイロードとは何か? (GETをすると、この要求にはペイロードがありません、と出る)
HTTPのGETリクエストにおいて、通常はペイロードが存在しません。GETリクエストは、リソースの取得やクエリの送信などの目的で使用され、一般的にリクエストヘッダーに情報を含めることができますが、リクエストボディにデータを含めることはありません。
一方、ペイロードという用語は、通常、データの本体を指します。HTTPの場合、通常はPOSTやPUTなどのメソッドにおいて使用されます。これらのメソッドでは、リクエストボディにデータ(ペイロード)を含めることができます。例えば、HTMLのフォームから送信されるデータや、JSON形式のデータなどがペイロードとして使用されます。
つまり、HTTPのGETリクエストにおいては、ペイロードがリクエストに含まれることはありません。GETリクエストは、通常、クエリ文字列を使用してパラメータを渡す場合がありますが、これらはリクエストURLの一部として扱われ、ペイロードとは異なる概念です。(->ChatGPT)
\
package 自作パッケージを作ってみる。(1ファイル1pkgなら、普通にCで言うhoge.oに見える)
大文字で始まるものは自動的にエクスポートされる 小文字で始まるものはエクスポートされない
import はパッケージをインポートします。(#include)
type 型に別名をつけることができます。型の異なる値を代入することはできません。
interface 中身も同じなので、インタフェースを用いてひとつの関数にまとめることができます。
(やっぱ当面はCを引きずりたいので、不要な’;’は付けるしimportは各個に書く。コンパイルするので無問題)
\
(さすがにこの辺で1からとほほのGo言語入門を読んでみた)
Go言語とは メモリ破壊が無く、並行処理を得意とする、進化したC言語という側面があります。
var a1 int = 123; a3 := 123; (省略するとintならCと同じ、何故か’:=’ができないなSlackのGo)
var a2 uint32 = uint32(a1) 型名()で型変換 (キャストが関数に見える。Cでもキャスト範囲を()にしてた)
if() switch() for() も書き方が違っているが改良されている。
goto Goでは try catch raise のような例外処理構文はサポートされていませんので、似たようなことをやるとすると下記の様に、、
a1 := [3]string{} //配列(array)
a2 := []string{} //スライス(slice)。個数不定
メモリ効率や速度は若干落ちますが、個数を変更可能なものを スライス と呼びます。型名の前に [] をつけて宣言します。あとスライスの場合、make()を用いたメモリの確保ができる。
:=演算子は通常、関数内でのみ使用され、関数外では使用することはできません。(->ChatGPT)
Go言語における「シグネチャ」とは、
func add(x int, y int) int {
\ return x + y
}
この関数 add のシグネチャは次のようになります:
関数名: add
引数の型と名前: x int, y int
戻り値の型: int
このように、シグネチャは関数やメソッドの宣言の一部であり、その関数やメソッドがどのような型であり、どのような引数と戻り値を持っているかを示します。(->ChatGPT)
\
レシーバーというのは関数の引き数のことか?
はい、正しいです。Go言語において、メソッドのレシーバーは、関数の引数の一種です。ただし、メソッドにおけるレシーバーは、そのメソッドが属する型に関連付けられており、通常はその型の名前が省略されます。
type Person struct {
\ name string
}
func (p Person) SayHello() {
\ fmt.Println(“Hello, my name is”, p.name)
}
この中の (p Person) がメソッドのレシーバーです。この場合、SayHelloメソッドはPerson型に紐づいています。メソッドが呼び出される際、そのレシーバーはメソッドに渡されます。SayHello()メソッドは、Person型の値に関連付けられているため、Person型の値を受け取ることができます。
Go言語において、オブジェクト指向の考え方は、他の言語とは少し異なります。Goでは、構造体や型にメソッドを関連付けることによって、オブジェクト指向プログラミングの概念を実現します。そのため、レシーバーはメソッドの実行時にそのメソッドが操作する対象となる値やポインタを指定する役割を果たします。(->ChatGPT)
\
type Person struct {
\ name string
}
にて、
func (p Person) ToString() string {
\ return p.name
}
と
func (p *Person) ToString() string {
\ return p.name
}
はどう違う?
これらのメソッドの違いは、レシーバーの型です。
1.func (p Person) ToString() string:このメソッドは、Person型の値に紐づいています。メソッドを呼び出す際には、Person型の値がコピーされます。そのため、このメソッド内ではpは値のコピーであり、p.nameはコピーされた値のnameフィールドを参照します。
2.func (p *Person) ToString() string:このメソッドは、Person型のポインタに紐づいています。メソッドを呼び出す際には、Person型のポインタが渡されます。そのため、このメソッド内ではpはポインタであり、p.nameはポインタが指し示すPerson型の値のnameフィールドを参照します。
実際には、2番目のメソッドが一般的によく使われます。なぜなら、メソッドがポインタレシーバーを持つ場合、メソッド内でのフィールドへの変更が呼び出し元の値に反映されるためです。一方、値レシーバーを持つメソッドは、レシーバーのコピーを操作するため、呼び出し元の値に変更が反映されません。(->ChatGPT)
\
Go言語で、”.”でつながれるものは、オブジェクトやパッケージの関数以外に他に何がある?
Go言語では、.でつながれるものとしては、主に以下のようなものがあります。
1.構造体のフィールド: ドット演算子は、構造体のフィールドにアクセスするために使用されます。例えば、myStruct.fieldのようにして構造体のフィールドにアクセスします。
2.パッケージ内の関数や変数: パッケージ内の関数や変数にアクセスするためにもドット演算子が使用されます。例えば、fmt.Println()のようにしてfmtパッケージ内のPrintln()関数にアクセスします。
3.メソッド: タイプに紐づいたメソッドを呼び出すためにもドット演算子が使用されます。例えば、myStruct.method()のようにして構造体のメソッドを呼び出します。
4.ポインタ: ポインタを介してフィールドやメソッドにアクセスする場合も、ドット演算子が使用されます。例えば、myPointer.fieldのようにしてポインタ経由で構造体のフィールドにアクセスします。
以上が、.でつながれるものの一般的な例です。これらの要素は、Go言語において非常に一般的であり、多くのコードで見られます。(->ChatGPT)
\
var tmpl string = `abc`;
var tmpl string = ‘abc’;
var tmpl string = “abc”;
どう違う?
1.var tmpl string = `abc`;:これは有効なGoのコードです。バッククォート(“)を使用して文字列を定義しています。バッククォートは、文字列内の特殊文字(エスケープシーケンス)を解釈しないため、生の文字列をそのまま保持します。
2.var tmpl string = ‘abc’;:これは構文エラーを引き起こします。シングルクォート(’)はGo言語では文字のリテラルを表すために使用され、文字列のリテラルでは使用されません。var tmpl rune = ‘a’; //○
3.var tmpl string = “abc”;:これも有効なGoのコードです。ダブルクォート(”)を使用して文字列を定義しています。ダブルクォートは、文字列内の特殊文字を解釈し、エスケープシーケンスを含むことができます。(->ChatGPT)
第2章
Amazon評価参考に学習の順番を変更。この章は後回し。
第3章 net/httpライブラリを使ったリクエストの受け付け
struct Go言語では、クラス(class)の代わりに 構造体(struct) を使用します。構造体にはメンバ変数のみを定義し、クラスメソッドに相当する関数は関数名の前に (thisに相当する変数 *構造体名) をつけて(別に)定義します。(構造体を代入するとインスタンスになる)
構造体のメンバの内、大文字で始まるものはパッケージ外からアクセス可能、小文字で始まるものはパッケージ外からアクセス不可となります。
Cの様にhttpのServer構造体のヘッダファイルを見ようとして探した件はこっちにメモ。
https://seesaawiki.jp/lifewithslackzaurus_15_0/d/GoLang
Lsh メソッドは big.Int 型のメソッド。big.NewInt(1) は、値が1の新しい big.Int 型の変数を作成します。
big.NewInt(1).Lsh(…, 128) は、big.NewInt(1) で作成された big.Int の値を128ビット左にシフトしています。
big パッケージにおいて、big.Int は整数型を表し、big.NewInt は新しい big.Int 型の変数を生成するためのヘルパーメソッドです。
var a big.Int // 新しい big.Int 変数 a を宣言
max := big.NewInt(1) // 値が1の新しい big.Int 変数 max を生成
つまり、big.Int は型自体を表し、big.NewInt はその型の新しい変数を生成するメソッドです。
複数の値を返却する関数などで、不要な戻り値がある場合は、ブランク変数 _ を使用することができます。
_, y := funcA() // funcA() は x と y を返却するが、x は無視して y のみ受け取る
読んでみるとAIではなくgodocを見て理解する方が良さそう。http://localhost:6060/pkg/crypto/rand/
var Reader io.Reader
func Int(rand io.Reader, max *big.Int) (n *big.Int, err error)
2つの括弧はそれぞれ関数のパラメータ部分と戻り値部分を示しています。関数が引数を受け取り、戻り値を返す標準的な関数の宣言です。
Int は、一様なランダム値を [0, max) で返します。 max <= 0 の場合はパニックになります。
duration := time.Now().Sub(t) // 現在の時間と t の差分を計算.
関数の返り値がインスタンスで、それのメンバ関数でさらに処理を行う。
ExtKeyUsageAny ExtKeyUsage = iota
iota はGo言語で連続した整数の列挙を生成するために使用される特殊な定数です。各宣言において iota は0から始まり、1ずつ増加します。
証明書には保護者が署名しています。親がテンプレートと等しい場合、証明書は自己署名されます。パラメータ pub は生成される証明書の公開キー、priv は署名者の秘密キーです。
MarshalPKCS1PrivateKey は、RSA 秘密キーを PKCS #1、ASN.1 DER 形式に変換します。
func ListenAndServe(addr string, handler Handler) error
type Handler interface {
\ ServeHTTP(ResponseWriter, *Request)
}
func (mux *ServeMux) ServeHTTP(w ResponseWriter, r *Request)
muxはServeMux型のポインタ、rはRequest型のポインタ、wはResponseWriterインターフェース。
ServeHTTP は、パターンがリクエスト URL に最もよく一致するハンドラーにリクエストをディスパッチします。
func (mux *ServeMux) Handler(r *Request) (h Handler, pattern string)
リクエストに適用される登録済みハンドラーがない場合、Handler は「ページが見つかりません」ハンドラーと空のパターンを返します。
func Handle(pattern string, handler Handler)
Handle は、指定されたパターンのハンドラーを DefaultServeMux に登録します。 ServeMux のドキュメントでは、パターンがどのように照合されるかについて説明しています。
func HandleFunc(pattern string, handler func(ResponseWriter, *Request))
HandleFunc は、指定されたパターンのハンドラー関数を DefaultServeMux に登録します。 ServeMux のドキュメントでは、パターンがどのように照合されるかについて説明しています。
type HandlerFunc func(ResponseWriter, *Request)
HandlerFunc 型は、通常の関数を HTTP ハンドラーとして使用できるようにするアダプターです。 f が適切なシグネチャを持つ関数の場合、HandlerFunc(f) は f を呼び出すハンドラーです。
func FuncForPC(pc uintptr) *Func
FuncForPC は、指定されたプログラム カウンター アドレスを含む関数を記述する *Func を返し、それ以外の場合は nil を返します。
インライン化により pc が複数の関数を表す場合、最も内側の関数を記述する *Func を返しますが、最も外側の関数のエントリも含めます。
func ValueOf(i any) Value <- 引き数渡し
func (v Value) Pointer() uintptr <- Object渡し
ポインタは v の値を uintptr として返します。 v の Kind が Chan、Func、Map、Pointer、Slice、または UnsafePointer でない場合、パニックが発生します。
v の Kind が Func の場合、返されるポインタは基礎となるコード ポインタですが、必ずしも単一の関数を一意に識別するのに十分ではありません。唯一の保証は、v が nil func 値である場合に限り、結果がゼロになることです。
v の種類がスライスの場合、返されるポインタはスライスの最初の要素です。スライスが nil の場合、戻り値は 0 です。スライスが空であっても nil でない場合、戻り値は 0 以外です。
同等の結果を得るには、 uintptr(Value.UnsafePointer()) を使用することをお勧めします。
func (f *Func) Name() string
Name は関数の名前を返します。
return http.HandlerFunc(fucn(…){…}); では、無名関数を http.HandlerFunc 型に変換しています。つまり、無名関数を http.Handler インターフェースを実装するオブジェクトに変換しています。Cのキャストか。とほほの型変換で見たがCでデータ型ばかり見てると?となる。
no required module provides package github.com/julienschmidt/httprouter: go.mod file not found in current directory or any parent directory; see ‘go help modules’
ちゃんと理解するGo言語開発環境構築:go mod initとその必要性 https://qiita.com/TakanoriVega/items/6d7210147c289b45298a https://zenn.dev/optimisuke/articles/105feac3f8e726830f8c https://qiita.com/akifumii/items/1eaba6e11caa6b8f688d
$ go mod init github.com/oreore/GoProject
\go: creating new go.mod: module github.com/oreore/GoProject
\go: to add module requirements and sums:
\ go mod tidy
$ cat go.mod
\module github.com/oreore/GoProject
\go 1.21.6
$ go get github.com/julienschmidt/httprouter
\go: downloading github.com/julienschmidt/httprouter v1.3.0
\go: added github.com/julienschmidt/httprouter v1.3.0
$ cat go.mod
\module github.com/oreore/GoProject
\go 1.21.6
\require github.com/julienschmidt/httprouter v1.3.0 // indirect
go mod init コマンドは、ローカルでGoモジュールを初期化するだけで、リモートリポジトリ(GitHubなど)を作成しません。go mod initは、現在のディレクトリにgo.modファイルを作成し、プロジェクトのモジュールパスを指定します。
第4章 リクエストのデータ構造とその処理 (2024.02)
http://localhost:6060/pkg/net/url/#URL
type URL struct {…}
http://localhost:6060/pkg/net/http/#Header
type Header map[string][]string
ヘッダーは、HTTP ヘッダー内のキーと値のペアを表します。(Headerはhttp.Header型のオブジェクト)
http://localhost:6060/pkg/net/http/#Request
type Request struct {
\…
\ Body io.ReadCloser
\…
}
type ReadCloser interface {
\ Reader
\ Closer
}
type Reader interface {
\ Read(p []byte) (n int, err error)
}
pはスライスです。pは[]byte型のスライスであり、スライスはポインタと長さの組み合わせです。スライスは、データの部分配列を参照するためのデータ構造であり、内部的にはポインタでデータの先頭を指し示し、長さや容量の情報も持っています。
func (r *Request) ParseForm() error
rはRequest型のポインタです。
ParseForm は r.Form と r.PostForm を設定します。
func (r *Request) ParseMultipartForm(maxMemory int64) error
ParseMultipartForm は、必要に応じて ParseForm を呼び出します。
func (r *Request) FormValue(key string) string
FormValue は、クエリの名前付きコンポーネントの最初の値を返します。 POST および PUT 本体パラメータは、URL クエリ文字列値よりも優先されます。
func (r *Request) PostFormValue(key string) string
PostFormValue は、POST、PATCH、または PUT リクエスト本文の名前付きコンポーネントの最初の値を返します。 URL クエリ パラメータは無視されます。
type Response struct {…}
type ResponseWriter interface {
\ Header() Header
\ Write([]byte) (int, error)
\ WriteHeader(statusCode int)
}
w.Header().Set(…);
w.Header()の返り値はhttp.Header型のオブジェクト。
func Marshal(v any) ([]byte, error)
Marshal は v の JSON エンコーディングを返します。
type Cookie struct {
\…
\ SameSite SameSite // Go 1.11
\…
}
func (c *Cookie) String() string
String は、Cookie ヘッダー (名前と値のみが設定されている場合) または Set-Cookie 応答ヘッダー (他のフィールドが設定されている場合) で使用する Cookie のシリアル化を返します。
func SetCookie(w ResponseWriter, cookie *Cookie)
SetCookie は、提供された ResponseWriter のヘッダーに Set-Cookie ヘッダーを追加します。
func (r *Request) Cookie(name string) (*Cookie, error)
Cookie は、リクエストで指定された名前付き Cookie を返すか、見つからない場合は ErrNoCookie を返します。
func (enc *Encoding) EncodeToString(src []byte) string
EncodeToString は、src の Base64 エンコーディングを返します。
var URLEncoding = NewEncoding (encodeURL)
URLEncoding は、RFC 4648 で定義されている代替の Base64 エンコーディングです。通常、URL とファイル名で使用されます。
var ErrNoCookie = errors.New(“http: named cookie not present”)
ErrNoCookie は、Cookie が見つからない場合に、リクエストの Cookie メソッドによって返されます。
第5章 テンプレートエンジンを使ったコンテンツの表示
http://localhost:6060/pkg/html/template/#Template.ParseFiles
func (t *Template) ParseFiles(filenames …string) (*Template, error)
ParseFiles は、指定されたファイルを解析し、結果のテンプレートを t に関連付けます。
func (t *Template) Execute(wr io.Writer, data any) error
Execute は、解析されたテンプレートを指定されたデータ オブジェクトに適用し、出力を wr に書き込みます。
ヘルパー関数は、通常、他の関数やメソッドを補助するために使用される短い関数です。template.ParseFiles()は、Goのテンプレートパッケージを使用してHTMLテンプレートをパースするための関数であり、HTMLテンプレートをファイルから読み込む際に使用されます。そのため、一般的な用語として、template.ParseFiles()は「ヘルパー関数」と呼ばれることがあります。(->ChatGPT)
func Must(t *Template, err error) *Template
Must は、(*Template, error) を返す関数の呼び出しをラップし、エラーが非 nil の場合にパニックするヘルパーです。
func (r *Rand) Seed(seed int64)
シードは、提供されたシード値を使用して、ジェネレーターを決定的な状態に初期化します。
func (r *Rand) Intn(n int) int
Intn は、半開区間 [0,n) の非負の擬似乱数を int として返します。
HTMLテンプレートの変更は{{.}}以外の部分なら再読み込みでもいける?。
http://localhost:6060/pkg/time/#Time
時間を使用するプログラムは通常、時間をポインタではなく値として保存し、渡す必要があります。つまり、時間変数と構造体フィールドは *time.Time ではなく、time.Time 型である必要があります。
func (t Time) Format(layout string) string
Format は、引数で定義されたレイアウトに従ってフォーマットされた時間値のテキスト表現を返します。レイアウト形式を表す方法については、Layout という定数のドキュメントを参照してください。
type FuncMap map[string]any
FuncMap は、名前から関数へのマッピングを定義するマップのタイプです。
func New(name string) *Template
New は、指定された名前で新しい HTML テンプレートを割り当てます。
func (t *Template) Funcs(funcMap FuncMap) *Template
Funcs は、引数マップの要素をテンプレートの関数マップに追加します。
func (t *Template) ExecuteTemplate(wr io.Writer, name string, data any) error
ExecuteTemplate は、指定された名前を持つ t に関連付けられたテンプレートを指定されたデータ オブジェクトに適用し、出力を wr に書き込みます。
第2章 Goプログラム「ChitChat」—典型的なGo Webアプリのデザイン (2024.03)
Amazon評価参考に学習の順番を変更。この辺で読む。
func NewServeMux() *ServeMux
NewServeMux は、新しい ServeMux を割り当てて返します。
func FileServer(root FileSystem) Handler
FileServer は、ルートをルートとするファイル システムのコンテンツを含む HTTP リクエストを処理するハンドラーを返します。
type Dir
Dir は、特定のディレクトリ ツリーに制限されたネイティブ ファイル システムを使用して FileSystem を実装します。(これと上によりテキストファイルも画像ファイルも同様に送れる)
init(){…}
Go言語においてinit関数は特別な関数で、プログラムが実行を開始する前に自動的に呼び出されます。各パッケージには複数のinit関数を含めることができ(それぞれのソースファイルに1つずつ)、パッケージがインポートされるときに、そのパッケージ内のすべてのinit関数が自動的に実行されます。
1.引数を取ることも、値を返すこともできません。
2.明示的に呼び出すことはできません(Goランタイムによってのみ呼び出されます)。
3.パッケージ内の任意のソースファイルに定義することができ、そのパッケージがインポートされる際に一度だけ実行されます。
4.複数のinit関数が同一パッケージ内に存在する場合、それらはソースファイルがコンパイラによって取り込まれた順番に実行されます。ただし、その順序は保証されていないため、異なるinit関数間で依存関係を持たせるべきではありません。
init関数の一般的な用途は、プログラム実行前の初期化作業です。たとえば、グローバル変数の初期化や、プログラム実行に必要な特定の条件の検証などに使用されます。(ChatGPT)
Go言語のブランクimport(_ “パッケージ名”)とは?
https://qiita.com/atsutama/items/0444ad3fdb25f095b0d6
ブランクインポートは、パッケージ内のすべての宣言を無視し、パッケージの初期化のみを実行します。これは、パッケージが初期化関数(init関数)やサイドエフェクトを持っている場合に役立ちます。(要するにpkgを使える状態にする処理だけを実行させる)
Go言語にて、Webサーバを構築しているが、ブラウザから画像ファイルを要求された時はどのようにして渡すのか?: (2024.03)
ChatGPT:
Go言語でWebサーバを構築している際に、ブラウザからの画像ファイルの要求に応答する方法はいくつかありますが、一般的な方法の一つは静的ファイル(画像、CSSファイル、JavaScriptファイルなど)を提供するためのハンドラを設定することです。これにより、指定されたディレクトリ内のファイルをWeb経由でアクセス可能にします。
以下は、http.FileServerを使って静的ファイルを提供する簡単な例です:
\package main
\import (
\ “net/http”
\)
\func main() {
\ // 静的ファイルを提供するディレクトリを指定
\ fs := http.FileServer(http.Dir(“./static”))
\ // `/static/`パスへのリクエストをfsで処理するように設定
\ http.Handle(“/static/”, http.StripPrefix(“/static/”, fs))
\
\ // Webサーバを開始
\ http.ListenAndServe(“:8080”, nil)
\}
この例では、カレントディレクトリのstaticフォルダ内のファイルが、URLパス/static/以下で提供されます。例えば、staticフォルダ内にimage.pngという画像ファイルがある場合、ブラウザから’http://localhost:8080/static/image.png’にアクセスすることで画像を取得できます。
http.Dir(“./static”)は、静的ファイルが置かれているディレクトリを指定しています。http.Handle関数を使い、特定のパスに対するリクエストをhttp.FileServerによって提供されるハンドラにルーティングします。http.StripPrefixはリクエストのURLから特定のプレフィックスを削除するために使用され、この場合は/static/パスのリクエストから/static/を取り除き、ファイルサーバが正しいパスでファイルを探せるようにしています。
この方法で、Go言語で作成したWebサーバは、HTML、CSS、JavaScriptファイルだけでなく、画像ファイルなどの静的コンテンツも効率的に提供することができます。
‘http://localhost:8080/static/image.png’ではなく、’http://localhost:8080/image.png’へのアクセスで画像を表示させるにはどうすればよい?
ChatGPT:
‘http://localhost:8080/image.png’のように、ルートディレクトリから直接画像にアクセスするためには、静的ファイルを提供するディレクトリの設定方法を少し変更する必要があります。具体的には、http.Handle関数を使用して、特定のファイルやディレクトリへのルートを設定しますが、この場合は全ての静的ファイルがルートディレクトリに直接マッピングされるようにします。
fs := http.FileServer(http.Dir(“./static”))により、カレントディレクトリ内のstaticディレクトリが静的ファイルのソースとして指定されています。
http.Handle(“/”, fs)により、すべてのリクエスト(ルートディレクトリとそのサブパス)がhttp.FileServerによって処理され、staticディレクトリ内のファイルをルートパスから直接提供するように設定しています。
したがって、staticディレクトリ内にimage.pngが存在する場合、’http://localhost:8080/image.png’にアクセスすることで直接画像が表示されます。この方法を使用すると、URLから直接任意の静的ファイルにアクセスできるようになりますが、すべての静的ファイルが公開される点に注意してください。セキュリティ上の理由から、公開するファイルは慎重に選択することが重要です。
PHPではPOSTで受け取った変数にサニタイズ処理を行うが、Goでは行う必要があるか? (2024.03)
ChatGPT:
はい、GoでもPOSTで受け取った変数にサニタイズ処理を行うことが推奨されます。サニタイズ処理を行うことで、不正な入力や悪意のある入力からアプリケーションを保護し、セキュリティを強化することができます。
一般的なサニタイズ処理には、HTMLエスケープ、SQLインジェクション対策、XSS(クロスサイトスクリプティング)対策などが含まれます。これらの処理を適切に行うことで、セキュリティホールや脆弱性を減少させることができます。
Go言語では、html/templateパッケージを使用してHTMLエスケープを行うことができます。また、SQLインジェクションやXSS対策については、SQLクエリを実行する際にプレースホルダーを使用するなどの方法で対策を施すことが重要です。
例えば、SQLインジェクションを防ぐために、Goのdatabase/sqlパッケージを使用してSQLクエリを実行する際には、以下のようにプレースホルダーを使用して変数を埋め込むことが推奨されます。
stmt, err := db.Prepare(“INSERT INTO users (name, email) VALUES (?, ?)”)
\if err != nil {
\ // エラーハンドリング
\}
\_, err = stmt.Exec(name, email)
\if err != nil {
\ // エラーハンドリング
\}
このようにプレースホルダーを使用することで、SQLインジェクション攻撃からアプリケーションを保護することができます。
総じて、GoでもPHPと同様に、受け取ったデータを適切にサニタイズしてセキュリティを確保することが重要です。
(当初の目的だった静的サイト(https://oldcygwin.web.fc2.com/ )のWeb表示がGoを使ってlocalでできたので、ここで一旦保留してDBの章へ行く)
第6章 データの記憶 —構造体、ファイル、データベース (2024.03)
普通はMySQLなんだろうが、先にSQLiteを使いたい。SQLiteのAPIの作成例は以前ググっていたので、
合わせて情報はここにまとめた。いつかはZaurusで動かしたいとか。。
GoでJS(FW)のDBへのAPIを作ってみる: (2024.01)
react api mysql go、でググった:
https://qiita.com/2san/items/dd2c6d0449262a42b728
https://dev.classmethod.jp/articles/go-sample-rest-api/
https://www.knowledgefactory.net/2022/01/go-lang-reactjs-mysql-crud-example-go.html
go api sqlite、でググった:
https://zenn.dev/dannya/articles/1f80608beaa8c2
https://qiita.com/endo-yuki/items/32a4eb147c5dafb724d1
SQLite Golang、でググった:(2024.03)
https://zenn.dev/teasy/articles/go-sqlite3-sample
https://zenn.dev/tara_is_ok/articles/15b04694466bec
https://iketechblog.com/database-sql-go-sqlite3/
SQLiteのInstと初期化?新DB作成?はこっちにメモ。https://seesaawiki.jp/lifewithslackzaurus_15_0/d/SQLite
https://oldcygwin.web.fc2.com/ のバックエンドをlocalでApache+PHP+MySQLからGo+SQLiteにしてみた。
$ go build main.go shop_form_check.go shop_form_done_sqlite.go
以前、https://seesaawiki.jp/lifewithslackzaurus_15_0/d/HTML/CSS/PHP%a4%ce%ce%fd%bd%ac%20%bc%c2%c1%a9%20%bb%a8%c2%bf%a4%ca%b5%ad%cf%bf で作ったPHPの注文Formを問い合わせFormに改造していたものを、ChatGPTにGo変換させたらできてしまった。バグはあったが。やっぱオープン系はヤバイかも。趣味かバイトまでの方がよいか?。あと学習意欲が減った気がする。
少し学習意欲を取り戻してデバッグしたら、結構バグありそうだった。と思ったがAIに与える情報が不足
していただけだった。DBのIFもMailのIFもちゃんと動いた。Goならメールサーバ無しでsmtpできるのか~。
後からSMTPを基本認証ではなくOAuth2.0にChatGPTに書き直させたらスラスラ書きやがった。(2024.03)
(当初の目的だった静的サイト(https://oldcygwin.web.fc2.com/ )の動的部分?がGoを使ってlocalでできたので、ここで一旦保留する)
依存ファイルも同じdirに置いておけば、自動で一緒にコンパイルしてくれる事が分かった。(2024.07)
$ PATH=$PATH:/usr/local/go/bin GOPATH=~/go go build
$ PATH=$PATH:/usr/local/go/bin GOPATH=~/go go build -o practice820
/*************************************************************************************/
参考AI:
https://chat.openai.com/auth/login
ググっても分からない事はAIに聞く事にした。(2024.01)
AIを使って学習してみると、単に構文だけを教えるだけの入門書やURLは売れなってくるのが予想される。
何か具体的な物を作る事を題材にしないと、書籍は売れなくなると思われる。
基本的にはgodocを見るが、分からない場合はとほほを見て、そこにも無い場合はAIを使う。(2024.02)
go でGithub Copilot を軽く触ってみた
https://qiita.com/kotap15/items/c7a49f3e1a4b0f01e04f
(結局GoはLibを多用するから、AIに良いLibを選んでもらうって事に。慣れてきたらVSCodeもやるか)
\
翻訳AIがあるのに学習する意味はあるのか?、でググるとかなりヒットする。
サーバーを立てる部分以外は、PHPを知っていてAIでGoが書けてしまうのと、日本語を知っていてAIで
英語が書けてしまうのは同じ事だろう。だから英語も中国語も頑張って学習するのは時間のムダでは
ないか?同じ事がPC言語にも言えてしまうのだろうか?。英語学習はムダではないとすれば外国人の
恋人が欲しいとか、接客業の場合だけだろう。接客はロボットだったりすると人は要らない。
PC言語だとちゃんと動いているか確認する場合に、どうしても理解する必要が出てくるか。動作原理
を知らずに結果だけOKは無いな。まだ行けるか?。プログラマはコーディングだけではないしな。
参考書籍:
HTTP通信についての基本知識はこっちにまとめる
https://seesaawiki.jp/lifewithslackzaurus_15_0/d/DB%a4%d8%a4%ceAPI
Goプログラミング実践入門 標準ライブラリでゼロからWebアプリを作る
https://book.impress.co.jp/books/1115101145
https://www.marlin-arms.com/support/goweb/
参考URL:
とほほのGo言語入門 (2022.06)
https://www.tohoho-web.com/ex/golang.html
vscode ブレークポイント 設定 golang、でググった:(2024.02)
https://qiita.com/melty_go/items/eca50ac224ec42b85af1
https://zenn.dev/jboy_blog/articles/9799a68a79c829
(ある関数をCallした時にさらにどのLibのどの関数が呼ばれるかVSみたいなデバッガがあるとよい。
VSCodeのGo/Linux版にもあるだろうか?、ググったらWinやMac版はできるらしい。そのうち試すか)
GolangでMVCなAPIサーバを作るときのディレクトリ構成とプロジェクト生成コマンド 2020.01
https://qiita.com/lon9/items/5239c2707b1557f76c9a
https://qiita.com/tags/go
https://www.sejuku.net/blog/106228#index_id6
Go言語はコードが分かりやすくエラーチェックもしやすいことからWebサーバー・Webサービスの開発、アプリケーション開発、CLI開発、API開発、ドローン・IoT開発などに使用されます。
実際に並行処理がしやすくエラーチェックもしやすいことから、PHP言語の代用として採用される機会も増えています。
GoLangでWebサーバを作成する、でググった:(2024.01)
https://qiita.com/massaaaaan/items/1b4b494b78cc77c69ec8
https://zenn.dev/satumahayato010/articles/b4a6cccbb3bb09
go webdav file server、でググった:(2024.01)
https://taoofmac.com/space/til/2022/11/25/2200
https://pkg.go.dev/golang.org/x/net/webdav
GoからCのライブラリを呼ぶ
https://qiita.com/toshikitsubouchi/items/251f9e69390e1a4260b9
go vs rust web server、でググった:(2024.01)
https://appmaster.io/ja/blog/rubtogonobi-jiao-batsukuendokai-fa
https://gist.github.com/nobonobo/fd702a9c1590ad95c28c043ad572b547
https://qiita.com/daisuke-yamamoto/items/a9744a4375e232b568d8
(とりあえずGoで作ってみて、性能が出ない場合はRustにするか、となるのか?。とっつき易さから)
https://developers.cyberagent.co.jp/blog/archives/31110/
Rust は Go 言語のように、標準ライブラリで Web アプリケーションを作り上げられてしまうということはありません。もちろん自分で実装すれば問題はないわけですが、
https://offers.jp/media/event-report/a_2895
Rustが一番力を発揮するのはシステムプログラミングの領域です。
(つまり、インフラ化したApache/NginxをRustで書き直すというのは分かるが、その一部の機能だけ
欲しいなら標準lib使ってGoで作る方が速い、という事か?)