Go 2 语法与分支循环

特性

基本

变量

组成:以字母或下划线开头,由一个或多个字母、数字、下划线

使用:先定义在使用;声明后必须使用否则会编译错误,若想忽略参见  _  的用法

声明方式

第一种,指定变量类型,声明后若不赋值,使用默认值
var a int
var s string    
//Go语言定义完之后可以不赋值fmt.Println(“%d %q\n”,a,s) //q是将引号打出来 输出是:0 “

第二种,根据值自行判定变量类型(类型推断Type inference)
第三种,使用:=定义变量:a,b,I,s1,s2 := true,false,3,”hello”,”world” 但只能在函数内使用
注意:多个变量同时声明时,至少保证一个是新变量,否则会导致编译错误(简短声明)

多变量声明

第一种,以逗号分隔,声明与赋值分开,若不赋值,存在默认值
a,b,c,s := 3,4,true,”def”  第二种,直接赋值,下面的变量类型可以是不同的类型 第三种,集合类型可放在函数内,或直接放在包内;使用var()集中定义变量

注意:相同代码块不可对同名变量使用:=进行初始化声明(已经存在),可对其重新赋值比如:a = 10

_空白标识符

只写变量,不能得到其值。
用途:
1)声明后不想使用所有,比如不需要从一个函数得到所有值
2)并行赋值

常量

const identifier [type] = value
显式类型定义 const b string = "abc" 隐式类型定义 const b = "abc"

特点:

常量定义枚举类型,Go无枚举关键字
Const数值可作为各种类型使用
使用iota表示自增值
Go语言大小写有含义,常量不需要全部大写 常量组中如不指定类型和初始化值,则与上一行非空常量右值相同

iota

特殊常量,可以认为是一个可以被编译器修改的常量
在每一个const关键字出现时,被重置为0,然后再下一个const出现之前,每出现一次iota,其所代表的数字会自动增加1
iota 可以被用作枚举值
注意:
如果中断iota自增,则必须显式恢复。且后续自增值按行序递增
自增默认是int类型,可以自行进行显示指定类型
数字常量不会分配存储空间,无须像变量那样通过内存寻址来取值,因此无法获取地址

例子:

func enums() {
  const(
    cpp=0
    java=1
    python=2
    golang=3
}
fmt.Println(cpp,java,python,golang) //输出是:0,1,2,3
func enums() {
  const(
    cpp=iota
    _
    python
    golang
    javascript
}
fmt.Println(cpp, javascript,python,golang)//输出是 0 4 2 3

内建变量类型

bool

布尔型的值只可以是常量 true 或者 false

Numeric Types

int8,int16,int32,int64,int   (注:int根据系统32还是64决定)

int8 有符号 8 位整型 (-128 到 127)
int16 有符号 16 位整型 (-32768 到 32767)
int32 有符号 32 位整型 (-2147483648 到 2147483647)
int64 有符号 64 位整型 (-9223372036854775808 到 9223372036854775807)

uint8,uint16,uint32,unint64,unit

uint8 无符号 8 位整型 (0 到 255)
uint16 无符号 16 位整型 (0 到 65535)
uint32 无符号 32 位整型 (0 到 4294967295)
uint64 无符号 64 位整型 (0 到 18446744073709551615)
int 与 unit 都是 32位或者64位
uintptr 无符号整型,用于存放一个指针

float32,float64

float32  IEEE-754 32位浮点型数
float64  IEEE-754 64位浮点型数

complex64,complex128

complex64 32 位实数和虚数
complex128 64 位实数和虚数

byte  类似unit8

rune  类似int32  (注:Go中没有char )

string

一串固定长度的字符连接起来的字符序列。Go的字符串是由单个字节连接起来的,字节使用UTF-8编码标识Unicode文本。

分支循环

if 语句

If的条件里可以赋值;赋值的变量作用域在该if语句

const filename=”abc.txt”
   if contents,err := ioutil.ReadFile(filename);err!=null{
      fmt.Println(err)
   } else {
      fmt.Printf(“%s\n”,contents)
   }

switch语句

switch会自动break 除非使用fallthrough(必须在某个case最后一行,否则编译器会报错)

switch 语句还可以被用于 type-switch 来判断某个 interface 变量中实际存储的变量类型。

switch x.(type){
    case type:
       statement(s);
    case type:
       statement(s);
    /* 你可以定义任意个数的case */
    default: /* 可选 */
       statement(s);
}

select语句

类似于 switch 语句,但是select会随机执行一个可运行的case。如果没有case可运行,它将阻塞,直到有case可运行。

这里涉及到channel,稍后补充

var c1, c2, c3 chan int
   var i1, i2 int
   select {
      case i1 = <-c1:
         fmt.Printf("received ", i1, " from c1\n")
      case c2 <- i2:
         fmt.Printf("sent ", i2, " to c2\n")
      case i3, ok := (<-c3):  // same as: i3, ok := <-c3
         if ok {
            fmt.Printf("received ", i3, " from c3\n")
         } else {
            fmt.Printf("c3 is closed\n")
         }
      default:
         fmt.Printf("no communication\n")
   }
//结果:no communication

循环语句

for是唯一的循环语句。(Go没有while循环) for条件里可省略初始条件,结束条件,递增表达式

for init; condition; post { }
for condition { }
for {}  //死循环

for 循环的 range 格式可以对 slice、map、数组、字符串等进行迭代循环

for key, value := range oldMap {
    newMap[key] = value
}

break:跳出循环体。break语句用于在结束其正常执行之前突然终止for循环。

continue:跳出一次循环。continue语句用于跳过for循环的当前迭代。

goto:可以无条件地转移到过程中指定的行。

猜你喜欢

转载自www.cnblogs.com/ycx95/p/9368735.html