-
好难,感觉好难用
查看全部 -
本节要点: 如果对一个 nil channel 进行读和写操作会进入永久阻塞,
查看全部 -
var numbers3 = [5]int{1, 2, 3, 4, 5} var slice1 = numbers3[1:4]
请注意第二条赋值语句中在“=”右边那个部分。切片表达式一般由字符串、数组或切片的值以及由方括号包裹且由英文冒号“:”分隔的两个正整数组成。这两个正整数分别表示元素下界索引和元素上界索引。
在本例中,切片表达式
numbers3[1:4]
的求值结果为[]int{2, 3, 4}
。可见,切片表达式的求值结果相当于以元素下界索引和元素上界索引作为依据从被操作对象上“切下”而形成的新值。注意,被“切下”的部分不包含元素上界索引指向的元素。查看全部 -
原生支持并发编程
查看全部 -
errors.New
是一个很常用的函数。查看全部 -
请注意,如果一条
select
语句中不存在default case
, 并且在被执行时其中的所有case
都不满足执行条件,那么它的执行将会被阻塞!当前流程的进行也会因此而停滞。直到其中一个case
满足了执行条件,执行才会继续。我们一直在说case
执行条件的满足与否取决于其操作的通道在当时的状态。这里特别强调一点,即:未被初始化的通道会使操作它的case
永远满足不了执行条件。对于针对它的发送操作和接收操作来说都是如此。查看全部 -
只能用于通道
查看全部 -
另外,还有一点需要大家注意,我们在基底类型的值上仍然可以调用它的指针方法。例如,若我们有一个
Person
类型的变量bp
,则调用表达式bp.Grow()
是合法的。这是因为,如果Go语言发现我们调用的Grow
方法是bp
的指针方法,那么它会把该调用表达式视为(&bp).Grow()
。实际上,这时的bp.Grow()
是(&bp).Grow()
的速记法。查看全部 -
只要我们把
Grow
变回指针方法就可以解决这个问题。原因是,这时的person
代表的是p
的值的指针的副本。指针的副本仍会指向p
的值。另外,之所以选择表达式person.Age
成立,是因为如果Go语言发现person
是指针并且指向的那个值有Age
字段,那么就会把该表达式视为(*person).Age
。其实,这时的person.Age
正是(*person).Age
的速记法。查看全部 -
的指针方法
查看全部 -
是典型的无侵入式的接口实现方法。
查看全部 -
- 当
*
出现在一个类型之前(如*Person
和*[3]string
)时被视为一个符号- 类似C语言
查看全部 -
//键入的数>通道长度,timeout
//直接输出通道,不接收;为地址
//cc := <- ch3 接收的值大于有的数,timeout
查看全部 -
slice(1:3)
前面的下标从0开始后面的下标从1开始
查看全部 -
go命令教程:https://github.com/hyper-carrot/go_command_tutorial
查看全部
举报