Go語言學習查缺補漏ing Day2
來源:
Go語言學習查缺補漏ing Day2
請大家觀察下面這個函式有什麼問題嗎?
func fun(x, y int) (s int, error) {
return x * y, nil
}
雖然這個錯誤,在整合開發環境Goland中會有提示,但是其他的開發工具,比如VS Code就不知道會不會提示了。
我們可以看到這個提示:函式有命名的返回引數,也有沒有命名的返回引數。
這就說明函式有多個返回值引數時,如果你給一個引數命了名,那麼其他引數也必須命名。而且如果給引數命名,那麼必須給引數加上括號,無論引數個數是一個還是多個。這裡給第一個引數命名為s,而沒有給第二個引數命名,所以有錯誤。
二、new()和make()有什麼不同?
在Go SDK中,對new的描述是這樣的:
// The new built-in function allocates memory. The first argument is a type,
// not a value, and the value returned is a pointer to a newly
// allocated zero value of that type.
func new(Type) *Type
它是一個用於分配記憶體的內建函式,只有一個引數。如果使用這個函式,那麼就會返回一個指向一塊新開闢記憶體的指標,這塊記憶體是第一個參數列示的型別的零值。
我們再來看一看make:
// The make built-in function allocates and initializes an object of type
// slice, map, or chan (only). Like new, the first argument 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:
// Slice: The size specifies the length. The capacity of the slice is
// equal to its length. A second integer argument may be provided to
// specify a different capacity; it must be no smaller than the
// length. For example, make([]int, 0, 10) allocates an underlying array
// of size 10 and returns a slice of length 0 and capacity 10 that is
// backed by this underlying array.
// Map: An empty map is allocated with enough space to hold the
// specified number of elements. The size may be omitted, in which case
// a small starting size is allocated.
// Channel: The channel's buffer is initialized with the specified
// buffer capacity. If zero, or the size is omitted, the channel is
// unbuffered.
func make(t Type, size ...IntegerType) Type
我們可以瞭解,make也是分配記憶體的,但是隻能給slice, map 或者 chan分配記憶體。而且這個make也不返回指標,而是返回你第一個引數代表的型別的值。
經過上面的介紹,我們再來看一看這段程式碼能否透過編譯。
import "fmt"
func main() {
l := new([]int)
l = append(l, 0)
fmt.Println(l)
}
顯然是不能的,下面是報錯資訊:
我們前面講了,new函式new出來的是指標,而指標是不能進行append操作的。所以我們建立slice, map 或者 chan最好使用make函式,而不要使用new函式。
三、切片追加切片問題
** 如果有兩個切片,如何使用append把它們拼湊在一個切片裡面呢?**
這樣行不行?
package main
import "fmt"
func main() {
slice := []int{8, 8, 8}
append_slice := []int{2, 8}
slice = append(slice, append_slice)
fmt.Println(slice)
}
看一看Goland怎麼提示的吧。
好像是不行吧。
這時我們就要使用
...
這種語法糖。
它有多個功能,其中的一個功能就是可以把切片打散進行傳遞。還有就是在定義函式時使用,可以接收任意個引數。
下面是執行結果:
四、簡短模式宣告變數的限制
我們來看一看下面這一段程式碼,你覺得有沒有什麼問題?
package main
import "fmt"
var(
two = 200
)
one := 100
func main() {
fmt.Println(one,two)
}
是有問題的。
就得來談一談變數的簡短模式宣告有哪些限制:
-
必須使用顯示初始化,也就是手工給予初值。
-
不能指定資料型別,編譯器會根據你指定的初值自動推理變數的型別。
-
只能在函式內部使用簡短模式來宣告變數。
我們這裡出現錯誤的原因就是觸發了上述第三點限制:未在函式內部使用簡短模式來宣告變數。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70001864/viewspace-2845573/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Go語言學習查缺補漏ing Day1Go
- Go語言學習查缺補漏ing Day4Go
- Go語言學習查缺補漏ing Day3Go
- Go語言學習查缺補漏ing Day7Go
- Go語言學習查缺補漏ing Day8Go
- Go語言學習查缺補漏ing Day5Go
- Go語言學習查缺補漏ing Day6Go
- 查漏補缺
- [學習筆記]TypeScript查缺補漏(一):類筆記TypeScript
- HashMap 查漏補缺HashMap
- Typescript 查缺補漏TypeScript
- iOS 查漏補缺 - PerformSelectoriOSperformSelector
- Flutter查漏補缺1Flutter
- JavaScript Promise查缺補漏JavaScriptPromise
- ROS灰灰的日常查漏補缺ROS
- [學習筆記]TypeScript查缺補漏(二):型別與控制流分析筆記TypeScript型別
- C# 執行緒查漏補缺C#執行緒
- shell基礎知識查缺補漏
- SLAM 灰灰restudy及查漏補缺—octomapSLAMREST
- 正規表示式的查漏補缺
- C++灰灰的日常查漏補缺C++
- 前端面試查漏補缺--(十三) 記憶體洩漏前端面試記憶體
- C# 執行緒同步查漏補缺C#執行緒
- 技術棧查漏補缺——架構師架構
- 前端面試查漏補缺--(八) 前端加密前端面試加密
- 前端面試查漏補缺--(十五) Event Loop前端面試OOP
- go語言學習Go
- 【查漏補缺】那些漏掉的面試知識面試
- 前端面試查漏補缺--(十) 前端鑑權前端面試
- 前端面試查漏補缺--(九) HTTP與HTTPS前端面試HTTP
- [筆記](更新中)CSP-S 2024 查漏補缺筆記
- Redis基礎你掌握多少了?來查漏補缺?Redis
- 前端面試查漏補缺--(四) 前端本地儲存前端面試
- 前端面試查漏補缺--(二) 垃圾回收機制前端面試
- Go語言學習——mapGo
- go語言學習-介面Go
- go語言學習-goroutineGo
- 「查缺補漏」鞏固你的Redis知識體系Redis