go的赋值与声明语法糖

:= 只有在左侧有未定义变量时才能使用(有定义的变量也可以)
:= 只进行语义上的检查,循环内也可以使用,第一次之后的效果和=相同
:= 和 = 都要求左右的值和变量一一对应,不会截断
特殊情况,map、chan、类型推定可以返回一个值,也可以是两个值
当map中该键不存在时,总是返回零值和false,否则后者返回true

当chan关闭以后,总是返回零值和false,否则后者返回true

package main

type INT int

func (r *INT) show() {
	println(int(*r))
}

func A() (INT, INT) {
	return 1, 2
}

func B() (INT, bool) {
	return 3, true
}

func C() (INT, error) {
	return 4, nil
}

func D(i <-chan int,o chan<- int) {
	x := <- i
	println(x)
	y,z := <- i
	println(y,z)
	o <- 1
}

func main() {
	
	var t INT
	t.show()
	
	a,b:=A()
	// a := A() /*报错*/
	// t = A()  /*报错*/
	println(a,b)
	
	a,c:=B()
	// c := B() /*报错*/
	// t = B()  /*报错*/
	println(a,c)
	
	a,d:=C()
	// d := C() /*报错*/
	// t = C()  /*报错*/
	println(a,d)
	
	// A().show() /*报错*/
	// B().show() /*报错*/
	// C().show() /*报错*/
	
	m:=map[int]int{1:1}
	i:=m[1]
	println(i)
	j,k:=m[7]
	println(j,k)
	
	u:=make(chan int)
	v:=make(chan int)
	go D(u,v)
	u <- 1
	u <- 2
	<- v
	close(u)
	close(v)
	y,z := <- u
	println(y,z)
}
// 0
// 1 2
// 3 true
// 4 (0x0,0x0)
// 1
// 0 false
// 1
// 2 true
// 0 false

本文来自:开源中国博客

感谢作者:刘地

查看原文:go的赋值与声明语法糖

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。