golang文件內(nèi)容覆蓋問(wèn)題的分析及解決
項(xiàng)目場(chǎng)景:
通過(guò)golang讀取數(shù)據(jù)庫(kù)站點(diǎn)映射配置,生成nginx conf文件,并檢查和重啟nginx服務(wù),已達(dá)到站點(diǎn)自動(dòng)化部署目的。
問(wèn)題描述
當(dāng)目標(biāo)文件中內(nèi)容很長(zhǎng),而寫(xiě)入的內(nèi)容很短時(shí),目標(biāo)文件內(nèi)容無(wú)法完全覆蓋。
package main import ( "os" ) func ConfWrite() error { config := confTemplate() fileName := "/Users/test/Documents/test.txt" f, err := os.OpenFile(fileName, os.O_CREATE|os.O_RDWR, 0666) if err != nil { return err } defer f.Close() if _, err = f.WriteString(config); err != nil { return err } return nil } func confTemplate() string { return ` <<listenPort>> server { listen 80; listen 443 ssl; server_name xxx.com; location / { <<proxyPass>> root /data/test; } }` } func main() { _ = ConfWrite() }
原因分析:
此分析未必正確,日后查到確切原因,再來(lái)補(bǔ)充。
os.OpenFile(fileName, os.O_CREATE|os.O_RDWR, 0666) 此函數(shù)打開(kāi)文件時(shí),緩沖區(qū)的長(zhǎng)度由原文件的內(nèi)容決定。如果使用f.WriteString(str) 寫(xiě)入的str內(nèi)容比原文件緩沖區(qū)的長(zhǎng)度短,則原文件尾部的部分內(nèi)容會(huì)保留。并未實(shí)現(xiàn)完全覆蓋的效果。如果str內(nèi)容比原文件緩沖區(qū)的長(zhǎng)度長(zhǎng),則原文件會(huì)被完全覆蓋。
解決方案:
添加os.O_TRUNC,清空文件。
os.OpenFile(fileName, os.O_CREATE|os.O_RDWR|os.O_TRUNC, 0666)
總結(jié)
到此這篇關(guān)于golang文件內(nèi)容覆蓋問(wèn)題的分析及解決的文章就介紹到這了,更多相關(guān)golang文件內(nèi)容覆蓋內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一百行Golang代碼實(shí)現(xiàn)簡(jiǎn)單并發(fā)聊天室
這篇文章主要為大家詳細(xì)介紹了一百行Golang代碼如何實(shí)現(xiàn)簡(jiǎn)單并發(fā)聊天室,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08Go語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之插入排序示例詳解
這篇文章主要為大家介紹了Go語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之插入排序示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08一文帶你掌握Golang中panic與recover的使用方法
這篇文章主要介紹了Golang中panic與recover的作用和使用方法,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,需要的小伙伴可以參考一下2023-04-04我放棄Python轉(zhuǎn)Go語(yǔ)言的9大理由(附優(yōu)秀書(shū)籍推薦)
這篇文章主要給大家介紹了關(guān)于我放棄Python轉(zhuǎn)Go語(yǔ)言的9大理由,以及給大家推薦了6本優(yōu)秀的go語(yǔ)言書(shū)籍,對(duì)同樣想學(xué)習(xí)golang的朋友們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-10-10Golang?中的?unsafe.Pointer?和?uintptr詳解
這篇文章主要介紹了Golang中的unsafe.Pointer和uintptr詳解,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-08-08Golang使用協(xié)程實(shí)現(xiàn)批量獲取數(shù)據(jù)
服務(wù)端經(jīng)常需要返回一個(gè)列表,里面包含很多用戶數(shù)據(jù),常規(guī)做法當(dāng)然是遍歷然后讀緩存。使用Go語(yǔ)言后,可以并發(fā)獲取,極大提升效率,本文就來(lái)聊聊具體的實(shí)現(xiàn)方法,希望對(duì)大家有所幫助2023-02-02Go語(yǔ)言調(diào)用SiliconFlow實(shí)現(xiàn)文本轉(zhuǎn)換為MP3格式
這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言如何調(diào)用?SiliconFlow?語(yǔ)音生成?API?的腳本,用于將文本轉(zhuǎn)換為?MP3?格式的語(yǔ)音文件,感興趣的小伙伴可以了解下2025-02-02go開(kāi)發(fā)alertmanger實(shí)現(xiàn)釘釘報(bào)警
本文主要介紹了go開(kāi)發(fā)alertmanger實(shí)現(xiàn)釘釘報(bào)警,通過(guò)自己的url實(shí)現(xiàn)alertmanager的釘釘報(bào)警,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07一文教你如何用好GO語(yǔ)言變長(zhǎng)參數(shù)
對(duì)于函數(shù)重載相信編碼過(guò)的?xdm?肯定不會(huì)陌生,那么我們一起分別來(lái)看看?C?語(yǔ)言,C++?語(yǔ)言,GO?語(yǔ)言?如何去模擬和使用重載,感興趣的可以學(xué)習(xí)一下2023-09-09golang實(shí)現(xiàn)http服務(wù)器處理靜態(tài)文件示例
這篇文章主要介紹了golang實(shí)現(xiàn)http服務(wù)器處理靜態(tài)文件的方法,涉及Go語(yǔ)言基于http協(xié)議處理文件的相關(guān)技巧,需要的朋友可以參考下2016-07-07