参照渡しの同じ変数を変更する複数のゴルーチンを実行しようとしています。Golang複数のゴルーチンが同じ変数を参照で共有する
しかし、私はこれを実装した方法が機能的に間違っていると確信しています。私のテストでは動作しているように見えますが、第2のゴルーチンが最初のゴルーチンよりも実行にかなり長い時間がかかる場合、最初のゴルーチンが完了すると、このパターンが親関数を終了させるという感じがします。
あなたのご意見・ご提案・アドバイスをお待ちしております。
package auth
import (
"regexp"
zxcvbn "github.com/nbutton23/zxcvbn-go"
"golang.org/x/net/context"
)
type AuthService struct{}
func NewAuthService() *AuthService {
return &AuthService{}
}
func (this *AuthService) ValidateCredentials(ctx context.Context, req *ValidateCredentialsRequest) (*ValidateCredentialsResponse, error) {
c := make(chan *ValidateCredentialsResponse)
go validatePassword(req.GetPassword(), c)
go validateUsername(req.GetUsername(), c)
c <- &ValidateCredentialsResponse{IsValid: true}
return <-c, nil
}
func validateUsername(email string, c chan *ValidateCredentialsResponse) {
for {
res := <-c
if email == "" {
res.IsValid = false
res.Username = "Please provide your email address."
} else if len(email) > 128 {
res.IsValid = false
res.Username = "Email address can not exceed 128 characters."
} else if !regexp.MustCompile(`[email protected]+`).MatchString(email) {
res.IsValid = false
res.Username = "Please enter a valid email address."
}
c <- res
}
}
func validatePassword(password string, c chan *ValidateCredentialsResponse) {
for {
res := <-c
if password == "" {
res.IsValid = false
res.Password = "Please provide your password."
} else {
quality := zxcvbn.PasswordStrength(password, []string{})
if quality.Score < 3 {
res.IsValid = false
res.Password = "Your password is weak."
}
}
c <- res
}
}
を上記のコードを書くための慣用的な方法は、値を返す単純な関数としてvalidatePasswordとvalidateUsernameを書くことです。ゴルーチンはここでは何の価値も提供していません。 –