最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go實(shí)現(xiàn)替換(覆蓋)文件某一行內(nèi)容的示例代碼

 更新時(shí)間:2022年07月12日 09:43:28   作者:xiaoyaoyou.xyz  
本文主要介紹了Go實(shí)現(xiàn)替換(覆蓋)文件某一行內(nèi)容的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

1、前言

有這樣一個(gè)需求,我們查找到文件中帶有某個(gè)關(guān)鍵詞的一行內(nèi)容后,對(duì)該行內(nèi)容進(jìn)行替換,替換成我們需要的新內(nèi)容,比如修改網(wǎng)絡(luò)配置文件、修改圖片地址、修改代碼中所有關(guān)鍵詞等,類似于編輯器中的關(guān)鍵詞替換功能,只不過我們是直接判斷文件而已。

2、實(shí)現(xiàn)覆蓋某一行文件內(nèi)容的思路

1、打開文件
2、讀取文件每一行
3、根據(jù)關(guān)鍵詞判斷是否是需要覆蓋的行,是的話則從行開頭寫內(nèi)容,使其覆蓋該行舊內(nèi)容
由于是覆蓋,所以我們有一個(gè)前提是新寫入的內(nèi)容長(zhǎng)度需要大于等于舊內(nèi)容的長(zhǎng)度,至于新內(nèi)容小于舊內(nèi)容的情況下,我們?cè)跀U(kuò)展中再做嘗試,基本思路包括兩個(gè):1、寫入空內(nèi)容覆蓋多出的位置(應(yīng)該不行,可以試一下);2、新內(nèi)容寫入后直接加入換行,然后將之前文件剩余內(nèi)容覆蓋多出來的這部分,還是覆蓋的思想。

3、實(shí)現(xiàn)覆蓋某一行內(nèi)容的代碼示例

我們這里以修改我的虛擬機(jī)中的網(wǎng)絡(luò)配置文件為例做一個(gè)簡(jiǎn)單的示例(記得先備份):

原本的Ubuntu配置文件內(nèi)容:

$ cat /etc/network/interfaces
# interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback

auto ens33
iface ens33 inet static
address 40.40.40.210
gateway 40.40.40.1
netmask 255.255.255.0

然后我們通過address、gateway、netmask等關(guān)鍵詞來修改最后三行的內(nèi)容,以此來修改配置文件中的ip地址、網(wǎng)關(guān)和子網(wǎng)掩碼。

代碼內(nèi)容:

package main

import (
?? ?"bufio"
?? ?"fmt"
?? ?"io"
?? ?"os"
?? ?"strings"
)

func main() {
? ? //讀寫方式打開文件
?? ?file, err := os.OpenFile("/etc/network/interfaces", os.O_RDWR, 0666)
?? ?if err != nil {
?? ??? ?fmt.Println("open file filed.", err)
?? ??? ?return
?? ?}
? ? //defer關(guān)閉文件
?? ?defer file.Close()

? ? //獲取文件大小
?? ?stat, err := file.Stat()
?? ?if err != nil {
?? ??? ?panic(err)
?? ?}
?? ?var size = stat.Size()
?? ?fmt.Println("file size:", size)

? ? //讀取文件內(nèi)容到io中
?? ?reader := bufio.NewReader(file)
?? ?pos := int64(0)
?? ?ip := "40.40.40.220"
?? ?gateway := "40.40.40.1"
?? ?netmask := "255.255.255.0"
?? ?for {
? ? ? ? //讀取每一行內(nèi)容
?? ??? ?line, err := reader.ReadString('\n')
?? ??? ?if err != nil {
? ? ? ? ? ? //讀到末尾
?? ??? ??? ?if err == io.EOF {
?? ??? ??? ??? ?fmt.Println("File read ok!")
?? ??? ??? ??? ?break
?? ??? ??? ?} else {
?? ??? ??? ??? ?fmt.Println("Read file error!", err)
?? ??? ??? ??? ?return
?? ??? ??? ?}
?? ??? ?}
?? ??? ?fmt.Println(line)

? ? ? ? //根據(jù)關(guān)鍵詞覆蓋當(dāng)前行
?? ??? ?if strings.Contains(line, "address") {
?? ??? ??? ?bytes := []byte("address " + ip + "\n")
?? ??? ??? ?file.WriteAt(bytes, pos)
?? ??? ?} else if strings.Contains(line, "gateway") {
?? ??? ??? ?bytes := []byte("gateway " + gateway + "\n")
?? ??? ??? ?file.WriteAt(bytes, pos)
?? ??? ?} else if strings.Contains(line, "netmask") {
?? ??? ??? ?bytes := []byte("netmask " + netmask + "\n")
?? ??? ??? ?file.WriteAt(bytes, pos)
?? ??? ?}

? ? ? ? //每一行讀取完后記錄位置
?? ??? ?pos += int64(len(line))
?? ?}
}

結(jié)果:

$ sudo ./go_build_test_go_linux 
[sudo] xx 的密碼: 
file size: 180
# interfaces(5) file used by ifup(8) and ifdown(8)

auto lo

iface lo inet loopback

auto ens33

iface ens33 inet static

address 40.40.40.210

gateway 40.40.40.1

netmask 255.255.255.0

File read ok!
$ cat /etc/network/interfaces
# interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback

auto ens33
iface ens33 inet static
address 40.40.40.220
gateway 40.40.40.1
netmask 255.255.255.0

關(guān)鍵點(diǎn):每讀取一行記錄目前的移動(dòng)位置,然后調(diào)用file.WriteAt進(jìn)行內(nèi)容覆蓋寫入(不能是追加方式),因?yàn)檎业竭@一行的時(shí)候記錄的位置正好是上一行的末尾,所以正好覆蓋。

4、擴(kuò)展

其實(shí)最方便的方式其實(shí)是shell腳本的方式,然后通過各種語言都可以調(diào)用,并且某些時(shí)候也可以單獨(dú)執(zhí)行腳本。

其次,對(duì)于新內(nèi)容長(zhǎng)度少于舊內(nèi)容的長(zhǎng)度時(shí)無法做到全部覆蓋,這個(gè)時(shí)候就稍微麻煩一點(diǎn),再下下一行的時(shí)候或者其余的內(nèi)容全部讀取然后覆蓋寫入即可。

不明白接口使用的查看一下官方的io包,后面我們也會(huì)再專注整理一下io標(biāo)準(zhǔn)庫的接口。

到此這篇關(guān)于Go實(shí)現(xiàn)替換(覆蓋)文件某一行內(nèi)容的示例代碼的文章就介紹到這了,更多相關(guān)Go 替換文件某一行內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談Golang的GC垃圾回收機(jī)制

    淺談Golang的GC垃圾回收機(jī)制

    本文介紹了Go語言的垃圾回收機(jī)制,通過使用對(duì)象池、減少短生命周期對(duì)象的創(chuàng)建和優(yōu)化內(nèi)存布局等方法,可以有效地減少GC壓力,提高程序的性能,感興趣的可以了解一下
    2024-11-11
  • go連接mysql的項(xiàng)目實(shí)踐

    go連接mysql的項(xiàng)目實(shí)踐

    本文主要介紹了go連接mysql的項(xiàng)目實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • 深入探討Go語言中的map是否是并發(fā)安全以及解決方法

    深入探討Go語言中的map是否是并發(fā)安全以及解決方法

    這篇文章主要來和大家探討?Go?語言中的?map?是否是并發(fā)安全的,并提供三種方案來解決并發(fā)問題,文中的示例代碼講解詳細(xì),需要的可以參考一下
    2023-05-05
  • go開源項(xiàng)目用戶名密碼驗(yàn)證的邏輯鬼才寫法

    go開源項(xiàng)目用戶名密碼驗(yàn)證的邏輯鬼才寫法

    這篇文章主要為大家介紹了go開源項(xiàng)目中發(fā)現(xiàn)的一個(gè)邏輯鬼才寫法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • 詳解Golang時(shí)間處理的踩坑及解決

    詳解Golang時(shí)間處理的踩坑及解決

    在各個(gè)語言之中都有時(shí)間類型的處理,這篇文章主要和大家分享一下Golang進(jìn)行時(shí)間處理時(shí)哪里最容易踩坑以及解決方法,需要的可以參考一下
    2023-01-01
  • Golang判斷struct/slice/map是否相等以及對(duì)比的方法總結(jié)

    Golang判斷struct/slice/map是否相等以及對(duì)比的方法總結(jié)

    平時(shí)開發(fā)中對(duì)比兩個(gè)struct或者map、slice是否相等是經(jīng)常遇到的,有很多對(duì)比的方式,比如==,reflect.DeepEqual(),cmp.Equal()等也是經(jīng)常容易混淆的,這么多種對(duì)比方式,適用場(chǎng)景和優(yōu)缺點(diǎn)都有哪些呢?今天我們來具體總結(jié)一下,感興趣的小伙伴們可以參考借鑒
    2022-11-11
  • golang遍歷時(shí)修改被遍歷對(duì)象的示例詳解

    golang遍歷時(shí)修改被遍歷對(duì)象的示例詳解

    這篇文章主要介紹了golang遍歷時(shí)修改被遍歷對(duì)象的示例代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • go zero微服務(wù)框架logx日志組件剖析

    go zero微服務(wù)框架logx日志組件剖析

    這篇文章主要為大家介紹了go zero微服務(wù)框架logx日志組件剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • 8個(gè)Elasticsearch高頻面試題和答案整理

    8個(gè)Elasticsearch高頻面試題和答案整理

    這篇文章為大家精選了8道Elasticsearch高頻面試題和答案,并且給出了這些知識(shí)點(diǎn)的應(yīng)用場(chǎng)景、也給出了解決這些問題的思路,希望對(duì)大家有所幫助
    2023-06-06
  • 使用go module導(dǎo)入本地包的方法教程詳解

    使用go module導(dǎo)入本地包的方法教程詳解

    go module 將是Go語言默認(rèn)的依賴管理工具。到今天 Go1.14 版本推出之后 Go modules 功能已經(jīng)被正式推薦在生產(chǎn)環(huán)境下使用了。本文重點(diǎn)給大家介紹如何使用 go module 導(dǎo)入本地包,感興趣的朋友一起看看吧
    2020-03-03

最新評(píng)論

唐河县| 民权县| 容城县| 团风县| 彰化市| 济宁市| 灵寿县| 锡林浩特市| 大厂| 新疆| 永川市| 南澳县| 达尔| 城步| 贡嘎县| 金溪县| 宜都市| 宜兰市| 辉南县| 包头市| 缙云县| 岳西县| 广平县| 志丹县| 嫩江县| 汕头市| 喀喇沁旗| 滨海县| 邢台县| 逊克县| 宁德市| 佛教| 武定县| 三河市| 夏津县| 昭觉县| 方山县| 体育| 敦化市| 黑龙江省| 富川|