[Go] Zero Value ์์ฉ
Go๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ธ์ด ์์ค์์ nil(null pointer)๋ฅผ ์ ๊ณตํ๊ณ , ์ด๋ฅผ ํตํด ๊ฐ์ ์ ๋ฌด๋ฅผ ํ๋จํ ์ ์๋ค.
ํ์ง๋ง nil์ ์ด๋์ ๋ ๋์ฒดํ ์ ์๋ ๊ธฐ๋ฅ์ด ์กด์ฌํ๋๋ฐ, ๊ทธ๊ฒ ๋ฐ๋ก Zero Value๋ค.
๊ทธ๋ฅ "", 0 ๊ฐ์ ๊ธฐ๋ณธ๊ฐ์ด ๋ค์ด์๋ค๋ฉด null๊ฐ์ผ๋ก ๊ฐ์ฃผํ๋ ๊ฒ์ด๋ค. ๊ทธ๋์ ๊ธฐ๋ณธ๊ฐ์ด ์๋ฏธ๊ฐ ์๋ ๊ฒฝ์ฐ๋ผ๋ฉด ์ฌ์ฉํ๊ธฐ ๊ณค๋ํ๋ค.
Go๋ ๋ช
์์ ์ผ๋ก ๊ฐ์ ํ ๋นํ์ง ์์๋ ๋๋ถ๋ถ ํ์
์ ๋ํ default ๊ฐ์ ํ ๋นํด์ค๋ค.
์ ์์ ๊ฒฝ์ฐ์๋ 0์ธ๋ฐ, ์ด๊ฑธ reflect์ IsZero ๋ฑ์ ์ฌ์ฉํ๋ฉด genericํ๊ฒ ์ฒดํฌํ ์ ์๋ค.
์๋๋ ๊ทธ์ ๋ํ ์์ ์ฝ๋๋ค.


๋ฌธ์์ด์ ๋น ๋ฌธ์์ด์ด Zero Value๊ณ


Bool์ false, ์ค์๋ 0.0์ด๋ค.


์ฌ๊ธฐ์ ๊ด๋ชฉํ ๋งํ ๋ถ๋ถ์ ๊ตฌ์กฐ์ฒด๋ ์์ฉํ ์ ์๋ค๋ ๊ฒ์ด๋ค.
์ด๋ฐ ๊ตฌ์กฐ์ฒด๊ฐ ์๋ค๋ฉด, Go๋ ๊ตฌ์กฐ์ฒด์ ๋ํด์ ํ๋๋ฅผ ๋ชจ์กฐ๋ฆฌ ์๋ตํด์ฃผ๋ ๊ฒ๋ ํ์ฉํด์ฃผ๊ธฐ ๋๋ฌธ์

๋๊ฐ์ด Zero Value๋ฅผ ์์ฑํ๊ณ ์ฒดํฌํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค.
IsZero๋ ๊ตฌ์กฐ์ฒด ํ๋๊ฐ ์ ๋ถ Zero ๊ฐ์ด๋ฉด Zero ๊ฐ์ผ๋ก ํ์ ํ๋ค.


๊ทธ๋ฆฌ๊ณ ํฌ์ธํฐ์ ๊ฒฝ์ฐ์๋ IsZero ๊ฐ์ ์ฌ์ฉํ๊ธฐ๊ฐ ๊ณค๋ํ ์ ์๋๋ฐ, ๊ทธ๋ฐ ๊ฒฝ์ฐ์๋ ํฌ์ธํฐ๋ฅผ ๋ถ๊ธฐ์ฒ๋ฆฌํด์ ์ฌ์ฉํ๋ฉด ๋๋ค.
์๋์ ๊ฐ์ด generic ํจ์๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํ๋ฉด ์ฐ๊ธฐ ํธํ ๊ฒ์ด๋ค.
// value ๊ฐ๊ณผ pointer ๊ฐ์ ๋ํด์ ๋ชจ๋ Zero ๊ฐ์ ์ฒดํฌํจ
func IsZero[T any](x T) bool {
typeInfo := reflect.TypeOf(x)
valueInfo := reflect.ValueOf(x)
isPointer := typeInfo.Kind() == reflect.Ptr
if isPointer {
if valueInfo.IsNil() {
return true
} else {
return false
}
} else {
return valueInfo.IsZero()
}
}

์๋๋ ์ฌ์ฉ๋ก๋ค.
ํฌ์ธํฐ ํ์
์ผ ๊ฒฝ์ฐ์๋ nil์ผ๋๋ง zero, ๊ฐ ํ์
์ผ ๊ฒฝ์ฐ์๋ ๊ทธ๋๋ก ๊ธฐ๋ณธ๊ฐ์ zero๋ก ํ์ ํ๋ค.