go基礎語法50問,來看看你的go基礎合格了嗎?( 三 )

16.如何在切片中查找go中使用 sort.searchXXX 方法,在排序好的切片中查找指定的方法,但是其返回是對應的查找元素不存在時,待插入的位置下標(元素插入在返回下標前) 。
可以通過封裝如下函數,達到目的 。
func IsExist(s []string, t string) (int, bool) {iIndex := sort.SearchStrings(s, t)bExist := iIndex!=len(s) && s[iIndex]==treturn iIndex, bExist}17.如何初始化帶嵌套結構的結構體go 的哲學是組合優于繼承,使用 struct 嵌套即可完成組合,內嵌的結構體屬性就像外層結構的屬性即可 , 可以直接調用 。
注意初始化外層結構體時,必須指定內嵌結構體名稱的結構體初始化,如下看到 s1方式報錯,s2 方式正確 。
type stPeople struct {Gender boolName string}type stStudent struct {stPeopleClass int}//嘗試4 嵌套結構的初始化表達式//var s1 = stStudent{false, "JimWen", 3}var s2 = stStudent{stPeople{false, "JimWen"}, 3}fmt.Println(s2.Gender, s2.Name, s2.Class)18.切片和數組的區別數組是具有固定長度,且擁有零個或者多個,相同數據類型元素的序列 。數組的長度是數組類型的一部分,所以[3]int 和 [4]int 是兩種不同的數組類型 。數組需要指定大小,不指定也會根據初始化的自動推算出大小 , 不可改變;數組是值傳遞 。數組是內置類型,是一組同類型數據的集合,它是值類型,通過從0開始的下標索引訪問元素值 。在初始化后長度是固定的,無法修改其長度 。
當作為方法的參數傳入時將復制一份數組而不是引用同一指針 。數組的長度也是其類型的一部分,通過內置函數len(array)獲取其長度 。數組定義:
var array [10]intvar array =[5]int{1,2,3,4,5}切片表示一個擁有相同類型元素的可變長度的序列 。切片是一種輕量級的數據結構,它有三個屬性:指針、長度和容量 。切片不需要指定大??;轻叕蕢q刂反藎磺釁梢醞ü槔闖跏薊?也可以通過內置函數make()初始化。初始化時len=cap,在追加元素時如果容量cap不足時將按len的2倍擴容 。切片定義:
var slice []type = make([]type, len)19.new和make的區別new 的作用是初始化一個指向類型的指針 (*T)。new 函數是內建函數,函數定義:func new(Type) *Type 。使用 new 函數來分配空間 。傳遞給 new 函數的是一個類型,不是一個值 。返回值是指向這個新分配的零值的指針 。
make 的作用是為 slice,map 或 chan 初始化并返回引用 (T) 。make 函數是內建函數 , 函數定義:func make(Type, size IntegerType) Type;第一個參數是一個類型,第二個參數是長度;返回值是一個類型 。
make(T, args) 函數的目的與 new(T) 不同 。它僅僅用于創建 Slice, Map 和 Channel,并且返回類型是 T(不是T*)的一個初始化的(不是零值)的實例 。
20.Printf()、Sprintf()、Fprintf()函數的區別用法是什么都是把格式好的字符串輸出 , 只是輸出的目標不一樣 。
Printf(),是把格式字符串輸出到標準輸出(一般是屏幕 , 可以重定向) 。Printf() 是和標準輸出文件 (stdout) 關聯的,Fprintf 則沒有這個限制 。
Sprintf(),是把格式字符串輸出到指定字符串中 , 所以參數比printf多一個char* 。那就是目標字符串地址 。
Fprintf(),是把格式字符串輸出到指定文件設備中 , 所以參數比 printf 多一個文件指針 FILE* 。主要用于文件操作 。Fprintf() 是格式化輸出到一個stream,通常是到文件 。
21.說說go語言中的for循環for 循環支持 continue 和 break 來控制循環,但是它提供了一個更高級的break , 可以選擇中斷哪一個循環 for 循環不支持以逗號為間隔的多個賦值語句,必須使用平行賦值的方式來初始化多個變量 。
22.Array 類型的值作為函數參數在 C/C++ 中,數組(名)是指針 。將數組作為參數傳進函數時,相當于傳遞了數組內存地址的引用,在函數內部會改變該數組的值 。
在 Go 中 , 數組是值 。作為參數傳進函數時,傳遞的是數組的原始值拷貝,此時在函數內部是無法更新該數組的 。
// 數組使用值拷貝傳參func main() { x := [3]int{1,2,3} func(arr [3]int) {arr[0] = 7fmt.Println(arr) // [7 2 3] }(x) fmt.Println(x)// [1 2 3] // 并不是你以為的 [7 2 3]}想改變數組 , 直接傳遞指向這個數組的指針類型 。
// 傳址會修改原數據func main() { x := [3]int{1,2,3} func(arr *[3]int) {(*arr)[0] = 7fmt.Println(arr) // &[7 2 3] }(&x) fmt.Println(x) // [7 2 3]}直接使用 slice:即使函數內部得到的是 slice 的值拷貝,但依舊會更新 slice 的原始數據(底層 array)

推薦閱讀