[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๋กœ ํŒ์ •ํ•œ๋‹ค.