2015-11-08 82 views
2

爲什麼這不是一個類型不匹配?爲什麼這個賦值不是類型不匹配?

來自:https://golang.org/ref/spec#Assignability

甲值x可分配給類型T的變量( 「x是分配給T」)在任何情況下: ... ...剪斷 X的V型和T具有相同的基礎類型,並且V或T中的至少一個不是指定類型。 ... snip ...

這是因爲N []的基礎類型是N [],它不是一個命名類型?

背後的理由是什麼?

package main 

import "fmt" 

type N []N 

func main() { 
    n := make([]N, 1) 
    fmt.Printf("%T\n", n) 
    fmt.Printf("%T\n", n[0]) 
    n[0] = n 
    //fmt.Println(n) 
} 

*Output:* 
[]main.N 
main.N 

回答

1

你在問,如果n[0] = n是有效的。在任何情況下

x是分配給T類型的變量(「x是 分配給T」):

    你已經正確識別從語言規範的規則
  • ...
  • x的類型VT具有相同的基本類型和V至少一個或T不是命名類型。

下面是如何將其應用在這裏:

  • n[0]的類型爲N和基礎類型[]N(從語言規範:「到N是指在其類型聲明的類型」)。
  • n有類型[]N(具有相同的基礎類型)。

所以n[0]n具有相同的基礎類型([]N),以及n類型不是命名類型。

+0

你知道這個規則背後的理由嗎?當然除了讓我困惑。 n:= make([] N,1) 到 n:= make(N,1) 爲什麼這仍然有效?我認爲製作需要一個切片,地圖或頻道。 這是一個有點偏離主題,但爲什麼以下不會出現越界錯誤。 make([] int,3)[3:] – VM7

+0

@ VM7我認爲這是語言規範中的一個省略,它沒有說'make(N,1)'的作用。 –

相關問題