如何在切片中搜索元素并将其与变量进行比较
How to search for an element in a slice and compare it with a variable
我想创建一个简单的逻辑分别是:
if stringCatchedFromBodyJSON != stringStoragedInMySlice {
//Do stuff
}else{
//Do more stuff
}
我试过:
if !storage.Contains(database.USER, stringCatchedFromBodyJSON){ //Says ".Contains" isn't declared}
if stringCatchedFromBodyJSON != dataBaseUsers { //Force databaseUsers to string = "" intead of comparing}
如果 stringCatchedFromBodyJSON 等于 stringStoragedInMySlice,则创建一个函数 return 为真,但程序在进入该函数时崩溃:
if itemExists(storage, stringCatchedFromBodyJSON) == true {}
func itemExists(arrayType interface{}, item interface{}) bool {
arr := reflect.ValueOf(arrayType)
if arr.Kind() != reflect.Array {
panic("Invalid data-type")
}
for i := 0; i < arr.Len(); i++ {
if arr.Index(i).Interface() == item {
return true
}
}
return false
}
我有这个数组列表:
func arrayList() {
storage = append(storage, Database{USER: "Max", PASSWORD: "1234"})
storage = append(storage, Database{USER: "Rob", PASSWORD: "5678"})
storage = append(storage, Database{USER: "Lee", PASSWORD: "9101"})
storage = append(storage, Database{USER: "Joe", PASSWORD: "1213"})
storage = append(storage, Database{USER: "May", PASSWORD: "1415"})
}
而这个结构:
type Database struct {
USER string `json:"user"`
PASSWORD string `json:"password"`
}
我已经通过使用 Postman 和 IT WORKS 模拟我的 Put HTTP 方法的主体来添加一个新的“用户”:
{
"name":"Moe",
"id":"1234"
}
我无法创建 if 语句来保留要添加到切片上的重复名称。
如果你想看我的整个程序,给你!:
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"log"
"net/http"
)
var (
stringCatchedFromBodyJSON string
IDString string
storageConvertedToBytes []byte
err error
msg Message
database Database
storage []Database
)
// Message is were body.json of method POST will be located.
type Message struct {
NAME string `json:"name"`
ID string `json:"id"`
}
// Database is an example of a database
type Database struct {
USER string `json:"user"`
PASSWORD string `json:"password"`
}
// You can add or remove manually this lines of code in order to edit the slice.
func arrayList() {
storage = append(storage, Database{USER: "Max", PASSWORD: "1234"})
storage = append(storage, Database{USER: "Rob", PASSWORD: "5678"})
storage = append(storage, Database{USER: "Lee", PASSWORD: "9101"})
storage = append(storage, Database{USER: "Joe", PASSWORD: "1213"})
storage = append(storage, Database{USER: "May", PASSWORD: "1415"})
}
func put(w http.ResponseWriter, r *http.Request) {
if r.Method == "PUT" {
_, err = json.Marshal(storage)
arrayList()
// Read body.
b, err := ioutil.ReadAll(r.Body)
defer r.Body.Close()
if err != nil {
http.Error(w, err.Error(), 500)
return
}
// Unmarshal.
err = json.Unmarshal(b, &msg)
if err != nil {
http.Error(w, err.Error(), 500)
return
}
stringCatchedFromBodyJSON = msg.NAME
IDString = msg.ID
if stringCatchedFromBodyJSON != database.USER {
storage = append(storage, Database{USER: stringCatchedFromBodyJSON, PASSWORD: IDString})
storageConvertedToBytes, _ = json.Marshal(storage)
w.Header().Set("content-type", "application/json")
w.Write(storageConvertedToBytes)
} else {
w.Header().Set("content-type", "application/json")
w.Write([]byte("User already exist"))
}
} else {
w.Header().Set("content-type", "application/json")
w.Write([]byte("Wrong http method"))
}
}
func main() {
PORT := ":8000"
http.HandleFunc("/put", put)
log.Println("Starting server on address", PORT)
err := http.ListenAndServe(PORT, nil)
if err != nil {
fmt.Println(err)
panic(err)
}
}
我为解决这个问题而实现的功能是:
func searchForName() bool {
for i := range storage {
if storage[i].USER == stringCatchedFromBodyJSON {
return true
}
}
return false
}
我在 if 语句中实现了这个函数:
stringCatchedFromBodyJSON = msg.NAME
IDString = msg.ID
if searchForName() == false {
storage = append(storage, Database{USER: stringCatchedFromBodyJSON, PASSWORD: IDString})
storageConvertedToBytes, _ = json.Marshal(storage)
w.Header().Set("content-type", "application/json")
w.Write(storageConvertedToBytes)
} else {
w.Header().Set("content-type", "application/json")
w.Write([]byte("User already exist"))
}
这就是我解决问题的方法。
我想创建一个简单的逻辑分别是:
if stringCatchedFromBodyJSON != stringStoragedInMySlice {
//Do stuff
}else{
//Do more stuff
}
我试过:
if !storage.Contains(database.USER, stringCatchedFromBodyJSON){ //Says ".Contains" isn't declared}
if stringCatchedFromBodyJSON != dataBaseUsers { //Force databaseUsers to string = "" intead of comparing}
如果 stringCatchedFromBodyJSON 等于 stringStoragedInMySlice,则创建一个函数 return 为真,但程序在进入该函数时崩溃:
if itemExists(storage, stringCatchedFromBodyJSON) == true {}
func itemExists(arrayType interface{}, item interface{}) bool {
arr := reflect.ValueOf(arrayType)
if arr.Kind() != reflect.Array {
panic("Invalid data-type")
}
for i := 0; i < arr.Len(); i++ {
if arr.Index(i).Interface() == item {
return true
}
}
return false
}
我有这个数组列表:
func arrayList() {
storage = append(storage, Database{USER: "Max", PASSWORD: "1234"})
storage = append(storage, Database{USER: "Rob", PASSWORD: "5678"})
storage = append(storage, Database{USER: "Lee", PASSWORD: "9101"})
storage = append(storage, Database{USER: "Joe", PASSWORD: "1213"})
storage = append(storage, Database{USER: "May", PASSWORD: "1415"})
}
而这个结构:
type Database struct {
USER string `json:"user"`
PASSWORD string `json:"password"`
}
我已经通过使用 Postman 和 IT WORKS 模拟我的 Put HTTP 方法的主体来添加一个新的“用户”:
{
"name":"Moe",
"id":"1234"
}
我无法创建 if 语句来保留要添加到切片上的重复名称。
如果你想看我的整个程序,给你!:
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"log"
"net/http"
)
var (
stringCatchedFromBodyJSON string
IDString string
storageConvertedToBytes []byte
err error
msg Message
database Database
storage []Database
)
// Message is were body.json of method POST will be located.
type Message struct {
NAME string `json:"name"`
ID string `json:"id"`
}
// Database is an example of a database
type Database struct {
USER string `json:"user"`
PASSWORD string `json:"password"`
}
// You can add or remove manually this lines of code in order to edit the slice.
func arrayList() {
storage = append(storage, Database{USER: "Max", PASSWORD: "1234"})
storage = append(storage, Database{USER: "Rob", PASSWORD: "5678"})
storage = append(storage, Database{USER: "Lee", PASSWORD: "9101"})
storage = append(storage, Database{USER: "Joe", PASSWORD: "1213"})
storage = append(storage, Database{USER: "May", PASSWORD: "1415"})
}
func put(w http.ResponseWriter, r *http.Request) {
if r.Method == "PUT" {
_, err = json.Marshal(storage)
arrayList()
// Read body.
b, err := ioutil.ReadAll(r.Body)
defer r.Body.Close()
if err != nil {
http.Error(w, err.Error(), 500)
return
}
// Unmarshal.
err = json.Unmarshal(b, &msg)
if err != nil {
http.Error(w, err.Error(), 500)
return
}
stringCatchedFromBodyJSON = msg.NAME
IDString = msg.ID
if stringCatchedFromBodyJSON != database.USER {
storage = append(storage, Database{USER: stringCatchedFromBodyJSON, PASSWORD: IDString})
storageConvertedToBytes, _ = json.Marshal(storage)
w.Header().Set("content-type", "application/json")
w.Write(storageConvertedToBytes)
} else {
w.Header().Set("content-type", "application/json")
w.Write([]byte("User already exist"))
}
} else {
w.Header().Set("content-type", "application/json")
w.Write([]byte("Wrong http method"))
}
}
func main() {
PORT := ":8000"
http.HandleFunc("/put", put)
log.Println("Starting server on address", PORT)
err := http.ListenAndServe(PORT, nil)
if err != nil {
fmt.Println(err)
panic(err)
}
}
我为解决这个问题而实现的功能是:
func searchForName() bool {
for i := range storage {
if storage[i].USER == stringCatchedFromBodyJSON {
return true
}
}
return false
}
我在 if 语句中实现了这个函数:
stringCatchedFromBodyJSON = msg.NAME
IDString = msg.ID
if searchForName() == false {
storage = append(storage, Database{USER: stringCatchedFromBodyJSON, PASSWORD: IDString})
storageConvertedToBytes, _ = json.Marshal(storage)
w.Header().Set("content-type", "application/json")
w.Write(storageConvertedToBytes)
} else {
w.Header().Set("content-type", "application/json")
w.Write([]byte("User already exist"))
}
这就是我解决问题的方法。