Go語(yǔ)言中println和fmt.Println區(qū)別
作為一個(gè)剛剛接觸Go的萌新,在學(xué)習(xí)Go語(yǔ)言的時(shí)候發(fā)現(xiàn)demo用了兩種用法輸出語(yǔ)句:
package main
import "fmt"
func main() {
const LENGTH int = 10
const WIDTH int = 5
var area int
const a, b, c = 1, false, "str" //多重賦值
area = LENGTH * WIDTH
fmt.Printf("面積為 : %d", area)
println()
println(a, b, c)
}其中運(yùn)用了println()和fmt包中的Printf()函數(shù)用于輸出,然后我又想起,再fmt函數(shù)中,還有一個(gè)相似的函數(shù)是
fmt.Println
于是我就研究了一下println()和fmt.Println()的區(qū)別與用法:
println()函數(shù):
我們點(diǎn)進(jìn)函數(shù)可以清楚地看到注釋:
// The println built-in function formats its arguments in an // implementation-specific way and writes the result to standard error. // Spaces are always added between arguments and a newline is appended. // Println is useful for bootstrapping and debugging; it is not guaranteed // to stay in the language. func println(args ...Type)
簡(jiǎn)單翻譯一下:
1.The println built-in function formats its arguments in an implementation-specific way and writes the result to standard error.
println內(nèi)置函數(shù)以特定于實(shí)現(xiàn)的方式格式化其參數(shù),并將結(jié)果寫入標(biāo)準(zhǔn)錯(cuò)誤。
2.Spaces are always added between arguments and a newline is appended.
始終在參數(shù)之間添加空格,并追加換行符。
3.Println is useful for bootstrapping and debugging; it is not guaranteed to stay in the language.
Println用于引導(dǎo)和調(diào)試;但是不保證在未來(lái)的Go版本中繼續(xù)存在
fmt.println()函數(shù):
// Println formats using the default formats for its operands and writes to standard output.
// Spaces are always added between operands and a newline is appended.
// It returns the number of bytes written and any write error encountered.
func Println(a ...interface{}) (n int, err error) {
return Fprintln(os.Stdout, a...)
}簡(jiǎn)單翻譯一下:
1.Println formats using the default formats for its operands and writes to standard output.
Println格式使用其操作數(shù)的默認(rèn)格式,并寫入標(biāo)準(zhǔn)輸出。
2.Spaces are always added between operands and a newline is appended.
始終在操作數(shù)之間添加空格,并追加換行符。
3.It returns the number of bytes written and any write error encountered.
它返回寫入的字節(jié)數(shù)和遇到的任何寫入錯(cuò)誤。
根據(jù)官方注釋,我們可以很清楚的看到在注釋中他們很大的區(qū)別是在于,fmt.println()是在fmt包下的方法,將結(jié)果寫入標(biāo)準(zhǔn)輸出,而println是在builtin包下的方法,將結(jié)果寫入標(biāo)準(zhǔn)錯(cuò)誤。
總結(jié)區(qū)別:
1.包不同:
fmt包:fmt 包使用函數(shù)實(shí)現(xiàn) I/O 格式化(類似于 C 的 printf 和 scanf 的函數(shù)), 格式化參數(shù)源自C,但更簡(jiǎn)單。
builtin包:builtin包是go的預(yù)聲明定義,包括go語(yǔ)言中常用的各種類型和方法聲明,包括變量和常量?jī)刹糠郑湓敿?xì)聲明在builtin.go文件中。
因?yàn)閎uiltin包是預(yù)申明的包,所以不需要import就可以使用,而 fmt 包需要提前import。
2.輸出方式不同:
輸入標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤也是很明顯的輸出體現(xiàn),使用菜鳥教程const iota的例子說(shuō)明:
//iota const ( a = iota //0 b //1 c //2 d = "ha" //獨(dú)立值,iota += 1 e //"ha" iota += 1 f = 100 //iota +=1 g //100 iota +=1 h = iota //7,恢復(fù)計(jì)數(shù) i //8 ) fmt.Println(a,b,c,d,e,f,g,h,i) println(a,b,c,d,e,f,g,h,i)
輸出:

很明顯可以看出,在Windows Goland IDE下:標(biāo)準(zhǔn)輸出是白色,錯(cuò)誤輸出是紅色。所以一般適用于debug的時(shí)候,并且不保證在未來(lái)的Go版本中繼續(xù)存在。一般輸出還是調(diào)用fmt包輸出更為妥當(dāng)。
3.方法返回值不同:
我們首先觀察兩個(gè)方法的代碼:
package fmt
func Println(a ...interface{}) (n int, err error) {
return Fprintln(os.Stdout, a...)
}
package builtin
func println(args ...Type)可以發(fā)現(xiàn),fmt.Println是有返回值參數(shù)的。
fmt.println():
- 第一個(gè)返回值是:the number of bytes written,也就是往輸出上寫入了多少個(gè)字節(jié)
- 第二個(gè)返回值是:any write error encountered,也就是寫入的任何錯(cuò)誤
也就是說(shuō)fmt.println()可以實(shí)現(xiàn)println()中無(wú)法實(shí)現(xiàn)的字節(jié)數(shù)統(tǒng)計(jì)和錯(cuò)誤分析。
4.內(nèi)置print/println函數(shù)的調(diào)用不能接受數(shù)組和結(jié)構(gòu)體參數(shù)
//定義數(shù)組
arr := [5]int{1,2,3,4,5}
fmt.Println(arr)成功輸出:

//定義數(shù)組
arr := [5]int{1,2,3,4,5}
println(arr)輸出錯(cuò)誤:

5.對(duì)于組合類型的參數(shù),內(nèi)置的print/println函數(shù)將輸出參數(shù)的底層值部的地址,而fmt和log標(biāo)準(zhǔn)庫(kù)包中的打印函數(shù)將輸出接口參數(shù)的動(dòng)態(tài)值的字面形式。
func main() {
var numbers = make([]int,3,5)
printSlice(numbers)
}
func printSlice(x []int){
fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
println("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}輸出結(jié)果:

6.如果一個(gè)實(shí)參有String() string或Error() string方法,那么fmt和log標(biāo)準(zhǔn)庫(kù)包里的打印函數(shù)在打印參數(shù)時(shí)會(huì)調(diào)用這兩個(gè)方法,而內(nèi)置的print/println函數(shù)則會(huì)忽略參數(shù)的這些方法。
func main() {
conent, err := openFile()
if err != nil {
fmt.Printf("fmt.Printf:存在錯(cuò)誤,%v\n", err)
} else {
fmt.Println(string(conent))
}
if err != nil {
println("println:存在錯(cuò)誤,%v\n",err)
} else {
println(string(conent))
}
}
//只是模擬一個(gè)錯(cuò)誤
func openFile() ([]byte, error) {
return nil, &fileError{}
}
type fileError struct {
}
func (fe *fileError) Error() string {
return "文件錯(cuò)誤"
}輸出結(jié)果:

到此這篇關(guān)于Go語(yǔ)言中println和fmt.Println區(qū)別的文章就介紹到這了,更多相關(guān)Go語(yǔ)言 println fmt.Println內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語(yǔ)言為什么不支持前綴自增運(yùn)算符原理解析
這篇文章主要為大家介紹了Go語(yǔ)言為什么不支持前綴自增運(yùn)算符原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
實(shí)時(shí)通信的服務(wù)器推送機(jī)制 EventSource(SSE) 簡(jiǎn)介附go實(shí)現(xiàn)示例代碼
EventSource是一種非常有用的 API,適用于許多實(shí)時(shí)應(yīng)用場(chǎng)景,它提供了一種簡(jiǎn)單而可靠的方式來(lái)建立服務(wù)器推送連接,并實(shí)現(xiàn)實(shí)時(shí)更新和通知,這篇文章主要介紹了實(shí)時(shí)通信的服務(wù)器推送機(jī)制 EventSource(SSE)簡(jiǎn)介附go實(shí)現(xiàn)示例,需要的朋友可以參考下2024-03-03
詳解Go語(yǔ)言運(yùn)用廣度優(yōu)先搜索走迷宮
廣度優(yōu)先搜索是從圖中的某一頂點(diǎn)出發(fā),遍歷每一個(gè)頂點(diǎn)時(shí),依次遍歷其所有的鄰接點(diǎn),再?gòu)倪@些鄰接點(diǎn)出發(fā),依次訪問(wèn)它們的鄰接點(diǎn),直到圖中所有被訪問(wèn)過(guò)的頂點(diǎn)的鄰接點(diǎn)都被訪問(wèn)到。然后查看圖中是否存在尚未被訪問(wèn)的頂點(diǎn),若有,則以該頂點(diǎn)為起始點(diǎn),重復(fù)上述遍歷的過(guò)程2021-06-06
Go 語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之雙鏈表學(xué)習(xí)教程
這篇文章主要為大家介紹了Go 語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之雙鏈表學(xué)習(xí)教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
Go語(yǔ)言實(shí)現(xiàn)從PDF自動(dòng)化提取條碼的開發(fā)全流程解析
在實(shí)際的業(yè)務(wù)場(chǎng)景中,我們常常需要從?PDF?文件中提取條碼信息,本文將通過(guò)?Go?語(yǔ)言開發(fā)一個(gè)自動(dòng)掃描目錄內(nèi)所有?PDF?并提取條碼的工具,感興趣的小伙伴可以了解下2025-11-11
Go語(yǔ)言連接Oracle數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了Go語(yǔ)言連接Oracle數(shù)據(jù)庫(kù)的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02

