Golang实现仅当新值大于当前值时更新返回变量的函数

Golang实现仅当新值大于当前值时更新返回变量的函数 我有一个如下所示的函数,它在一个循环中被使用。本质上,在目前的形式下,它会调用一个API,返回包括股票“买入价”和“卖出价”在内的一系列信息。

我的目标是,只有当新信息的价格高于之前的信息时,才“更新”返回的变量。

例如,假设我触发函数,它返回的买入价是1.00。然后再次运行该函数,新的买入价是1.02。由于1.02高于之前的买入价1.00,那么变量会更新为1.02。再假设函数再次运行,此时买入价变为0.95。在这种情况下,我不希望变量被更新,买入价变量应仍为1.02,因为那是“最高值”。

我考虑过使用if/else语句,但似乎没有达到预期效果。任何关于我应朝哪个方向努力的帮助都将非常感激。

func optionHighQuote() (bidH, askH float64) {
url := "https://api.com/v1/markets/quotes"
payload := strings.NewReader("symbols=")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
req.Header.Add("accept", "application/json")

res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := ioutil.ReadAll(res.Body)

//parse response into Json Data
json.Unmarshal([]byte(body), &jsonStockResponse)

var hBid = jsonStockResponse.Quotes.Quote.Bid
var hAsk = jsonStockResponse.Quotes.Quote.Ask

return hBid, hAsk
}

返回信息如下所示:

type QUOTE struct {
Quotes struct {
	Quote struct {
		Symbol           string      `json:"symbol"`
		Description      string      `json:"description"`
		Exch             string      `json:"exch"`
		Type             string      `json:"type"`
		Last             float64     `json:"last"`
		Change           float64     `json:"change"`
		ChangePercentage float64     `json:"change_percentage"`
		Volume           int         `json:"volume"`
		AverageVolume    int         `json:"average_volume"`
		LastVolume       int         `json:"last_volume"`
		TradeDate        int64       `json:"trade_date"`
		Open             interface{} `json:"open"`
		High             interface{} `json:"high"`
		Low              interface{} `json:"low"`
		Close            interface{} `json:"close"`
		Prevclose        float64     `json:"prevclose"`
		Week52High       float64     `json:"week_52_high"`
		Week52Low        float64     `json:"week_52_low"`
		Bid              float64     `json:"bid"`
		Bidsize          int         `json:"bidsize"`
		Bidexch          string      `json:"bidexch"`
		BidDate          int64       `json:"bid_date"`
		Ask              float64     `json:"ask"`
		Asksize          int         `json:"asksize"`
		Askexch          string      `json:"askexch"`
		AskDate          int64       `json:"ask_date"`
		OpenInterest     int         `json:"open_interest"`
		Underlying       string      `json:"underlying"`
		Strike           float64     `json:"strike"`
		ContractSize     int         `json:"contract_size"`
		ExpirationDate   string      `json:"expiration_date"`
		ExpirationType   string      `json:"expiration_type"`
		OptionType       string      `json:"option_type"`
		RootSymbol       string      `json:"root_symbol"`
	} `json:"quote"`
   } `json:"quotes"`
    }

更多关于Golang实现仅当新值大于当前值时更新返回变量的函数的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

感谢您的回复。我甚至没有想到类似的方法。我会着手研究这个问题。谢谢。

更多关于Golang实现仅当新值大于当前值时更新返回变量的函数的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我还没有阅读你的代码,但是 new := maximum(old, pull_new_value()) 不就足够了吗(需要正确实现 maximum 函数)。

new := maximum(old, pull_new_value())

要实现仅在获取的新价格高于当前值时更新返回变量的函数,需要维护一个状态来跟踪当前最高值。由于函数在循环中被调用,可以使用包级变量来存储当前最高买入价和卖出价。

以下是修改后的代码:

package main

import (
    "encoding/json"
    "io/ioutil"
    "net/http"
    "strings"
    "sync"
)

var (
    currentBid float64
    currentAsk float64
    mu         sync.RWMutex
)

type QUOTE struct {
    Quotes struct {
        Quote struct {
            Symbol           string      `json:"symbol"`
            Description      string      `json:"description"`
            Exch             string      `json:"exch"`
            Type             string      `json:"type"`
            Last             float64     `json:"last"`
            Change           float64     `json:"change"`
            ChangePercentage float64     `json:"change_percentage"`
            Volume           int         `json:"volume"`
            AverageVolume    int         `json:"average_volume"`
            LastVolume       int         `json:"last_volume"`
            TradeDate        int64       `json:"trade_date"`
            Open             interface{} `json:"open"`
            High             interface{} `json:"high"`
            Low              interface{} `json:"low"`
            Close            interface{} `json:"close"`
            Prevclose        float64     `json:"prevclose"`
            Week52High       float64     `json:"week_52_high"`
            Week52Low        float64     `json:"week_52_low"`
            Bid              float64     `json:"bid"`
            Bidsize          int         `json:"bidsize"`
            Bidexch          string      `json:"bidexch"`
            BidDate          int64       `json:"bid_date"`
            Ask              float64     `json:"ask"`
            Asksize          int         `json:"asksize"`
            Askexch          string      `json:"askexch"`
            AskDate          int64       `json:"ask_date"`
            OpenInterest     int         `json:"open_interest"`
            Underlying       string      `json:"underlying"`
            Strike           float64     `json:"strike"`
            ContractSize     int         `json:"contract_size"`
            ExpirationDate   string      `json:"expiration_date"`
            ExpirationType   string      `json:"expiration_type"`
            OptionType       string      `json:"option_type"`
            RootSymbol       string      `json:"root_symbol"`
        } `json:"quote"`
    } `json:"quotes"`
}

func optionHighQuote() (bidH, askH float64) {
    url := "https://api.com/v1/markets/quotes"
    payload := strings.NewReader("symbols=")
    req, _ := http.NewRequest("POST", url, payload)
    req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
    req.Header.Add("accept", "application/json")

    res, _ := http.DefaultClient.Do(req)
    defer res.Body.Close()
    body, _ := ioutil.ReadAll(res.Body)

    var jsonStockResponse QUOTE
    json.Unmarshal([]byte(body), &jsonStockResponse)

    newBid := jsonStockResponse.Quotes.Quote.Bid
    newAsk := jsonStockResponse.Quotes.Quote.Ask

    mu.Lock()
    defer mu.Unlock()

    if newBid > currentBid {
        currentBid = newBid
    }
    if newAsk > currentAsk {
        currentAsk = newAsk
    }

    return currentBid, currentAsk
}

这个实现使用了包级变量currentBidcurrentAsk来存储当前最高值,并通过互斥锁mu来确保并发安全。每次调用函数时,会比较新获取的价格与当前存储的最高价格,只有当新价格更高时才更新对应的变量。

示例使用:

func main() {
    // 第一次调用:假设返回 bid=1.00, ask=2.00
    bid, ask := optionHighQuote()
    // bid=1.00, ask=2.00
    
    // 第二次调用:假设返回 bid=1.02, ask=1.98
    bid, ask = optionHighQuote()
    // bid=1.02, ask=2.00 (ask保持不变,因为1.98 < 2.00)
    
    // 第三次调用:假设返回 bid=0.95, ask=2.05
    bid, ask = optionHighQuote()
    // bid=1.02, ask=2.05 (bid保持不变,因为0.95 < 1.02)
}
回到顶部