S.N
S.N

Reputation: 5140

Golang func - return type

This is my first Golang program after 'Hello world'. Please find following code block which aims to perform basic arithmetic and multiple type return demo. This is just a hypothetical sample to learn Go func. However, I am getting following exception on compilation. From exception, i assume, operations on int8 operand return int16/int32 as return type and which is not correct as per go.

Question: Isn't it safe for language to assume int8 is safely assignable to int16 or int32

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)
}

Error:

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

Upvotes: 1

Views: 2744

Answers (2)

thwd
thwd

Reputation: 24808

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

Yes, It would be, if Go did implicit conversions on assignment. But it does not (only interface-wrapping when applicable).

There are several reasons:

  • The concept of automatic conversion cannot be generalized to all types without introducing the concept of a type hierarchy. And, as you know, all concrete types in Go are invariant.
  • Go is "anti-magic" and in this spirit it doesn't do stuff you did not request it to do (except e.g. write-barriers on pointers).

Upvotes: 2

Yandry Pozo
Yandry Pozo

Reputation: 5123

The error says that you have to return int16 and int32, all you have to do is convert the result like this:

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

Upvotes: 2

Related Questions