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
感谢您的回复。我甚至没有想到类似的方法。我会着手研究这个问题。谢谢。
更多关于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
}
这个实现使用了包级变量currentBid和currentAsk来存储当前最高值,并通过互斥锁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)
}

