3.2.4 숫자 연산
숫자 연산(산술 연산, 비교 연산)은 타입이 같은 숫자끼리만 할 수 있다. 타입이 다른 숫자끼리 연산하려면 반드시 타입을 변환해주어야 한다. 타입 변환 코드는 다음과 같다.
타입명(값)
타입이 다른 숫자끼리 연산하려고 하면 컴파일 에러가 발생한다.
i := 100000 j := int16(10000) k := uint8(100) fmt.Println(i + j) // 컴파일 에러 fmt.Println(i + k) // 컴파일 에러 fm t.Println(j > k) // 컴파일 에러
실행 결과
invalid operation: i + j (mismatched types int and int16) invalid operation: i + k (mismatched types int and uint8) invalid operation: j > k (mismatched types int16 and uint8)
반드시 같은 타입으로 변환한 후에 연산해야 한다.
i := 100000 j := int16(10000) k := uint8(100) fmt.Println(i + int(j)) // 110000 fmt.Println(i + int(k)) // 100100
타입 변환 연산은 오류를 발생시키지 않는다. 원래 값보다 작은 범위를 다루는 타입으로 변환할 때 변환은 성공하지만, 실제 변환된 값은 기대했던 결과와 다를 수 있다.
i := 100000 fmt.Println(int16(i)) // -31072 fmt.Println(uint8(i)) // 160
안전하게 타입을 변환하려면 변환할 수 있는 값인지 먼저 점검한 후에 변환해야 한다.
package main import ( "fmt" "math" ) func main() { fmt.Println(intToUint8(100)) fmt.Println(intToUint8(1000)) } func intToUint8(i int) (uint8, error) { if 0 <= i && i <= math.MaxUint8 { return uint8(i), nil } return 0, fmt.Errorf("%d cannot convert to uint8 type", i) }
실행 결과
100 <nil>
0 1000 cannot convert to uint8 type
intToUint8() 함수는 int 값을 받아 그 값이 uint8 범위에 있으면 uint8로 변환한 값과 nil을 반환하고, 범위에 없으면 0과 error를 반환한다.