第三章(表达式)

硬件的方向是物理,软件的结局是数学

  • go语言仅25个保留关键字

  • 无显式类型声明的常量,那么该常量操作数会自动转型
package main

import "fmt"

func main() {
	const v = 20 //无显式类型声明的变量
	fmt.Printf("%T,%v\n", v, v)
	var a byte = 10
	b := a + v                  //v自动转换为byte/uint8类型
	fmt.Printf("%T,%v\n", v, v) // int,20 v还是int类型,上面只是计算时隐式转换成uint8
	fmt.Printf("%T,%v", b, b)   //uint8,30
}
  • 优先级

    一元运算符优先级最高,二元则分为五个等级,从高往低分别是

相同优先级的二元运算符,从左往右依次计算

  • &^运算符(AND NOT)
        //AND NOT
	n1 := 6
	n2 := 11
	n3 := n1 &^ n2         // 0101 &^ 1011  //右操作数取反后与左操作数求&
	fmt.Printf("%04b", n3) // 0100

eg (AND NOT)

package main

import "fmt"

const (
	read   byte = 1 << iota // 0001
	write                   //0010
	exec                    //0100
	freeze                  //1000
)

func main() {
	//fmt.Printf("%04b  %04b  %04b %04b\n", read, write, exec, freeze)
	a := read | write | freeze                   // 0001 | 0010 | 1000 = 1011
	b := read | freeze | exec                    //0001 | 1000 | 0100 = 1101
	c := a &^ b                                  // 1011 &^ 1101   =  1011 & 0010 = 0010
	fmt.Printf("%04b &^ %04b = %04b\n", a, b, c) //1011 &^ 1101 = 0010
}

  • 自增运算符不能前置不能用于表达式只能作为独立语句

  • 指针不能做加减法运算(和C不用)和类型转换,支持相等运算符。如果两个指针指向同一地址或都为nil,那么它们相等

  • 符合类型(array/slice/map/struct)变量初始化时:

    • 初始化表达式必须含类型标签
    • 左花括号必须在类型尾部,不能另起一行
    • 多个成员初始值用逗号分隔
    • 允许多行,单每行须以逗号或花括号结束

eg

        //正确示例
	type data struct {
		x int
		s string
	}
	var a2 = data{1, "abc"}
	b2 := data{
		1,
		"abc",
	}
	fmt.Println(a2, b2)
  • switch相邻的空case不构成多条件匹配
func main() {
	a := 1
	switch a {
	case 1:  //隐式的 "case 1: break;"
	case 2:
		println(2)
	}
}
  • fallthrough(在switch语句使用)

    • 如需贯通后续case,须执行fallthrough,直接执行后续语句,而不匹配条件表达式,可以使用break语句终止。

    eg

    switch z := 5; z {
    
      case 5:
      	z += 10
      	println(z)
      	fallthrough
      case 6:
      	z += 20
      	println(z)
      	fallthrough
      default:
      	z += 100
      	println(z)
      }
          //输出 15 35 135
    
  • 如果range目标表达式是函数调用,仅执行一次

posted @ 2023-01-04 23:35  巴达克  阅读(33)  评论(0编辑  收藏  举报