# 맨 아래 코드 먼저 보시고 설명 읽으시길 추천!!!

 

메서드 집합(method sets)

값의 관점에서 본 메서드 집합
메서드 수신자
T (t T)
*T (t *T)

- 설명

T        (t T) : 값 u는 T이고,  notify메서드에서의 수신자 (u user)는 (t T)를 뜻한다.

*T      (t T) 그리고 (t *T) : &u는 *T이고, notify메서드의 수신자 (u *user) 또는 (u user)는 (t T) 와 (t *T)를 뜻한다.

 

수신자의 관점에서 본 메서드 집합
메서드 수신자
(t T) T와 *T
(t *T) *T

-설명

(t T)        T와 *T  : notify메서드에서의 수신자 (u user)는 (t T)이고, u와 &u는 T와 *T를 뜻한다.

(t *T)      *T  : notify메서드의 수신자 (u *user)는 (t *T)이고, &u는 *T를 뜻한다.

 

 

package main

import "fmt"

 

type notifier interface {

    notify()

}

 

type user struct {

    name  string

    email string

}

 

func (u *user) notify() { // (u *user) 수신자

    fmt.Printf("사용자에게 메일을 전송합니다: %s<%s>\n", u.name, u.email)

}

 

func sendNotification(n notifier) {

    n.notify()

}

func main() {

    u := user{"Bill", "bill@email.com"} // u값

    sendNotification(u) //&u로 전달해야 컴파일 가능

}

 

현재 이코드는 작동하지 않는데 이유는 notifier interface가 nofity() 메서드를 가지고 있는데 

notify메서드의 수신자는 u *user(포인터 수신자)이다. 하지만 main에서 sendNotification 인수로 &u가 아닌 u를 전달하고 있다.

위의 메서드 집합에 따르면 메서드 수신자 (u *user) 포인터 이므로 &u 같이 주소만를 전달할 있다. 

 

출처 : 책. Go 인 액션 132쪽 메서드 집합

x := 42 //int
y := 42.34543 // float64

이렇게 golang에서 타입선언 없이 := 연산자와 같이 값을 할당하면 정수는 int로, 실수는 float64로 자동으로 타입이 정해집니다.

int는 컴퓨터 시스템에 따라서 32비트 또는 64비트 입니다.
float64는 실수형 기본값

For instance, int32 and int are not the same type even though they may have the same size on a particular architecture.

int32와 int가 특정 시스템에서 사이즈가 같더라도 같은 타입이 아니라는 말이네요.
쉽게 설명하면 위에서 컴퓨터 시스템에 따라서 int는 32 또는 64라고 했는데 시스템이 32비트면 int는 32비트입니다.
그렇다고 해서 타입 int32와 int가 같은 타입은 아니라는 말입니다.

아키텍쳐 종류 출력

package main

import (
"fmt"
"runtime"
)

func main() {
fmt.Println(runtime.GOARCH) //아키텍쳐 종류
}

출력해보니 amd64가 나오네요.
64비트라는 뜻

Go 변수 초기 기본값

https://go.dev/ref/spec#The_zero_value
Each element of such a variable or value is set to the zero value for its type: false for booleans, 0 for numeric types, "" for strings, and nil for pointers, functions, interfaces, slices, channels, and maps.

초기 기본값
Booleans는 false
Numeric types(수 타입 : int, float)은 0
Strings(문자열)은 “” 빈 문자열
나머지 (포인터, 함수, 인터페이스 슬라이스 채널 그리고 맵)은 nil

var a int // 0
var b string // “”
var c bool // false
var d *int // nil

+ Recent posts