2016-10-25 49 views
-2

這是我的第一個Golang程序,'Hello world'後面。請找到下面的代碼塊,其目的是執行基本的算術和多種類型的返回演示。這只是一個假設的樣本,學習Go func。但是,我在編譯時遇到以下異常。從例外情況來看,我認爲,對int8操作數的操作返回int16/int32作爲返回類型,並且不正確。Golang func - 返回類型

問:是不是很安全的語言來承擔int8是安全地分配給int16int32

package main 
import (
    "fmt" 
) 
func Arithmetic(a,b int8) (int8,string,int16,int32){ 
    return a-b, "add",a*b,a/b 
} 
func main() { 
    a,b,c,d :=Arithmetic(5,10) 
    fmt.Println(a,b,c,d) 
} 

錯誤:

C:/Go\bin\go.exe run C:/GoWorkspace/src/tlesource/ff.go 
# command-line-arguments 
.\ff.go:15: cannot use a * b (type int8) as type int16 in return argument 
.\ff.go:15: cannot use a/b (type int8) as type int32 in return argument 

Process finished with exit code 2 
+1

您不能將'int8'分配給'int16'或'int32',但您可以安全地轉換它們。 – JimB

+0

你必須使用'int16()'等來明確地轉換它, –

+0

@JimB,謝謝你的評論。我可能是錯的,但是,安全分配和轉換是不同的。 – Nair

回答

2

Is it it safe for language to assume int8 is safely assignable to int16 or int32

是的,這將是,如果轉到做了分配隱式轉換。但它不(只適用於接口包裝)。

有幾個原因:

  • 自動轉換的概念不能一概而論於所有類型的,而不會引入一個類型的層次結構的概念。而且,如您所知,Go中的所有具體類型都是不變的。
  • Go是「反魔術」,本着這種精神,它不會做你沒有要求它做的事情(除了例如指針上的寫障礙)。
+0

現在很清楚。謝謝。 – Nair

1

錯誤說,你必須返回int16 and int32,所有你需要做的是轉換的結果是這樣的:

func Arithmetic(a, b int8) (int8, string, int16, int32) { 
    return a - b, "add", int16(a * b), int32(a/b) 
} 
+0

感謝您的支持。我的問題不是如何解決錯誤信息。相反,我有興趣知道爲什麼Go不能安全轉換 – Nair

+2

@Nair爲什麼不能安全轉換? 「因爲這就是語言的定義」。 – Vatine

+1

你可能更喜歡'int16(a)* int16(b)'而不是'int16(a * b)'......除非你能保證'a * b'不會換行,也就是說。 – Vatine