这里是读取本地文件的所调用的函数
func ParseNode(rawurl string) (*Node, error) {
if m := incompleteNodeURL.FindStringSubmatch(rawurl); m != nil {
id, err := HexID(m[1])
if err != nil {
return nil, fmt.Errorf("invalid node ID (%v)", err)
}
return NewNode(id, nil, 0, 0), nil
}
return parseComplete(rawurl)
}
func parseComplete(rawurl string) (*Node, error) {
var (
id NodeID
ip net.IP
tcpPort, udpPort uint64
)
u, err := url.Parse(rawurl)
if err != nil {
return nil, err
}
if u.Scheme != "enode" {
return nil, errors.New("invalid URL scheme, want \"enode\"")
}
// Parse the Node ID from the user portion.
if u.User == nil {
return nil, errors.New("does not contain node ID")
}
if id, err = HexID(u.User.String()); err != nil {
return nil, fmt.Errorf("invalid node ID (%v)", err)
}
// Parse the IP address.
host, port, err := net.SplitHostPort(u.Host)
if err != nil {
return nil, fmt.Errorf("invalid host: %v", err)
}
if ip = net.ParseIP(host); ip == nil {
return nil, errors.New("invalid IP address")
}
// Ensure the IP is 4 bytes long for IPv4 addresses.
if ipv4 := ip.To4(); ipv4 != nil {
ip = ipv4
}
// Parse the port numbers.
if tcpPort, err = strconv.ParseUint(port, 10, 16); err != nil {
return nil, errors.New("invalid port")
}
udpPort = tcpPort
qv := u.Query()
if qv.Get("discport") != "" {
udpPort, err = strconv.ParseUint(qv.Get("discport"), 10, 16)
if err != nil {
return nil, errors.New("invalid discport in query")
}
}
return NewNode(id, ip, uint16(udpPort), uint16(tcpPort)), nil
}
---------------------
作者:不折腾就闹心
来源:CSDN
原文:https://blog.csdn.net/DDFFR/article/details/79228539
初级程序员与中级程程序员的差距
现有的IT培训机构通常是4至6个月的课程培养初级程序员,而初级程序员与中级程序员的差别,就在于后者比前者多了3-4年工作经验,每年会接触1-2个项目,中级程序员比初级程序员多了相关的行业经验和项目经验。
企业需要中级及以上程序员
IT行业技术不断发展,IT行业用人单位对人才的要求越来越高,IT培训机构4—6个月的课程产品要培养出企业需要的人才越来越难。
中级程序员课程
传智播客已经进行了课程产品升级,将定位中级程序员培养。推出多领域实战项目课程,将课程时长延长至9至12个月,采用线上和线下混合式教学,布局中级程序员人才培养,学费不变。传智播客还公布了43个主流行业项目,涉及Java、大数据、Python、PHP和前端等5个技术领域。【点击页面咨询按钮,了解中级程序员课程】
推荐了解热门学科
黑马程序员热门视频教程