Golang 细节问题 (更新中)

192 阅读2分钟

哪些类型可以作为常量类型

只有基本数据类型才可以作为常量类型,像int、float、bool、string,complex,rune 而引用类型,实例化对象是不可以的( 结构体、接口、哈希、切片)。

数组类型和切片类型、引用和数值类型

值类型在赋值和传参的时候,传递的是值的拷贝。 引用类在赋值和传参的时候,传递的是地址的拷贝。

值类型的内存分配在栈中,引用类型的内存通常分配在堆中。 栈内存由系统直接管理,(系统会自己回收)。堆内存需要自己管理(在Golang中有自己的垃圾回收器)。

  1. 数组是值类型
  2. 切片、map、管道、接口(特别记住函数也是)引用类型

判断类型: 可以用nil赋值的是引用类型,不可以用nil赋值的是数值类型。

    /*值类型
	 */

	type Person struct {}
	var i int = nil
	var j float64 = nil
	var b bool = nil
	var k string = nil
	var a [3]int = nil
	var p Person = nil

	/*
	引用类型,可以使用nil进行赋值
	 */
	var i1 *int = nil
	var j1 map[string]int = nil
	var k1 interface{} = nil
	var m1 chan int = nil
	var f func(int) = nil

使用nil进行赋值的时候必须指定变量的类型。

关于自增型

只有i++,并且只能单独执行

关于类型方法的主语参数问题

首先给Integer定义俩个方法:

type Integer int
func (i *Integer) Add(b Integer) Integer {
	return *i + b
}

func (i Integer) Mul(b Integer) Integer {
	return i * b
}

使用值类型调用指针方法

var i Integer = 3
	println(i.Add(4))
	println(i.Mul(5))

使用指针类型调用值方法:

var index Integer = 4
	var p *Integer = &index
	println(p.Add(3))
	println(p.Mul(3))

如果使用接口直接断言的情况下,值类型是不能调用引用方法,引用方法不能调用值类型。

var t interface{} = index
	//fmt.Println(t.(Integer).Add(3))	// 这个是不行的
	middle := t.(Integer)
	println(middle.Add(3))	// 这个却是可以的

接口方法

  1. 如果需要改变结构体实例中的变量,需要使用指针做方法主语。
type NameGetter interface {
	SetName(name string)
}

type Person struct {
	name string
}

func (p Person) SetName(name string) {
	p.name = name
}

这个时候通过SetName去修改的变量是无效的。

  1. 指针类型实现的接口,给接口赋值时必须使用到指针。
type NameGetter interface {
	SetName(name string)
}

type Person struct {
	name string
}

func (p *Person) SetName(name string) {
	p.name = name
}
func main() {
	var nameIntrface NameGetter = Person{} // 错误!!!!!
	var nameIntrface NameGetter = &Person{}  // 这个是正确的!!!!
}