go语言基础入门(1月13第一天)

146 阅读5分钟

当青训营遇上码上掘金

go语言结构

当标识符(包括常量、变量、类型、函数名、结构字段等等)以一个大写字母开头, 可以被外部代码使用(像面向对象语言中的 public), 如果以小写字母开头,则对包外是不可见的像面向对象语言中的 protected)

基础语法

在 Go 程序中,一行代表一个语句结束。

Printf实例

func main() {
   // %d 表示整型数字,%s 表示字符串
    var stockcode=123
    var enddate="2020-12-31"
    var url="Code=%d&endDate=%s"
    fmt.Printf(url,stockcode,enddate)
}
// 	输出:Code=123&endDate=2020-12-31

变量:

Go 语言变量名由字母、数字、下划线组成,其中首个字符不能为数字

var a string = "Runoob" // 声明一个变量

var b, c int = 1, 2 // 声明多个变量并赋值

没有初始化的变量会默认赋值: (0, false, "",nil)

以下几种为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 是接口

intVal := 1 相当于 var intValue = 1 //声明了一个新的变量并且赋值 注意: 出现在 := 左侧的变量不应该是已经被声明过的,否则会导致编译错误, 但是它只能被用在函数体内,而不可以用于全局变量的声明与赋值

可以将 var f string = "Runoob" 简写为 f := "Runoob"

var (  // 这种因式分解关键字的写法一般用于声明全局变量
    a int
    b bool
)
func main(){
    // 方法写在这里
}

go语言中的常量

// 定义的格式
const identifier [type] = value
  • 显式类型定义: const b string = "abc"
  • 隐式类型定义: const b = "abc"

iota,特殊常量,可以认为是一个可以被编译器修改的常量。

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

const (
    a = iota	// 0
    b = iota	// 1
    c = iota	// 2
)

const (
            a = iota   //0
            b          //1
            c          //2
            d = "ha"   //独立值,iota += 1
            e          //"ha"   iota += 1
            f = 100    //iota +=1
            g          //100  iota +=1
            h = iota   //7,恢复计数
            i          //8
    )
fmt.Println(a,b,c,d,e,f,g,h,i) // 0 1 2 ha ha 100 100 7 8

if语句

相当于java来说没有了()

if 布尔表达式 {
   /* 在布尔表达式为 true 时执行 */
}

if 布尔表达式 {
   /* 在布尔表达式为 true 时执行 */
} else {
  /* 在布尔表达式为 false 时执行 */
}

switch语句

匹配项后面也不需要再加 break

switch var1 {
    case val1:
        ...
    case val2:
        ...
    default:
        ...
}

使用 fallthrough 会强制执行后面的 case 语句

switch {
    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")
    }

/*
2、case 条件语句为 true
3、case 条件语句为 false
4、case 条件语句为 true
*/

循环语句

  • For 循环有 3 种形式,只有其中的一种使用分号
for init; condition; post { }
for condition { }
for { }
  • for 循环的 range 格式可以对 slice、map、数组、字符串等进行迭代循环
for key, value := range oldMap {
    newMap[key] = value
}
// 理解: 
  • 循环嵌套
for [condition |  ( init; condition; increment ) | Range]
{
   for [condition |  ( init; condition; increment ) | Range]
   {
      statement(s);
   }
   statement(s);
}

for i=2; i < 100; i++ {
      for j=2; j <= (i/j); j++ {
         if(i%j==0) {
            break; // 如果发现因子,则不是素数
         }
      }
      if(j > (i/j)) {
         fmt.Printf("%d  是素数\n", i);
      }
   }  

break 经常用于中断当前 for 循环或跳出 switch 语句

continue 跳过当前循环的剩余语句,然后继续进行下一轮循环。

  • 无线循环
func main() {
    for true  {
        fmt.Printf("这是无限循环。\n");
    }
}

函数

java中都没有函数, 都是定义在类中的方法

python中的def所定义的函数和go语言类似

func main(){
	// 调用其他函数
} // 无参数, 无返回值类型

func max(num1, num2 int) int {
    
}
  • 函数可以返回多个值(和python一样, 和java不同)

  • 值传递和引用传递(一个相当于传递的是备份, 另一个传递的是指针)
func swap(x, y int) int {
   var temp int

   temp = x /* 保存 x 的值 */
   x = y    /* 将 y 值赋给 x */
   y = temp /* 将 temp 值赋给 y*/

   return temp;
}

func swap(x *int, y *int) {
   var temp int
   temp = *x    /* 保持 x 地址上的值 */
   *x = *y      /* 将 y 值赋给 x */
   *y = temp    /* 将 temp 值赋给 y */
}

数组

  • 声明

var variable_name [SIZE] variable_type

var balance [10] float32

  • 初始化
var balance = [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
balance := [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}  // 快速初始化
//如果数组长度不确定,可以使用 ... 代替数组的长度
balance := [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0}

初始化数组中 {} 中的元素个数不能大于 [] 中的数字。

如果忽略 [] 中的数字不设置数组大小,Go 语言会根据元素的个数来设置数组的大小

  • 索引赋值
//  将索引为 1 和 3 的元素初始化
   balance3 := [5]float32{1:2.0,3:7.0}  
   for k = 0; k < 5; k++ {
      fmt.Printf("balance3[%d] = %f\n", k, balance3[k] )
   }
/*
balance3[0] = 0.000000
balance3[1] = 2.000000
balance3[2] = 0.000000
balance3[3] = 7.000000
balance3[4] = 0.000000
*/

指针

有**为内容值, 没表示地址

Go 语言的取地址符是 &,放到一个变量前使用就会返回相应变量的内存地址。

func main() {
   var a int = 10  

   fmt.Printf("变量的地址: %x\n", &a  )
}
// 变量的地址: 20818a220

好久没有使用指针了,回顾一下

 var a int= 20   /* 声明实际变量 */
   var ip *int        /* 声明指针变量 */

   ip = &a  /* 指针变量的存储地址 */

   fmt.Printf("a 变量的地址是: %x\n", &a  )

   /* 指针变量的存储地址 */
   fmt.Printf("ip 变量储存的指针地址: %x\n", ip )

   /* 使用指针访问值 */
   fmt.Printf("*ip 变量的值: %d\n", *ip )

结构体

变量类型在变量名后面

使用方法 变量名. 的形式