package main

import (
	"Study/src/study/day8Method/common"
	"fmt"
	"net/url"
)

// nil也是一个合法的接受者
// 就像一些函数允许nil指针作为参数一样，
// 方法理论上也可以用nil指针作为其接收器，
// 尤其当nil对于对象来说是合法的零值时，比如map或者slice。
// 在下面的简单int链表的例子里，nil代表的是空链表：

// An IntList is a linked list of integers.
// A nil *IntList represents the empty list.
type IntList struct {
	Value int
	Tail  *IntList
}

// Sum returns the sum of the list elements.
func (list *IntList) Sum() int {
	if list == nil {
		return 0
	}
	return list.Value + list.Tail.Sum()
}

func main() {
	a := common.Point{X: 1, Y: 1}
	// 指针对象的方法
	Ppoint := &a
	Ppoint.ScaleBy(4)
	fmt.Println(Ppoint)
	fmt.Println(a)
	// 我们也可以直接使用非指针变量调用
	// go内部处理时候会自动取地址
	a.ScaleBy(-1)
	fmt.Println(a)
	// 临时变量是不可以得到地址的
	//Point{X: 1, Y: 1}.ScaleBy(1)	// 报错

	// nil也可以是接受者
	m := url.Values{"lang": {"en"}} // direct construction
	m.Add("item", "1")
	m.Add("item", "2")

	fmt.Println(m.Get("lang")) // "en"
	fmt.Println(m.Get("q"))    // ""
	fmt.Println(m.Get("item")) // "1"      (first value)
	fmt.Println(m["item"])     // "[1 2]"  (direct map access)

	m = nil
	fmt.Println(m.Get("item")) // ""
	m.Add("item", "3")         // panic: assignment to entry in nil map
	// 相当于
	url.Values(nil).Get("item")
	// 但是如果你直接写nil.Get("item")的话是无法通过编译的，
	// 因为nil的字面量编译器无法判断其准确类型。
}
