netip type Addr struct { addr uint128 z *intern.Value } ip := make(net.IP, net.IPv6len) ipSize := len([net.IPv6len]net.IP{}) fmt.Printf("net.IP([%v]byte) Size = %vbyte\n”, net.IPv6len, int(unsafe.Sizeof(ip))+ipSize) var addr netip.Addr fmt.Printf("netip.Addr Size = %vbyte\n", unsafe.Sizeof(addr)) // https://gotipplay.golang.org/p/xrkMg5Nw67g // net.IP([16]byte) Size = 40byte // netip.Addr Size = 24byte w 4MJDF)FBEFSCZUF w *1WCZUFΑΓେ͖͍ʜ type SliceHeader struct { Data uintptr Len int Cap int }
OFUJQQBDLBHFʹఆٛ͞Εͨܕ w BEESIJͱBEESMPͰ*1WΞυϨεΛׂͯ͠දݱ w *1Wͷͱ͖ɺ*1WNBQQFE*1WBEESFTTʹมͯ֨͠ೲ w ffff w ͳͥ<>CZUFͰͳ͍ʁ w *1ͷૢ࡞CJUϨδελ্Ͱͷࢉज़ԋࢉͱϏοτԋࢉͰߦΘΕΔ͜ͱ͕ଟ͘ɺόΠ τ୯ҐͰॲཧ͢ΔΑΓ͍ͨΊ w package netip type Addr struct { addr uint128 z *intern.Value } type uint128 struct { hi uint64 lo uint64 } // For example, 0011:2233:4455:6677:8899:aabb:ccdd:eeff is stored as: // addr.hi = 0x0011223344556677 // addr.lo = 0x8899aabbccddeeff
w ϙΠϯτͰൺֱʹར༻Ͱ͖ͳ͍ͷͰʁ w JOUFSO7BMVFಛघͳܕͰಉ͡ಉ͡ϙΠϯλΞυϨεʹͳΔ w ʮΞυϨε͕ಉ͕͡ಉ͡ʯͳͷͰɺOFUJQ"EESܕߏମͷൺֱͰಉ͡ͱஅ͢Δ ͜ͱ͕Մೳ w JOUFSO7BMVFܕখ͘͞ͳ͍͕ɺOFUJQ"EESܕͱͯ͠ίϐʔ͞ΕΔ[ϑΟʔϧυϙΠϯλͳ ͷͰCZUFͱখ͘͞ͳΔɻ w JOUFSO7BMVFܕɺTUSJOHͷΑ͏ʹൺֱՄೳͳCZUFͷϙΠϯλΛ࣮ݱ͢Δ w ൚༻తͳύοέʔδ͕༻ҙ͞Ε͍ͯΔɻ w IUUQTQLHHPEFWHPPSHJOUFSO w ͱϙΠϯλͷϚοϐϯάςʔϒϧͷ࣮͕͍ͨ͠ΊࢀߟʹͳΔɻ
*Resolver) LookupNetIP(ctx context.Context, network, host string) ([]netip.Addr, error) { // TODO(bradfitz): make this efficient, making the internal net package // type throughout be netip.Addr and only converting to the net.IP slice // version at the edge. But for now (2021-10-20), this is a wrapper around // the old way. ips, err := r.LookupIP(ctx, network, host) if err != nil { return nil, err } ret := make([]netip.Addr, 0, len(ips)) for _, ip := range ips { if a, ok := netip.AddrFromSlice(ip); ok { ret = append(ret, a) } } return ret, nil }