golang 陣列面試題

kenuo發表於2019-04-17

第一題 array append擴容問題

例項程式碼array_append.go

/**
  * Author: JeffreyBool
  * Date: 2019/4/17
  * Time: 16:16
  * Software: GoLand
*/

package array

/**
 * arr 底層擴容知識點
 */
func ArrayAppend() []int {
    arr := make([]int,5)
    arr = append(arr,10)
    //問現在 arr 結果是什麼
    return arr
}

測試程式碼array_append_test.go

/**
  * Author: JeffreyBool
  * Date: 2019/4/17
  * Time: 16:18
  * Software: GoLand
*/

package array

import (
    "testing"
)

func TestArray_append(t *testing.T) {
    arr := ArrayAppend()
    t.Log(arr)
}

本題講解

make 函式

make 也是內建函式,你可以從 http://golang.org/pkg/builtin/#make 看到它, 它的函式原型 比 new 多了一個(長度)引數,返回值也不同。
函式原型是

func make(Type, size IntegerType) Type 
  • 第一個引數是一個型別,第二個引數是長度
  • 返回值是一個型別

官方描述為:

The make built-in function allocates and initializes an object(分配空間 + 初始化) of type slice, map or chan(only). Like new , the first arguement is a type, not a value. Unlike new, make’s return type is the same as the type of its argument, not a pointer to it. The specification of the result depends on the type.
翻譯為:
內建函式 make 分配並且初始化 一個 slice, 或者 map 或者 chan 物件。 並且只能是這三種物件。 和 new 一樣,第一個引數是 型別,不是一個值。 但是make 的返回值就是這個型別(即使一個引用型別),而不是指標。 具體的返回值,依賴具體傳入的型別。

Slice : 第二個引數 size 指定了它的長度,此時它的容量和長度相同。
你可以傳入第三個引數 來指定不同的容量值,但是必須不能比長度值小。
比如: make([]int, 0, 10)
Map: 根據size 大小來初始化分配記憶體,不過分配後的 map 長度為0。 如果 size 被忽略了,那麼會在初始化分配記憶體的時候 分配一個小尺寸的記憶體。
Channel: 管道緩衝區依據緩衝區容量被初始化。如果容量為 0 或者被 忽略,管道是沒有緩衝區的。

  • 根據上面 make 的解釋我們可以得知Slice可以設定三個引數, 第一個是型別,第二個是長度,第三個是大小, 當Slice 大小不夠了會自動擴容.
arr := make([]int,5) 
//實際譯為
arr := make([]int,5,5)

arr 的大小,長度都為5.

我們將程式碼稍微改良下:

/**
  * Author: JeffreyBool
  * Date: 2019/4/17
  * Time: 16:16
  * Software: GoLand
*/

package array

import (
    "fmt"
)

/**
 * arr 底層擴容知識點
 */
func ArrayAppend() []int {
    arr := make([]int,5)
    fmt.Printf("arr.len: %d; arr.cap: %d \n", len(arr),cap(arr))
    arr = append(arr,10)
    //問現在 arr 結果是什麼
    fmt.Printf("arr.len: %d; arr.cap: %d \n", len(arr),cap(arr))
    return arr
}

image.png

原文地址

by JeffreyBool blog :point_right: link

相關文章