如何在切片中搜索元素并将其与变量进行比较

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

这就是我解决问题的方法。