とりあえず、Go langを書きたいときのための覚書。
色々なサイトのコードを借用させていただいた。
package main // scanfは初期値では動かないので 追記必要あり→https://qiita.com/someone7140/items/d17cd9ea4abccbec0699 //Go lang は未使用だと怒られます。 //Go言語のパッケージは、関連するGoのコード(関数、型、変数など)を一まとめにするための単位です。 //パッケージはコードの再利用と整理を容易にします。 //→goルーチン・チャンネルについて https://zenn.dev/hsaki/books/golang-concurrency/viewer/goelement import ( "bufio" "fmt" "math/rand" "os" "sync" "time" ) //Go の標準パッケージである fmt パッケージのインポート //interface{} =interface{}型はint, string, boolなどと同じ、golangの型名です。{}の部分まで含めて型名です。 //golangは静的型付け言語のため、本来であれば一つの型で複数の型しかとれないのですが、interface{}型は下のようにどんな型でも受け付けます //interface{}=バリアント的な変数の型っぽい。 //interface と interface{} は別物。interfaceは構造体を使ってクラスのように表現する方法となります。 // go build main.go でexeファイルできるよ。 //【作業ディレクトリにて→cmdで実行】go mod init sample-app func getLuckyNum() { //func getLuckyNum(c chan<- int) { fmt.Println("...") // 占いにかかる時間はランダム rand.Seed(time.Now().Unix()) time.Sleep(time.Duration(rand.Intn(3000)) * time.Millisecond) num := rand.Intn(10) fmt.Printf("Today's your lucky number is %d!\n", num) //チャンネル用 //c <- num } //自作関数 func test(i interface{}) { fmt.Println(i) } //戻り値ありの関数 func test_return(i int) int { return i + 1 } //構造体の宣言 type ningen struct { Name string Age int Weight float32 } //構造体のパラメータに加算する関数 func (n ningen) addWeight(f float32) float32 { return n.Weight + f } //構造体のパラメータを参照する関数。スコープとは・・? func show_kouzoutai(k ningen){ fmt.Printf("%s \n", k.Name) fmt.Printf("%d \n", k.Age) fmt.Printf("%d \n", int(k.Weight)) } //メイン関数 func main() { //go ルーチン(mainとは並列処理)の記述 //メインゴールーチンの中で、別のゴールーチンが終わるのを待っていたい場合はsync.WaitGroup構造体の機能を使います。 //下記処理を加えると go ルーチンの処理が完了したらmainに帰ってくることが出来ます。 //c := make(chan int) var wg sync.WaitGroup wg.Add(1) go func() { defer wg.Done() getLuckyNum() }() wg.Wait() //sync.WaitGroup構造体wgを用意する //wg.Add(1)で、wgの内部カウンタの値を+1する //defer wg.Done()で、ゴールーチンが終了したときにwgの内部カウンタの値を-1するように設定 //wg.Wait()で、wgの内部カウンタが0になるまでメインゴールーチンをブロックして待つ //num := <-c //fmt.Printf("Today's your lucky number is %d!\n", num) //チャンネルを閉じる。 //close(c) var a int = 0 fmt.Printf("Hello world dayoooo\n") test("関数の中だよ。") test(test_return(3016)) fmt.Scanf("%d", &a) //構造体からインスタンスを生成できるよぅ。 neo3016 := ningen{ Name: "neo3016", Age: 45, Weight: 100.6, } fmt.Printf("%#v \n", neo3016) neo3016.Weight = neo3016.addWeight(float32(a)) fmt.Printf("%#v \n", neo3016) fmt.Printf("%d \n", a) fmt.Printf("%s \n", neo3016.Name) fmt.Printf("%d \n", neo3016.Age) fmt.Printf("%d \n", int(neo3016.Weight)) fmt.Printf("ここから関数による参照 \n") show_kouzoutai(neo3016) fmt.Printf("何かのキーで終了します。\n") // Scannerを使って一行読み scanner := bufio.NewScanner(os.Stdin) scanner.Scan() fmt.Println("input is", scanner.Text()) }
Go lang でスクレイピングしたいときのため。他のホームページを参照した。
package main import ( "fmt" "net/http" "github.com/PuerkitoBio/goquery" //ターミナルで go get github.com/PuerkitoBio/goquery でおk ) func main() { // 1. ウェブページの取得 res, err := http.Get("https://neo3016.hatenablog.com/") if err != nil { panic(err) } defer res.Body.Close() // 2. HTMLの解析 doc, err := goquery.NewDocumentFromReader(res.Body) if err != nil { panic(err) } // 3. 必要な情報の抽出 //title := doc.Find("h1.entry-title").Text() //タグ名.クラス名↑ //<h1 class="entry-title"> //<a href="https://neo3016.hatenablog.com/entry/2024/01/06/215805" class="entry-title-link bookmark">Go lang を書きたくなった時のため。</a> //</h1> title := doc.Find("h2#blog-description").Text() //タグ名#ID名↑ //<h2 id="blog-description">好きなことをまとめた備忘録的なそれ。</h2> fmt.Println(title) }