neo3016.log

好きなことをまとめた備忘録的なそれ。

Go lang を書きたくなった時のため。


とりあえず、Go langを書きたいときのための覚書。
色々なサイトのコードを借用させていただいた。

qiita.com

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)
}