目录

一、变量

1、语法:var 变量名称 变量类型

2、如果定义变量的时候没有进行初始化,会使用默认初始值

3、初始化声明 :=,下面两个方式是等价的

4、因式分解关键字写法(一般用于全局变量)

二、常量

1、语法:const 常量名称 常量类型

2、特殊的常量iota

三、运算符

四、基本逻辑语句

1、条件语句

2、循环语句

五、函数

1、语法

2、和C++的不同之处

3、注意点

4、闭包

5、方法


 

一、变量

1、语法:var 变量名称 变量类型

var str string = "pfei"
var a, b int = 1, 2
var mark bool // 默认false

2、如果定义变量的时候没有进行初始化,会使用默认初始值

数值类型      0
布尔类型      false
字符串        “”
以下类型为nil:
    var a *int
    var a []int
    var a map[string] int
    var a chan int
    var a func(string) int
    var a error // error 是接口

3、初始化声明 :=,下面两个方式是等价的

var f string = "pfei"
f := "pfei"

4、因式分解关键字写法(一般用于全局变量)

var(
    a int
    b bool
    c float
)

局部变量一旦被声明必须被使用,但是全局变量可以不被使用。

二、常量

在程序运行的时候不会被修改的量。

1、语法:const 常量名称 常量类型

// 显式定义
const s string = "pfei"
// 隐式定义
const s = "pfei"
//用于枚举
const (
    unknown = 0
    female = 1
    male = 2
)

2、特殊的常量iota

可以被编译器修改的常量,iota在const关键字出现的时候被重置为0(const内部的第一行之前)const 中每新增一行常量声明将使 iota 计数一次(iota 可理解为 const 语句块中的行索引)。

用法(1) 枚举值

const(
    a = itoa
    b
    c
)

// 输出为
0 1 2

用法(2)

const(
    a = itoa    
    b            
    c            
    d = "pfei"   
    e
    f = 100
    g
    h = itoa
    i
)
// 输出结果为
0
1
2
pfei
pfei
100
100
7
8

用法(3)

const(
    i=1<<iota
    j=3<<iota  // 3左移一位
    k          // 3左移两位
    l          // 3左移三位
)
// 输出结果
1
6
12
24

注意:当变量没有给值的时候就用上一个变量使用的值,然后运算的时候iota常量会自加1。

三、运算符

1、算数运算符

+、-、*、/、%、++、--

2、关系运算符

==、!=、>、<、>=、<=

3、逻辑运算符

&&、||、!

4、位运算符

&、|、^(异或)、<<、>>

5、运算符也可以像C++一样用于赋值符号的左侧,表示先运算再赋值,例如:*=、<<=、&=

6、其他运算符

& 返回变量地址

* 指针变量

四、基本逻辑语句

1、条件语句

  • if
  • if...else
  • if嵌套
  • switch
  • select

样例:

// if
if 布尔表达式{
    ...
}

// if...else,注意此处else的位置,放到其他地方报错
if 布尔表达式{
    ...
}else{
    ...
)

//switch
switch var0{
    case var1:
        ...
    case var2:
        ...
    default:
        ...
}
// type switch
switch i := x.(type) {
   case nil:  
      fmt.Printf(" x 的类型 :%T",i)                
   case int:  
      fmt.Printf("x 是 int 型")                      
   case float64:
      fmt.Printf("x 是 float64 型")          
   case func(int) float64:
         fmt.Printf("x 是 func(int) 型")                      
   case bool, string:
      fmt.Printf("x 是 bool 或 string 型" )      
   default:
      fmt.Printf("未知型")    
}  
// 通过fallthrough语句来强制执行下一个case
var v bool = false
switch v{
	case false:
		fmt.Println("1、case 条件语句为 false")
		fallthrough
	case true:
		fmt.Println("2、case 条件语句为 true")
		fallthrough
	case false:
		fmt.Println("3、case 条件语句为 false")
		fallthrough
	case true:
		fmt.Println("4、case 条件语句为 true")
	case false:
		fmt.Println("5、case 条件语句为 false")
		fallthrough
	default:
		fmt.Println("6、默认 case")
}
// select后补

2、循环语句

  • for i := 0; i <= 10; i++
  • for // 无限循环
  • for i, x := range numbers

样例:

numbers := [6]int {1, 2, 3, 5}
for i, x := range numbers{
    fmt.Println("第%d位x的值=%d\n", i, x)
}

goto语句

var a int = 10

   /* 循环 */
   LOOP: for a < 20 {
      if a == 15 {
         /* 跳过迭代 */
         a = a + 1
         goto LOOP
      }
      fmt.Printf("a的值为 : %d\n", a)
      a++    
   }

五、函数

1、语法

func 函数名称(参数列表) 返回值类型{
    ...
}

2、和C++的不同之处

  • 返回值类型写在后面,而不是函数名之前(创新点???)
  • GO函数可以返回多个返回值

3、注意点

  • 值传递:不影响实际参数
  • 引用传递:func swap(a *int, b *int){}

4、闭包

// 注意此处ff是一个匿名函数,所以每次调用会自加一次1
func add() func() int{
	var i int = 0
	return func() int{
		i += 1
		return i
	}
}
func main(){
	ff := add()
	fmt.Println(ff())
	fmt.Println(ff())
}

5、方法

方法:就是结构体或者类中实现功能的函数,java中就只有函数

函数:实现某些功能,不用放到类或者结构体中

定义语法:func (变量名 变量类型) 函数名(参数) 返回值类型 {}

package main

import (
   "fmt"  
)

/* 定义结构体 */
type Circle struct {
  radius float64
}

//该 method 属于 Circle 类型对象中的方法
func (c Circle) getArea() float64 {
  //c.radius 即为 Circle 类型对象中的属性
  return 3.14 * c.radius * c.radius
}

func main() {
  var c1 Circle
  c1.radius = 10.00
  fmt.Println("圆的面积 = ", c1.getArea())
}