본문 바로가기

전체 글42

ultimate in go (5)- data structure(embedding) 임베딩 임베딩이 아닌 필드 선언 type user struct { name string email string } func (u *user) notify() { fmt.Printf("Sending user email To %s\n", u.name, u.email) } type admin struct { person user // 임베딩이 아니다. level string } func main() { ad := admin{ person: user{ name: "Hoanh An", email: "hoanhan101@gmail.com", }, level: "superuser", } } ad.person.notify() admin의 user는 임베딩이 아닌, 하나의 필드를 user라는 타입으로 정의한것 admin.. 2023. 1. 24.
ultimate in go (4)- data structure(interface) interface 값이 없는 타입 type reader interface { read(b []byte) (int, error) // (1) } type reader interface { read(i int) ([]byte, error) // (2) } []byte값을 통해서 반환하게 되면 메소드 호출마다 slice를 만들게 되고 반복적으로 힙메모리에 저장하게 됨으로 효율이 좋지 못하다 concrete type 매소드를 가질 수 있는 모든 타입/ 사용자 정의 타입만이 메소드를 가질수 있다. 남이 만들어 놓은 타입을 동일 패키지내에서 선언없이는 메소드를 가질 수 없음 인터페이스를 이용하여서 메소드를 호출할때, 메소드와 인터페이스간의 관계 type file struct { name string } type p.. 2023. 1. 23.
ultimate in go (3)- data structure(method) method value and pointer receiver call 함수가 리시버와 함께 호출되면, 메소드로 변한다 이러한 리시버는 value, pointer 각각의 형태로 입력받을 수 있다. user 타입의 변수는 value & pointer receiver를 사용하는 모든 메서드를 호출할 수 있다. user의 포인터 타입 변수 역시 value & pointer receiver를 사용하는 모든 메서드를 호출할 수 있다. type user struct { name string email string } func (u user) notify() { fmt.Printf("Sending User Email To %s\\n", u.name, u.email) } func (u \*user) changeEmail.. 2023. 1. 23.
ultimate go (2)- data structure(배열/슬라이스) 자료구조 배열(array) cpu 캐시 메인메모리는 생각보다 느리고, 그렇기에 cpu는 처음에는 l1 l2 l3캐시를 참조한다. 그리고 캐싱히트를 하는것(캐싱미스를 하지않는것)이 중요하다. 그것은 prefetcher에 의해서 결정된다. 64 바이트를 한번에 읽어오는 캐싱라인이라는 것을 이용한다. 한번에 가져오기때문에, 연속된 데이터가 동시에 쓰이게 되면 캐싱히트가 많이 발생한다. 연속된 메모리를 갖는건 go에서 slice이다.-> 성능에 좋다 n*n 행렬에서의 열순회/ 행순회/ 연결리스트 순회 속도차이가 발생한다. 행순회가 빠르다. 캐싱히트때문에 연결리스트는 왜 성능이 중간인가?(translation lookaside buffer, 변환 색인 버퍼) 변환 색인 버퍼 to study 선언과 초기화 길이가 .. 2023. 1. 19.