在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
限定标识符限定标识符为使用包名前缀限定的标识符。包名与标识符均不能为空白的。限定标识符用于访问另一个包中的标识符,它必须被导入。 标识符必须是已导出且在该包的包块中声明。 math.Sin // 表示math包中的Sin函数 函数字面函数字面可赋予一个变量或直接调用。 f := func(x, y int) int { return x + y } func(ch chan int) { ch <- ACK }(replyChan) 闭包 的函数字面:它们可引用定义在外围函数中的变量。 那些变量共享于外围函数与函数字面之间,并且只要它们可访问就会继续存在。 选择器 .对于不为包名的主表达式 x,选择器表达式为, x.f
选择者会自动解引用指向结构的指针。 若 x 为指向结构的指针,x.y 即为 (*x).y 的缩写; 若字段 y 亦为指向结构的指针,x.y.z 即为 (*(*x).y).z 的缩写, 以此类推。 若 x 包含类型为 *A 的匿名字段,且 A 亦为结构类型, x.f 即为 (*x.A).f 的缩写。 p.z // (*p).z p.y // ((*p).T1).y p.x // (*(*p).T0).x p.M2() // (*p).M2() p.M1() // ((*p).T1).M1() p.M0() // ((*p).T0).M0() 下标表达式形式为:a[x] 切片对于数组或字符串,若 a[low : high] 类型断言对于接口类型的表达式 x 与类型 T,主表达式x.(T),注意x必须为接口类型 var x interface{} = 7 // x 拥有动态类型 int 与值 7 i := x.(int) // i 拥有类型 int 与值 7 type I interface { m() } var y I s := y.(string) // 非法:string 没有实现 I(缺少方法 m) r := y.(io.Reader) // r 拥有 类型 io.Reader 且 y 必须同时实现了 I 和 io.Reader 更确切地说,若 若该类型断言成立,该表达式的值即为存储于 若类型断言以 v, ok = x.(T) v, ok := x.(T) var v, ok = x.(T) 若该断言成立,该表达式返回值对 (x.(T), true);否则,该表达式返回 (Z, false), 其中 Z 为类型为 T 的零值。此种情况不会产生运行时恐慌。 类型断言在这种构造中,其行为类似于函数调用返回一个值与一个布尔值以表示成功。 比较操作符在任何比较中,第一个操作数必须为可赋予第二个操作数的类型,反之亦然。 相等性操作符
地址操作符对于类型为 T 的操作数 x,地址操作符 &x 将生成一个类型为 *T 的指针指向 x。对于指针类型为 *T 的操作数 x,间接指针 *x 表示类型为 T 的值指向 x。若 x 为 nil, 尝试求值 *x 将会引发运行时恐慌。 &x &a[f(2)] &Point{2, 3} *p *pf(x) 接收操作符v1 := <-ch v2 = <-ch f(<-ch) <-strobe // 在时钟脉冲和丢弃接收值之前等待 x, ok = <-ch x, ok := <-ch var x, ok = <-ch 若接收的值由一次成功向信道发送的操作发出的,则 ok 的值为 true; 若接收的值是由于信道被关闭或为空而产生的零值,则为 false。 类型转换类型转换是形式为 T(x) 的表达式,其中 T 为类型,而 x 是可转换为类型 T 的表达式。 若类型以操作符 *Point(p) // 等价于 *(Point(p)) (*Point)(p) // p 被转换为 (*Point) <-chan int(c) // 等价于 <-(chan int(c)) (<-chan int)(c) // c 被转换为 (<-chan int) func()(x) // 函数签名 func() x (func())(x) // x 被转换为 (func()) |
请发表评论