golang 切片的使用

// 使用指针切片的情况:
1. 结构体大(>64字节)且切片长(>1000)
2. 数据经常需要修改
3. 需要在多个地方共享相同的数据实例
4. 结构体包含需要维护的资源(如连接、文件句柄等)

// 使用值切片的情况:
1. 结构体小(<64字节) 2. 数据主要用于读取 3. 不需要共享数据实例 4. 结构体是简单的数据集合
// 1. 函数参数使用指针 – 避免复制大结构体
func UpdateWhois(w *Rediswhois) error {
if w == nil {
return errors.New(“nil whois”)
}
// … 处理逻辑
}

// 2. 返回单个结构体用指针 – 避免复制大结构体
func GetWhois(domain string) (*Rediswhois, error) {
w := &Rediswhois{
Domain: domain,
// …
}
return w, nil
}

// 3. 返回切片用值类型 – 因为切片本身已经是指针语义
func GetWhoisList() []Rediswhois {
list := make([]Rediswhois, 0)
// … 填充数据
return list
}

// 4. 如果返回的切片后续要作为参数传递,则用指针切片
func GetWhoisListForUpdate() []*Rediswhois {
list := make([]*Rediswhois, 0)
// … 填充数据
return list
}

// 使用示例
func main() {
// 获取单个,使用指针
whois, _ := GetWhois(“example.com”)
UpdateWhois(whois)

// 获取列表,使用值类型切片
list := GetWhoisList()
for i := range list {
fmt.Println(list[i].Domain)
}

// 如果需要更新列表中的项,使用指针切片
updateList := GetWhoisListForUpdate()
for _, w := range updateList {
UpdateWhois(w) // 直接传递指针
}
}

Categories go

Leave a Reply