?個人博客:Pandaconda-CSDN博客
📣專欄地址:http://t.csdnimg.cn/UWz06
📚專欄簡介:在這個專欄中,我將會分享 Golang 面試中常見的面試題給大家~
??如果有收獲的話,歡迎點贊👍收藏📁,您的支持就是我創作的最大動力💪
16. Printf(),Sprintf(),FprintF() 都是格式化輸出,有什么不同?
在 Go 語言中,Printf()、Sprintf() 和 FprintF() 都是用于格式化輸出的函數,但它們有一些不同之處,具體如下:
- Printf()
Printf() 是最常用的格式化輸出函數,它將格式化后的字符串輸出到標準輸出流(一般是終端窗口)。Printf() 的
語法如下:
Printf(format string, a ...interface{}) (n int, err error)
其中,format 表示要輸出的格式化字符串,a …interface{} 表示要格式化的參數列表,可以是任意類型的參數。
Printf() 函數會根據格式化字符串中的格式說明符將參數格式化為指定格式,并輸出到標準輸出流中。
- Sprintf()
Sprintf() 與 Printf() 的作用類似,不同的是,它將格式化后的字符串輸出到一個字符串中,而不是標準輸出流。Sprintf() 的語法如下:
Sprintf(format string, a ...interface{}) string
其中,format 和 a …interface{} 的含義與 Printf() 相同,但 Sprintf() 返回一個字符串,而不是將格式化后的字符串輸出到標準輸出流中。
- FprintF()
FprintF() 與 Printf() 的作用也類似,不同的是,它將格式化后的字符串輸出到指定的文件中,而不是標準輸出流。FprintF() 的語法如下:
FprintF(w io.Writer, format string, a ...interface{}) (n int, err error)
其中,w 表示要輸出的文件,可以是 os.Stdout、os.Stderr 或其他實現了 io.Writer 接口的類型。format 和 a …interface{} 的含義與 Printf() 相同。FprintF() 會將格式化后的字符串輸出到指定的文件中。
綜上所述,Printf()、Sprintf() 和 FprintF() 都是格式化輸出函數,它們的作用有所不同,但都可以通過格式說明符將參數格式化為指定格式。需要根據具體的需求選擇不同的函數來使用。
17. Golang 的參數傳遞、引用類型
在 Golang 中,函數調用時參數傳遞可以分為值傳遞和引用傳遞。
值傳遞:將參數的值復制一份,然后將復制的值傳遞給函數,函數對參數的修改不會影響到原始的值。常見的值類型如 int、float、bool 等都是值類型,它們的傳遞都是值傳遞。
引用傳遞:將參數的地址復制一份,然后將復制的地址傳遞給函數,函數對參數的修改會影響到原始的值。常見的引用類型如 Slice、Map、Channel、指針等都是引用類型,它們的傳遞都是引用傳遞。
需要注意的是,在 Golang 中數組雖然是引用類型,但是它的傳遞卻是值傳遞。這是因為 Golang 的數組長度是固定的,數組的值復制時會將整個數組的元素都復制一遍,因此傳遞數組時的開銷較大,而且數組的長度也不可變,因此將數組的地址復制一份也無法修改原數組的長度,所以 Golang 采用了值傳遞的方式。
總之,對于值類型的參數,使用值傳遞即可;對于引用類型的參數,使用引用傳遞可以避免大量數據的復制,提高程序的效率。同時,在使用引用類型的參數時,需要注意并發訪問的問題。
18. Go 語言當中值傳遞如何運用?
值傳遞是指函數參數傳遞時,傳遞的是值的拷貝,而不是原始值的引用。在函數中修改參數的值并不會影響原始值。在 Go 語言中,基本數據類型、數組和結構體等類型都是以值的形式傳遞的。
示例代碼:
func main() {a := 10fmt.Println("Before calling function, a is:", a)changeValue(a)fmt.Println("After calling function, a is:", a)
}func changeValue(n int) {n = 20fmt.Println("In function, n is:", n)
}
輸出結果:
Before calling function, a is: 10
In function, n is: 20
After calling function, a is: 10
可以看到,雖然在函數 changeValue() 中修改了參數 n 的值,但原始值 a 并未被修改。