職案人

求職・歴史・仏教などについて掲載するつもりだが、自分の思いつきが多いブログだよ。適当に付き合って下さい。

Go言語--ゴルーチン

2023年03月31日 | GO言語
並列実行のゴルーチン


【開発環境】
OS:Win11(64ビット)
go version go1.19.4 windows/amd64
VSCode1.72.2、及びコマンドプロンプト

【ゴルーチンとは】
Goでは、スレッドよりも小さい単位で処理単位であるゴルーチンが並行して動作するように実装されています。→並列処理


【ゴルーチンをするには】
並列実行したい関数は、goを前につけて呼び出すだけでゴルーチンにすることができる


go function()

ゴルーチンを呼び出す側はゴルーチンが終了するのを待ちません。

・サンプルコード
// ゴルーチン
package main

import (
"fmt"
"time"
)

// 一度に文字列(厳密には文字)を1個出力すつことを10回繰り返す関数を定義する
func printjob(s string) {
for i := 0; i < 10; i++ {
time.Sleep(10 * time.Millisecond)
fmt.Printf("%s", s)
}
}

func main() {
fmt.Println("A start")
go printjob("A") //ゴルーチン

fmt.Println("B start")
go printjob("B") //ゴルーチン

fmt.Println("C start")
go printjob("C") //ゴルーチン
//指定した時間だけ待ちます。ここでは1秒
time.Sleep(1*time.Second)

fmt.Printf("\n終了\n")

・実行
PS D:\GO言語\サンプルプログラム\Go-8> go run goroutine.go
A start
B start
C start
CABABCCBABCACBABCACBAACBCABACB
終了

出力が「CABABCCBABCACBABCACBAACBCABACB」になっている店に注目。順番がバラバラなのはゴルーチンの実行順序は状況によって変わるからです。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

任意の型を受け取る関数--interface{}型の引数

2023年03月25日 | GO言語
任意の型を受け取る関数


【開発環境】
OS:Win11(64ビット)
go version go1.19.4 windows/amd64
VSCode1.72.2、及びコマンドプロンプト

◆任意の型を受け取る関数
関数の引数を、interface{}型にすることで、任意の型の値を受け取ることができる。
・サンプルコード
// interint.go
package main

import "fmt"

//print - 整数から10進数と16進数で出力する関数
func print(a interface{}) {
v, ok := a.(int) // intであるか調べる
if ok {
fmt.Printf("10進数で%d 16進数で%x\n", v, v)
} else {
fmt.Println(a)
}
}

func main() {
print(32)
print("Hello World")
print(123.45)
}

・実行
PS D:\GO言語\サンプルプログラム\Go-7\インターフェース> go run interint.go
10進数で32 16進数で20
Hello World
123.45

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

interface{}型--型アサーション

2023年03月21日 | GO言語
interface{}型


【開発環境】
OS:Win11(64ビット)
go version go1.19.4 windows/amd64
VSCode1.72.2、及びコマンドプロンプト

【interface{}型とは】
通常、変数を宣言する時には型もセットで宣言する必要がありますが、interface型を使用すると型にとらわれずに値を代入することができます。

 ただし、通常の変数は変数の型が合っていれば足し算などの演算に使用できますが、interface型は演算には使用できません。

例文
//interface型の関数宣言
func Cry(any interface{}) {
any.Cry()
}
// 構造体Bookの宣言
type Book struct{}
//book変数を作る
book := new( Book)
Cry(book)
しかし、本は鳴かないので先程の関数Cry()を呼び出すことができない!
そこで、anyがインターフェースAnimalを満たす場合だけ、Animal.Cry()を呼び出すようにする必要があります。
そのためには、型アサーションと呼ぶ「any.(Animal)」を使う
//Cry - なんでも鳴くものはなくなくし鳴かない者は鳴かない
func Cry(any interface{}) {
a,ok := any.(Animal) //Animalであるか調べる
if !ok {
fmt.println("鳴かないよ")
return
}
a.Cry()
}

any.(Animal)は、anyがAnimalを満足する時(Dog、Catの場合)、aにAnimalを満足するポインターを返し、OKにはtrueを返す。anyがAnimalを満足しない時(bookの場合)、aにnilポインターを返す。OKにはfalseを返します。

・サンプルコード
//animal3.go
package main

import "fmt"

//Animal - 動物のインターフェース
type Animal interface {
Cry()
}

//Dog - 犬の構造体
type Dog struct{}

//Cry - 犬が吠える
func (d *Dog) Cry() {
fmt.Println("わんわん")
}

//Cat - 猫の構造体
type Cat struct{}

//Cry - 猫が鳴く
func (c *Cat) Cry() {
fmt.Println("にゃーご")
}

//Book - 本の構造体
type Book struct{}

//Cry - 何でも鳴くものは鳴くし鳴かないものは鳴かない
func Cry(any interface{}) {
a, ok := any.(Animal) //Animalで調べる
if !ok {
fmt.Println("鳴かないよ")
return
}
a.Cry()
}

func main() {
//犬と猫を作る
dog := new(Dog)
cat := new(Cat)
//犬と猫がなく
Cry(dog)
Cry(cat)
//本を作る
book := new(Book)
Cry(book) //本は鳴かない
}

・実行
PS D:\GO言語\サンプルプログラム\Go-7\インターフェース> go run animal3.go
わんわん
にゃーご
鳴かないよ













コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Go言語のインターフェース2

2023年03月20日 | GO言語
インターフェース2

【開発環境】
OS:Win11(64ビット)
go version go1.19.4 windows/amd64
VSCode1.72.2、及びコマンドプロンプト

【インターフェースの役目】
インターフェースの役目とは、あくまでも実装すべきメソッドを指定すること!
//Animal インターフェース
type Animal interface {
Cry()
}
と、宣言したら
//犬の構造体
type Dog struct{}
func (d *Dog) Cry() {
fmt.Println("わんわん")
}
// 猫の構造体
type Cat struct{}
func (c *Cat) Cry() {
fmt.Println("にゃーご")
}
のように、Cry()メソッドを実装する事。

◆更に、スライドを使って犬と猫をまとめて鳴かせるには
//犬と猫を作る
dog := new(Dog)
cat := new(Cat)
//犬と猫のスライスを作る
animals := [...]Animal{dog,cat}
for _, a := range animals {
a.Cry()
}

【インターフェースを引数にして関数を定義する】
// animal2.go
package main

import "fmt"

//Animal - 動物のインターフェース
type Animal interface {
Cry()
}

//Dog - 犬の構造体
type Dog struct{}

//Cry - 犬が吠える
func (d *Dog) Cry() {
fmt.Println("わんわん")
}

//Cat - 猫の構造体
type Cat struct{}

//Cry - 猫が鳴く
func (c *Cat) Cry() {
fmt.Println("にゃーご")
}

//Cry - 動物がなく
func Cry(a Animal) {
a.Cry()
}


func main() {
//犬と猫を作る
dog := new(Dog)
cat := new(Cat)
//犬と猫がなく
Cry(dog)
Cry(cat)
}
・実行
PS D:\GO言語\サンプルプログラム\Go-7\インターフェース> go run animal2.go
わんわん
にゃーご

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

go言語のインターフェース

2023年03月10日 | GO言語
インターフェイス


【開発環境】
OS:Win11(64ビット)
go version go1.19.4 windows/amd64
VSCode1.72.2、及びコマンドプロンプト

【インターフェース】
インターフェースとは、インターフェースを介してインターフェースと一致する複数の異なるメソッドを同じ方法で呼び出せるようになる。

インターフェースは、メソッドだけを定義する

・メソッドだけのプログラム(インターフェースを使わない)
// dogcat.go
package main

import "fmt"

//Dog-犬の構造体
type Dog struct{}

//Cry - 犬が吠える
func (d *Dog) Cry() {
fmt.Println("わんわん")
}

//Cat - 猫の構造体
type Cat struct{}

//Cry - 猫が鳴く
func (c *Cat) Cry() {
fmt.Println("にゃ-ご")
}

func main() {
//犬と猫を作る
dog := new(Dog)
Cat := new(Cat)
//犬と猫が鳴く
dog.Cry()
Cat.Cry()
}
・実行
PS D:\GO言語\サンプルプログラム\Go-7\インターフェース> go run dogcat.go
わんわん
にゃ-ご

◆インターフェースを使うプログラム
インターフェースを使用すると、犬とネコを「動物」というカテゴリにまとめて、犬猫の区別無く鳴かせることができる
インターフェース型はメソッドの宣言だけを定義したもので、メソッドには実行するプログラムコードは記述しない!

type name interface {
.....
......
}
・サンプルコード
// animal.go
package main

import "fmt"

//Animal - 動物のインターフェース
type Animal interface {
Cry()
}

//Dog - 犬の構造体
type Dog struct{}

//Cry - 犬が吠える
func (d *Dog) Cry() {
fmt.Println("わんわん")
}

//Cat - 猫の構造体
type Cat struct{}

//Cat - 猫が鳴く
func (c *Cat) Cry() {
fmt.Println("にゃーご")
}

func main() {
//犬と猫を作る
dog := new(Dog)←犬の構造体のポインタ
cat := new(Cat)←猫の構造体のポインタ
//犬と猫が鳴く
dog.Cry()
cat.Cry()
//犬と猫のスライスを作る
animals := [...]Animal{dog, cat}
for _, a := range animals {
a.Cry()←インターフェースならではの表現
}
}


・実行
PS D:\GO言語\サンプルプログラム\Go-7\インターフェース> go run animal.go
わんわん
にゃーご
わんわん
にゃーご


コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする