简介ð©©©
在本教程中,我们将使用GO和Luhn算法构建信用卡验证器。
Luhn算法是用于验证信用卡编号的数学公式。我们将编写一个实现它并使用它来验证卡号的函数。
为了实现这一目标,我们将在GO中构建一个非常简单的服务器,该服务器会处理发布请求,请与卡号提取JSON有效载荷,并在数字有效是否有效时返回JSON响应。
â!â€您需要什么
-
您选择的IDE
-
Postman(或者您可以使用卷曲)
让我们开始编码ð
项目设置
-
为您的项目创建一个新目录,例如
credit-card-validation
。 -
打开一个终端并导航到项目目录:
cd path/to/credit-card-validation
-
在您的项目目录中,创建一个GO文件,我们将实现Luhn算法:
touch luhn_algorithm.go
实现luhn算法
要实现该算法,我已将从Internet获取的公式规则转换为代码。因此,这里没有太多要添加的东西,但是我将使用内联注释的函数发布代码以提供上下文。
package main
func luhnAlgorithm(cardNumber string) bool {
// this function implements the luhn algorithm
// it takes as argument a cardnumber of type string
// and it returns a boolean (true or false) if the
// card number is valid or not
// initialise a variable to keep track of the total sum of digits
total := 0
// Initialize a flag to track whether the current digit is the second digit from the right.
isSecondDigit := false
// iterate through the card number digits in reverse order
for i := len(cardNumber) - 1; i >= 0; i-- {
// conver the digit character to an integer
digit := int(cardNumber[i] - '0')
if isSecondDigit {
// double the digit for each second digit from the right
digit *= 2
if digit > 9 {
// If doubling the digit results in a two-digit number,
//subtract 9 to get the sum of digits.
digit -= 9
}
}
// Add the current digit to the total sum
total += digit
//Toggle the flag for the next iteration.
isSecondDigit = !isSecondDigit
}
// return whether the total sum is divisible by 10
// making it a valid luhn number
return total%10 == 0
}
构建服务器
我们现在将设置一个可以在本地运行的简单服务器。创建一个新的GO文件:touch main.go
我们只要编写一条路线,对于额外的爆发,我们将作为命令行参数传递,而不是对其进行硬编码。
func main() {
args := os.Args
port := args[1]
// Register the creditCardValidator function to handle requests at the root ("/") path.
http.HandleFunc("/", creditCardValidator)
fmt.Println("Listening on port:", port)
// Start an HTTP server listening on the specified port.
err := http.ListenAndServe(":"+port, nil)
if err != nil {
fmt.Println("Error:", err) // Print an error message if the server fails to start.
}
}
在代码中,已放置占位符函数 CreditCardValidator 处理到达路线的请求“/” - 我们现在将在同一文件中实现此功能。
import (
"encoding/json"
"fmt"
"net/http"
"os"
)
type Response struct {
Valid bool `json:"valid"`
}
// creditCardValidator handles the credit card validation logic and JSON response.
func creditCardValidator(writer http.ResponseWriter, request *http.Request) {
// Check if the request method is POST.
if request.Method != http.MethodPost {
// if not, throw an error
http.Error(writer, "Invalid request method", http.StatusMethodNotAllowed)
return
}
// Create a struct to hold the incoming JSON payload.
var cardNumber struct {
Number string `json:"number"` // Number field holds the credit card number.
}
// Decode the JSON payload from the request body into the cardNumber struct.
err := json.NewDecoder(request.Body).Decode(&cardNumber)
if err != nil {
http.Error(writer, "Invalid JSON payload", http.StatusBadRequest)
return
}
// Validate the credit card number using the Luhn algorithm.
isValid := luhnAlgorithm(cardNumber.Number)
// Create a response struct with the validation result.
response := Response{Valid: isValid}
// Marshal the response struct into JSON format.
jsonResponse, err := json.Marshal(response)
if err != nil {
http.Error(writer, "Error creating response", http.StatusInternalServerError)
return
}
// Set the content type header to indicate JSON response.
writer.Header().Set("Content-Type", "application/json")
// Write the JSON response back to the client.
writer.Write(jsonResponse)
}
深度潜水ðÖ
&符号
请注意,当我们解码JSON时,我们在变量cardNumber.
&
be
ðâ
在GO中,&
符号用作“地址”运算符。它用于获得变量的内存地址。当您在变量前使用&
时,它将返回该变量内存位置的指针。
在我们的代码段的上下文中,cardNumber
是一个结构变量,可容纳从JSON有效载荷中提取的信用卡号。 json.NewDecoder
的Decode
函数从输入源读取JSON数据(在这种情况下为Request body r.Body
),并试图用相应的JSON值填充提供的struck的字段(在这种情况下为cardNumber
)。
&cardNumber
部分将指向cardNumber
struct的指针传递给Decode
函数。这允许Decode
函数使用变量的内存地址直接修改cardNumber
结构的字段,而不是制作结构的副本。这是更有效的记忆,您可以使用实际的结构实例而不是副本!
到“元帅”
在GO中,“元帅”是指将GO数据结构(例如结构,地图或数组)转换为其JSON表示的过程。换句话说,这是将GO数据编码为JSON格式的过程,该格式可以通过网络发送或存储在文件中。这就是我们使用json.marshal(response)
时正在做的。
初始化GO模块
-
初始化GO模块以管理依赖项:
go mod init credit-card-validation
最后,运行项目
-
使用GO编译器运行项目。我正在使用端口8080,但是您可以使用任何您喜欢的端口。
go run main.go luhn_algorithm.go 8080
要测试它是否有效,请使用Postman或Curl将邮政请求发送到路由“/”的服务器,并将信用卡号添加到请求正文中:
-
设置标题:content-type:application/json
- 发送职位请求
-
将请求主体设置为
{ "number": "4003600000000014" }
如果一切顺利,您应该收到此响应{"valid": true}
结论ð
祝贺建立信用卡验证器!
让我知道,我还应该实施什么?您喜欢这篇博客文章吗?在您的想法中发表评论,并下次见到ð
ð
您可以在我的github上找到完整的代码库。我的个人资料上的链接