免費(fèi)瀏覽網(wǎng)站的軟件優(yōu)化關(guān)鍵詞具體要怎么做
目錄
包(package)是組織和復(fù)用代碼的基本單元。
包的種類:
包的導(dǎo)入
包的組成
如下兩個文件中定義了A變量和 sc_num變量,他們的首字母開頭分別為大寫和小寫,因此可以說明A變量是公有變量,而sc_num是私有變量。
go?風(fēng)格指南
go中的Init函數(shù)
如何導(dǎo)入第三方包:
1、查看go的配置變量基本信息
2、開啟GOMODULE管理方式(默認(rèn)GO111MODULE=auto)
3、啟用國內(nèi)下載代理
4、創(chuàng)建go.mod文件
?編輯5、安裝第三方包
go第三方安裝包下載官網(wǎng):Go Packages - Go Packages
6、導(dǎo)入實(shí)驗代碼
7、運(yùn)行程序:
8、測試Web服務(wù)
如何在linux上運(yùn)行該go語言Web服務(wù)器?
1、首先安裝go語言環(huán)境
2、如果版本太低了,就需要卸載原來的go版本,安裝新的go版本,而這則需要源碼安裝
3、源碼安裝go
4、部署Web服務(wù)
5、運(yùn)行g(shù)o語言程序
6、測試Web服務(wù)效果:
go的切片與數(shù)組(詳細(xì)的數(shù)據(jù)傳輸解釋)(go傳遞數(shù)據(jù)的時候使用的是傳值的方式)
切片類型下數(shù)據(jù)的傳遞方式:?
數(shù)組類型下數(shù)據(jù)的傳遞方式:
什么是傳值和傳地址,他們的區(qū)別又是什么?
傳值和傳址的區(qū)別總結(jié)如下:
如何在go的函數(shù)中直接修改原數(shù)據(jù)的數(shù)組呢,而不是修改函數(shù)副本空間中的復(fù)制的數(shù)組呢?
如果輸入數(shù)據(jù)超過切片的容量限制,會發(fā)生什么呢?
go的文件操作(文件的讀寫方式):
什么時候會用到go中的文件讀寫呀
包(package)是組織和復(fù)用代碼的基本單元。
一個包可以包含多個Go源文件(以.go
為擴(kuò)展名),這些文件通常屬于同一個功能或領(lǐng)域。每個源文件的開頭都需要聲明所屬的包名。
包名 --》告知當(dāng)前這個go文件屬于哪個包(目錄)
go文件 --》定義包中的內(nèi)容(代碼寫在go文件中)
? ? ? ? --》main --》這是一個主運(yùn)行文件
包的種類:
標(biāo)準(zhǔn)庫包(Standard Library Packages):Go標(biāo)準(zhǔn)庫提供了豐富的包來支持各種常見任務(wù)和功能,如字符串處理、文件操作、網(wǎng)絡(luò)通信等。這些包無需額外安裝,可以直接使用。(內(nèi)置包:不需要安裝、直接import導(dǎo)入即可使用)
第三方包(Third-Party Packages):Go社區(qū)擁有眾多的第三方包,以滿足各種特定需求。這些包通常由其他開發(fā)者或組織維護(hù),并且需要使用工具如Go Modules或GOPATH來管理和導(dǎo)入。(第三方包:需要安裝,再導(dǎo)入使用)
自定義包(Custom Packages):任何人都可以創(chuàng)建自己的Go包,并根據(jù)需要組織和導(dǎo)出函數(shù)、類型和變量。自定義包使代碼更易于重用和維護(hù)??梢酝ㄟ^在代碼文件的開頭使用
package
關(guān)鍵字聲明包名,并使用import
語句在其他代碼中導(dǎo)入自定義包。(自定義包:自己寫的go包)
包的導(dǎo)入
// import "sc/user"? ? ? 直接導(dǎo)入包的內(nèi)容
// import u "sc/user"? ?導(dǎo)入之后取別名
// import _ "sc/user"? ?僅執(zhí)行init函數(shù)中的內(nèi)容
// import . "sc/user"? ? 導(dǎo)入包中所有的內(nèi)容
包的組成
一個目錄表示一個包(sanchuang)、user子包
代碼寫到go文件中?=>?
第一行聲明當(dāng)前文件屬于當(dāng)個包(建議包名與目錄名同名)
同一個包下的文件,聲明的包名應(yīng)該一致
同一個包中,變量、函數(shù)等都是共享的(相互可見的)
文件中定義的對象?=》大寫的標(biāo)識符?表示Public?,?小寫的標(biāo)識符表示Private以大寫字母開頭的標(biāo)識符(如變量名,函數(shù)名),都是表示Public
以小寫字母開頭的標(biāo)識符,都是表示Private
如下兩個文件中定義了A變量和 sc_num變量,他們的首字母開頭分別為大寫和小寫,因此可以說明A變量是公有變量,而sc_num是私有變量。
?main文件
package main// import 包名/子包名
// 取別名 => 有時候有些包的名字特別長.可以取別名
//u "sc/user"
// 僅僅執(zhí)行sc/user包中的初始化信息
//_ "sc/user"
//. "sc/user"
// 注意事項:包名與目錄名不一致,必須取一個別名 "sc/user" => 路徑
//import (
// "fmt"
// "sc/user"
//)
import "fmt"
import u "sc/user"func main(){fmt.Printf("start.....")//TeacherInfo()user.TeacherInfo()//u.TeacherInfo()//TeacherInfo()變量,大寫字母開頭,小寫字母開頭大寫字母開頭的變量,Public//fmt.Println(user.A)// 小寫字母開頭,私有的不能使用//fmt.Println(user.sc_num)
}// init函數(shù) => 初始化一些變量/數(shù)據(jù)的時候使用
func init(){fmt.Println("main init1")
}
func init(){fmt.Println("main init2")
}
go?風(fēng)格指南
//?包名?=>?小寫+單數(shù)
//?文件名?=>?小寫+下劃線
//?函數(shù)、結(jié)構(gòu)體、接口、...:大駝峰?=>?UserName
//?變量名?=>?小駝峰?=>?userName
go中的Init函數(shù)
init
函數(shù)是一種特殊的函數(shù)(初始化函數(shù)),它在程序運(yùn)行時自動執(zhí)行,而不需要顯式調(diào)用。
init
函數(shù)有以下特點(diǎn):
init
?函數(shù)沒有參數(shù)和返回值。- 一個包中可以定義多個init,一個文件中也可以定義多個init
- 當(dāng)一個程序運(yùn)行時,首先會按照包的導(dǎo)入順序初始化包級別的變量和常量。
- 然后,在完成包級別的變量和常量初始化后,會按照導(dǎo)入順序依次執(zhí)行每個包中的?
init
?函數(shù)。- 如果一個包中有多個?
init
?函數(shù),它們的執(zhí)行順序與定義順序相同。當(dāng)包被導(dǎo)入的時候init函數(shù)自動執(zhí)行()
init
函數(shù)通常用于執(zhí)行一些初始化操作,例如注冊驅(qū)動、初始化全局變量、設(shè)置配置信息等。它可以提供程序運(yùn)行前的一些準(zhǔn)備工作。
下面是一個示例,展示了 init
函數(shù)的使用:
package mainimport ("fmt"
)var a intfunc init() {fmt.Println("初始化 a 變量")a = 10
}func main() {fmt.Println("main 函數(shù)執(zhí)行")fmt.Println("a =", a)
}
在上面的例子中,init
函數(shù)用來初始化變量 a
。當(dāng)程序運(yùn)行時,先執(zhí)行 init
函數(shù),然后再執(zhí)行 main
函數(shù)。輸出結(jié)果為:
初始化 a 變量 main 函數(shù)執(zhí)行 a = 10
需要注意的是,init
函數(shù)在程序中只會執(zhí)行一次,無論包被導(dǎo)入多少次。而且它不可以被其他函數(shù)調(diào)用或引用。
如何導(dǎo)入第三方包:
1、查看go的配置變量基本信息
go env --》查看go的配置變量信息D:\衡山-開發(fā)\GO\Day_01\2023-07-21-go模塊與包\sanchuang>go env
set GO111MODULE=auto #用于控制Go Modules(模塊)的行為
set GOARCH=amd64
set GOBIN=
set GOCACHE=C:\Users\23843\AppData\Local\go-build
set GOENV=C:\Users\23843\AppData\Roaming\go\env
set GOEXE=.exe
set GOEXPERIMENT=
set GOFLAGS=
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GOINSECURE=
set GOMODCACHE=C:\Users\23843\go\pkg\mod
set GONOPROXY=
set GONOSUMDB=
set GOOS=windows
set GOPATH=C:\Users\23843\go #指定Go語言工作區(qū)的根目錄,被用來指定存放Go源代碼、編譯后二進(jìn)制文件和第三方包的位置。三方的依賴都安裝到$GOPATH/pkg/mod目錄下
set GOPRIVATE=
set GOPROXY=https://goproxy.cn,direct #設(shè)置Go模塊的代理服務(wù)器,默認(rèn)情況下,Go模塊會從官方的代理服務(wù)器 https://proxy.golang.org 下載模塊的依賴包,但是我們需要修改為國內(nèi)源,direct:直接從源地址下載依賴包,不通過代理服務(wù)器。
set GOROOT=E:\Go #指定Go語言的安裝路徑,包含了Go語言的標(biāo)準(zhǔn)庫和工具,$GOROOT\src:go的標(biāo)準(zhǔn)模塊存儲的地方
set GOSUMDB=sum.golang.org
set GOTMPDIR=
set GOTOOLDIR=E:\Go\pkg\tool\windows_amd64
set GOVCS=
set GOVERSION=go1.19.2
set GCCGO=gccgo
set GOAMD64=v1
set AR=ar
set CC=gcc
set CXX=g++
set CGO_ENABLED=1
set GOMOD=D:\衡山-開發(fā)\GO\Day_01\2023-07-21-go模塊與包\sanchuang\go.mod
set GOWORK=
set CGO_CFLAGS=-g -O2
set CGO_CPPFLAGS=
set CGO_CXXFLAGS=-g -O2
set CGO_FFLAGS=-g -O2
set CGO_LDFLAGS=-g -O2
set PKG_CONFIG=pkg-config
set GOGCCFLAGS=-m64 -mthreads -Wl,--no-gc-sections -fmessage-length=0 -fdebug-prefix-map=C:\Users\23843\AppData\Local\Temp\go-build3093873577
=/tmp/go-build -gno-record-gcc-switchesD:\衡山-開發(fā)\GO\Day_01\2023-07-21-go模塊與包\sanchuang>
GO MODULES:是自Go 1.11版本引入的官方依賴管理工具,用于管理Go項目中的包版本和依賴關(guān)系。它解決了早期Go語言項目中對于第三方包的管理問題。
功能:依賴管理、版本選擇、自動拉取、代理服務(wù)器支持、私有倉庫支持
使用Go Modules的基本步驟如下:
初始化模塊:在項目根目錄下執(zhí)行
go mod init + 《項目名》
命令,可以創(chuàng)建一個新的go.mod文件來初始化模塊。導(dǎo)入依賴包:通過
import
語句導(dǎo)入所需的依賴包。Go Modules會自動檢測并下載缺失的依賴包。構(gòu)建和運(yùn)行:使用
go build
命令構(gòu)建項目,并使用go run
命令運(yùn)行項目。管理依賴:可以使用
go get
命令來添加、更新或刪除依賴包。Go Modules會自動更新go.mod文件和下載相應(yīng)的包。版本控制:可以在go.mod文件中指定所需的包版本,使用正確的語義版本控制規(guī)則。
因此我們創(chuàng)建的包中必須包含一個go.mod文件(下面的步驟都是在你的項目地址下進(jìn)行的)
D:\衡山-開發(fā)\GO\Day_01\2023-07-21-go模塊與包\MyWeb
2、開啟GOMODULE管理方式(默認(rèn)GO111MODULE=auto)
go env -w GO111MODULE=on
3、啟用國內(nèi)下載代理
go env -w GOPROXY=https://goproxy.cn,direct
4、創(chuàng)建go.mod文件
go mod init web
5、安裝第三方包
單個依賴安裝
go get github.com/gin-gonic/gin
整體項目依賴的處理
go mod tidy
go第三方安裝包下載官網(wǎng):Go Packages - Go Packages
6、導(dǎo)入實(shí)驗代碼
package main//server.go是主運(yùn)行文件
import ("github.com/gin-gonic/gin""net/http"
)
//gin是go中的一個Web框架// 入口函數(shù)
func main(){// 創(chuàng)建一個web服務(wù)器r := gin.Default()// 當(dāng)訪問/sc => 返回{"message":"hello sanchang"}r.GET("/sc", func(c *gin.Context){// 200,c.JSON(http.StatusOK, gin.H{"message": "hello, sanchuang",})})// 運(yùn)行web服務(wù)r.Run()
}
?
7、運(yùn)行程序:
運(yùn)行項目
go run server.go
8、測試Web服務(wù)
訪問網(wǎng)址http://127.0.0.1:8080/sc
?
如何在linux上運(yùn)行該go語言Web服務(wù)器?
1、首先安裝go語言環(huán)境
[root@master ~]# yum install golang -y
2、如果版本太低了,就需要卸載原來的go版本,安裝新的go版本,而這則需要源碼安裝
卸載軟件
yum remove go -y
源碼卸載:rm -rf /usr/local/go
3、源碼安裝go
首先找到go的安裝包
路徑:All releases - The Go Programming Language (google.cn)
我們需要安裝go 1.19.11版本的安裝包
wget https://golang.google.cn/dl/go1.19.11.linux-amd64.tar.gz
?解壓安裝包
[root@master ~]# tar -zxf go1.19.11.linux-amd64.tar.gz
?配置環(huán)境變量
[root@master ~]# vim ~/.bashrc#添加下面3條
GOROOT=/usr/local/go
export GOPATH=~/go
export PATH=$PATH:$GOPATH:$GOROOT/bin#重新加載環(huán)境
[root@master ~]# source ~/.bashrc
[root@master ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/scnginx66/sbin:/usr/local/scnginx66/sbin:/root/go:/usr/local/go/bin
移動go程序到/usr/local/ 目錄下,并查看go版本
[root@master ~]# mv go /usr/local/
[root@master ~]# ls /usr/local/go/bin
go gofmt
[root@master ~]# go version
go version go1.19.11 linux/amd64
[root@master ~]#
4、部署Web服務(wù)
首先創(chuàng)建server.go文件存放go語言Web程序
[root@master ~]# cd /
[root@master /]# mkdir myweb
[root@master /]# cd myweb/
[root@master myweb]# vim server.go
[root@master myweb]# ls
server.go
[root@master myweb]# cat server.go
package main//server.go是主運(yùn)行文件
import ("github.com/gin-gonic/gin""net/http"
)
//gin是go中的一個Web框架// 入口函數(shù)
func main(){// 創(chuàng)建一個web服務(wù)器r := gin.Default()// 當(dāng)訪問/sc => 返回{"message":"hello sanchang"}r.GET("/sc", func(c *gin.Context){// 200,c.JSON(http.StatusOK, gin.H{"message": "hello, sanchuang",})})// 運(yùn)行web服務(wù)r.Run()
}
[root@master myweb]#
對go語言模塊進(jìn)行初始化(生成go.mod文件)
[root@master myweb]# go mod init web
go: creating new go.mod: module web
go: to add module requirements and sums:go mod tidy
[root@master myweb]# ls
go.mod server.go
[root@master myweb]#
下面對go語言模塊進(jìn)行加載
[root@master myweb]# go mod tidy
發(fā)現(xiàn)如下錯誤
[root@master myweb]# go mod tidy
go: finding module for package github.com/gin-gonic/gin
web importsgithub.com/gin-gonic/gin: module github.com/gin-gonic/gin: Get "https://proxy.golang.org/github.com/gin-gonic/gin/@v/list": dial tcp 172.217.160.113:443: i/o timeout
[root@master myweb]#
是安裝超時了,我們需要將它的源更改為國內(nèi)源
[root@master myweb]# go env -w GO111MODULE=on
[root@master myweb]# go env -w GOPROXY=https://goproxy.cn,direct
安裝成功:
[root@master myweb]# go mod tidy
go: finding module for package github.com/gin-gonic/gin
go: downloading github.com/gin-gonic/gin v1.9.1
go: found github.com/gin-gonic/gin in github.com/gin-gonic/gin v1.9.1
go: downloading github.com/gin-contrib/sse v0.1.0
go: downloading github.com/mattn/go-isatty v0.0.19
go: downloading golang.org/x/net v0.10.0
go: downloading github.com/stretchr/testify v1.8.3
go: downloading google.golang.org/protobuf v1.30.0
go: downloading github.com/go-playground/validator/v10 v10.14.0
go: downloading github.com/pelletier/go-toml/v2 v2.0.8
go: downloading github.com/ugorji/go/codec v1.2.11
go: downloading gopkg.in/yaml.v3 v3.0.1
go: downloading github.com/bytedance/sonic v1.9.1
go: downloading github.com/goccy/go-json v0.10.2
go: downloading github.com/json-iterator/go v1.1.12
go: downloading golang.org/x/sys v0.8.0
go: downloading github.com/davecgh/go-spew v1.1.1
go: downloading github.com/pmezard/go-difflib v1.0.0
go: downloading github.com/gabriel-vasile/mimetype v1.4.2
go: downloading github.com/go-playground/universal-translator v0.18.1
go: downloading github.com/leodido/go-urn v1.2.4
go: downloading golang.org/x/crypto v0.9.0
go: downloading golang.org/x/text v0.9.0
go: downloading github.com/go-playground/locales v0.14.1
go: downloading github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd
go: downloading github.com/modern-go/reflect2 v1.0.2
go: downloading github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311
go: downloading golang.org/x/arch v0.3.0
go: downloading github.com/twitchyliquid64/golang-asm v0.15.1
go: downloading github.com/klauspost/cpuid/v2 v2.2.4
go: downloading github.com/go-playground/assert/v2 v2.2.0
go: downloading github.com/google/go-cmp v0.5.5
go: downloading gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405
go: downloading golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543
[root@master myweb]#
5、運(yùn)行g(shù)o語言程序
[root@master myweb]# go run server.go
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.- using env: export GIN_MODE=release- using code: gin.SetMode(gin.ReleaseMode)[GIN-debug] GET /sc --> main.main.func1 (3 handlers)
[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.
Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details.
[GIN-debug] Environment variable PORT is undefined. Using port :8080 by default
[GIN-debug] Listening and serving HTTP on :8080
6、測試Web服務(wù)效果:
go的切片與數(shù)組(詳細(xì)的數(shù)據(jù)傳輸解釋)(go傳遞數(shù)據(jù)的時候使用的是傳值的方式)
package mainimport "fmt"// 切片是一種引用類型(存放的是地址)func main(){
// 定義了一個切片 len 0, cap 10
var sli = make([]int, 0, 10)
fmt.Printf("原始sli:%v, %p, %p\n",sli, &sli, sli)
test(sli)
fmt.Printf("執(zhí)行test后sli:%v\n",sli)
// sli[0:cap]
fmt.Printf("執(zhí)行sli[:10]:%v\n",sli[:10])
}func test(sli []int){
fmt.Printf("函數(shù)中sli:%v, %p, %p\n",sli, &sli, sli)
// 將切片追加數(shù)據(jù)
sli = append(sli,10,20,30)
fmt.Printf("函數(shù)中的結(jié)果是:%v\n",sli)
}
輸出的結(jié)果是:
原始sli:[], 0xc000008078, 0xc00001e140
函數(shù)中sli:[], 0xc0000080c0, 0xc00001e140 #源sli和函數(shù)中的副本sli的地址是不一樣的,但是里面的第一個數(shù)據(jù)的地址是一樣的,說明go分配給切片的方式是傳值(傳遞引用),這才會導(dǎo)致兩個不同空間指向的數(shù)據(jù)中的地址都是一樣的
函數(shù)中的結(jié)果是:[10 20 30] #在test中運(yùn)行,go分配空間給test函數(shù)中的sli使用
執(zhí)行test后sli:[] #test執(zhí)行后,go收回分配給test函數(shù)的空間,導(dǎo)致不存在test中的sli切片了
執(zhí)行sli[:10]:[10 20 30 0 0 0 0 0 0 0] #原因是在test中他給副本的sli切片添加了數(shù)值,而副本的sli的數(shù)據(jù)的地址空間與源sli數(shù)據(jù)的地址空間是一樣的,所以才導(dǎo)致源地址空間的sli切片的數(shù)據(jù)發(fā)生了改變這里復(fù)制的是sli這個切片類型,在函數(shù)中復(fù)制的切片s發(fā)生了變化,外面的sl沒有改變但是他們底層的數(shù)組發(fā)生了變化,數(shù)組沒有被復(fù)制還是用的同一個吧
Process finished with exit code 0
切片類型下數(shù)據(jù)的傳遞方式:?
數(shù)組類型下數(shù)據(jù)的傳遞方式:
什么是傳值和傳地址,他們的區(qū)別又是什么?
傳值(go語言):當(dāng)使用傳值方式將參數(shù)傳遞給函數(shù)時,函數(shù)會創(chuàng)建該參數(shù)的一個副本,并在函數(shù)內(nèi)部使用該副本進(jìn)行操作。這意味著對參數(shù)進(jìn)行的任何修改都只會影響到該副本,不會影響原始的參數(shù)。傳值方式適用于簡單的數(shù)據(jù)類型(如整數(shù)、浮點(diǎn)數(shù)、布爾值)或者在函數(shù)內(nèi)部不需要修改原始參數(shù)的情況。
傳地址(python語言):當(dāng)使用傳地址方式將參數(shù)傳遞給函數(shù)時,實(shí)際上是將參數(shù)的內(nèi)存地址傳遞給函數(shù)。這樣,在函數(shù)內(nèi)部可以直接訪問和修改原始參數(shù)的值。因為是直接操作原始參數(shù),所以對參數(shù)的修改會影響到原始參數(shù)的值。傳地址方式適用于復(fù)雜的數(shù)據(jù)類型(如數(shù)組、切片、映射、結(jié)構(gòu)體)或者需要在函數(shù)內(nèi)部修改原始參數(shù)的情況。
傳值和傳址的區(qū)別總結(jié)如下:
- 傳值是將參數(shù)的副本傳遞給函數(shù),對副本的任何修改都不會影響原始參數(shù)。
- 傳地址是將參數(shù)的內(nèi)存地址傳遞給函數(shù),允許直接訪問和修改原始參數(shù)。
- 傳值適用于簡單的數(shù)據(jù)類型或者不需要修改原始參數(shù)的情況。
- 傳地址適用于復(fù)雜的數(shù)據(jù)類型或者需要在函數(shù)內(nèi)部修改原始參數(shù)的情況。
如何在go的函數(shù)中直接修改原數(shù)據(jù)的數(shù)組呢,而不是修改函數(shù)副本空間中的復(fù)制的數(shù)組呢?
go語言中,當(dāng)調(diào)用一個函數(shù)的時候,函數(shù)的每個調(diào)用參數(shù)將會被賦值給函數(shù)內(nèi)部的參數(shù)變量,所以函數(shù)參數(shù)變量接收的是一個復(fù)制的副本,并不是原始調(diào)用的變量。
因為函數(shù)參數(shù)傳遞的機(jī)制導(dǎo)致傳遞大的數(shù)組類型將是低效的,并且對數(shù)組參數(shù)的任何的修改都是發(fā)生在復(fù)制的數(shù)組上,并不能直接修改調(diào)用時原始的數(shù)組變量。
我們可以顯式地傳入一個數(shù)組指針,那樣的話函數(shù)通過指針對數(shù)組的任何修改都可以直接反饋到調(diào)用者。
如果輸入數(shù)據(jù)超過切片的容量限制,會發(fā)生什么呢?
定義了一個切片(slice)變量 sli,
長度為 0,容量為 3,如果輸入數(shù)據(jù)超過容量限制,會直接創(chuàng)建一個新的底層數(shù)組?
因為我們定義的切片只有3個容量,但是我們需要輸入4個容量的數(shù)據(jù),因此函數(shù)中的sli切片會定義另外一個底層數(shù)組用來存儲數(shù)據(jù)(與源地址空間的sli切片的底層數(shù)組不同),這導(dǎo)致源地址空間的sli切片的底層數(shù)組并沒有存儲數(shù)據(jù),而數(shù)據(jù)是保存在了函數(shù)中副本空間內(nèi)的sli切片定義的新的底層數(shù)組空間中。
go的文件操作(文件的讀寫方式):
package mainimport ("bufio""fmt""os"
)func main() {// 獲取當(dāng)前路徑,防止創(chuàng)建文件的時候不知道文件被創(chuàng)建的路徑在哪里wd, err := os.Getwd()if err != nil{ //異常處理fmt.Println("獲取當(dāng)前路徑失敗", err)}fmt.Println("當(dāng)前路徑為:", wd)// 在當(dāng)前目錄filePath := "./golang.txt"file,err := os.OpenFile(filePath,os.O_CREATE|os.O_WRONLY, 0666)// go對于錯誤的錯誤權(quán)交給了用戶if err!=nil{ //異常處理fmt.Println("打開文件失敗", err)return}// 如果打開文件沒有出錯// defer延遲執(zhí)行(如果程序遇到panic也會執(zhí)行)defer file.Close() //異常處理//寫入數(shù)據(jù)write := bufio.NewWriter(file)for i:=0;i<5;i++{write.WriteString("hello sc!\n")}//因為我們寫入的數(shù)據(jù)是在緩存中,我們需要寫道磁盤中,因此需要對數(shù)據(jù)進(jìn)行一個強(qiáng)刷,將數(shù)據(jù)保存到磁盤(文件)當(dāng)中write.Flush()
}
結(jié)果為:
什么時候會用到go中的文件讀寫呀
爬蟲(圖片、文件)
寫日志 --》 日志模塊