【go】学习笔记

 

1.go的优点

  • 简洁、快速、安全
  • 并行、有趣、开源
  • 内存管理、数组安全、编译迅速
  • 对于高性能分布式系统领域而言,Go 语言无疑比大多数其它语言有着更高的开发效率。

2.语言结构

2.1基础组成部分

包声明、引入包、函数、变量、语句 & 表达式、注释。第一行代码 package main 定义了包名。你必须在源文件中非注释的第一行指明这个文件属于哪个包,如:package main。package main表示一个可独立执行的程序,每个 Go 应用程序都包含一个名为 main 的包。例子:

package main

import "fmt"

func main() {
   /* 这是我的第一个简单的程序 */
   fmt.Println("Hello, World!")
}

※ 当标识符(包括常量、变量、类型、函数名、结构字段等等)以一个大写字母开头,如:Group1,那么使用这种形式的标识符的对象就可以被外部包的代码所使用(客户端程序需要先导入这个包),这被称为导出(像面向对象语言中的 public);标识符如果以小写字母开头,则对包外是不可见的,但是他们在整个包的内部是可见并且可用的(像面向对象语言中的 protected )。

※ { 大括号的左半边,不能单独在一行。

2.2运行程序

两种方式:

1)进入到hello.go所在目录中,运行如下命令

$ go run hello.go

2)先生成二进制文件,再运行二进制文件

$ go build hello.go 
$ ls
hello    hello.go
$ ./hello 

3.基础语法

Go 标记:Go 程序可以由多个标记组成,可以是关键字,标识符,常量,字符串,符号。也即是一行代码中能拆分出来的内容。

标识符:标识符用来命名变量、类型等程序实体。一个标识符实际上就是一个或是多个字母(A~Z和a~z)数字(0~9)、下划线_组成的序列,但是第一个字符必须是字母或下划线而不能是数字。这点同c语言。

数据类型:用于声明函数和变量。数据类型的出现是为了把数据分成所需内存大小不同的数据,编程的时候需要用大数据的时候才需要申请大内存,就可以充分利用内存。

序号 类型和描述
1 布尔型
布尔型的值只可以是常量 true 或者 false。一个简单的例子:var b bool = true。
2 数字类型
整型 int 和浮点型 float32、float64,Go 语言支持整型和浮点型数字,并且支持复数,其中位的运算采用补码。
3 字符串类型:
字符串就是一串固定长度的字符连接起来的字符序列。Go 的字符串是由单个字节连接起来的。Go 语言的字符串的字节使用 UTF-8 编码标识 Unicode 文本。
4 派生类型:
包括:
  • (a) 指针类型(Pointer)
  • (b) 数组类型
  • (c) 结构化类型(struct)
  • (d) Channel 类型
  • (e) 函数类型
  • (f) 切片类型
  • (g) 接口类型(interface)
  • (h) Map 类型

语言变量:变量来源于数学,是计算机语言中能储存计算结果或能表示值抽象概念。变量来源于数学,是计算机语言中能储存计算结果或能表示值抽象概念。声明变量的一般形式是使用 var 关键字,这点同scala。

//格式
var identifier type
//例子
var a string = "Runoob"

※:1.指定变量类型,如果没有初始化,则变量默认为零值。数值类型(包括complex64/128)为 0,布尔类型为 false,字符串为 ""(空字符串)。

※:2.根据值自行判定变量类型。eg:var v_name = value

※:3.省略 var, 注意 := 左侧如果没有声明新的变量,就产生编译错误。也就是说,要用:=,就不要使用var。

值类型和引用类型:

像 int、float、bool 和 string 这些基本类型都属于值类型,使用这些类型的变量直接指向存在内存中的值。当使用等号 = 将一个变量的值赋值给另一个变量时,如:j = i,实际上是在内存中将 i 的值进行了拷贝。

你可以通过 &i 来获取变量 i 的内存地址,例如:0xf840000040。值类型的变量的值存储在栈中。一个引用类型的变量 r1 存储的是 r1 的值所在的内存地址(数字),或内存地址中第一个字所在的位置。当使用赋值语句 r2 = r1 时,只有引用(地址)被复制。如果 r1 的值被改变了,那么这个值的所有引用都会指向被修改后的内容,在这个例子中,r2 也会受到影响。

使用 := 赋值操作符:如果在相同的代码块中,我们不可以再次对于相同名称的变量使用初始化声明。如果你在定义变量 a 之前使用它,则会得到编译错误 undefined: a。如果你声明了一个局部变量却没有在相同的代码块中使用它,同样会得到编译错误。但是全局变量是允许声明但不使用的。 同一类型的多个变量可以声明在同一行。

语言常量:常量是一个简单值的标识符,在程序运行时,不会被修改的量。常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型。

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

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

    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
    )
//运行结果
0 1 2 ha ha 100 100 7 8

go语言条件语句:

   /* 定义局部变量 */
   var a int = 10
 
   /* 使用 if 语句判断布尔表达式 */
   if a < 20 {
       /* 如果条件为 true 则执行以下语句 */
       fmt.Printf("a 小于 20\n" )
   }

Go 语言循环语句:for循环

语法:Go 语言的 For 循环有 3 种形式,只有其中的一种使用分号。

和 C 语言的 for 一样:

//格式
for init; condition; post { }
//例子
package main

import "fmt"

func main() {
        sum := 0
        for i := 0; i <= 10; i++ {
                sum += i
        }
        fmt.Println(sum)
}

和 C 的 while 一样:

        // 这样写也可以,更像 While 语句形式
        for sum <= 10{
                sum += sum
        }

和 C 的 for(;;) 一样:

        sum := 0
        for {
            sum++ // 无限循环下去
        }

           for-each range 循环:这种格式的循环可以对字符串、数组、切片等进行迭代输出元素。

package main
import "fmt"

func main() {
        strings := []string{"google", "runoob"}
        for i, s := range strings {
                fmt.Println(i, s)
        }

        //[6]int{1, 2, 3, 5} 表示数组长度是6,类型是int,初始化了前4个元素为{1,2,3,5}
        numbers := [6]int{1, 2, 3, 5}
        for i,x:= range numbers {
                fmt.Printf("第 %d 位 x 的值 = %d\n", i,x)
        }  
}

输出:
0 google
1 runoob
第 0 位 x 的值 = 1
第 1 位 x 的值 = 2
第 2 位 x 的值 = 3
第 3 位 x 的值 = 5
第 4 位 x 的值 = 0
第 5 位 x 的值 = 0

4.Go 语言函数

Go 语言最少有个 main() 函数。

Go 语言函数定义格式如下:

func function_name( [parameter list] ) [return_types] {
   函数体
}

例子,两个数比较大小,返回大的数:

/* 函数返回两个数的最大值 */
func max(num1, num2 int) int {
   /* 声明局部变量 */
   var result int

   if (num1 > num2) {
      result = num1
   } else {
      result = num2
   }
   return result
}

例子,多个返回值的函数,返回值用()括起来:

package main

import "fmt"

func swap(x, y string) (string, string) {
   return y, x
}

func main() {
   a, b := swap("Google", "Runoob")
   fmt.Println(a, b)
}

Go 语言数组:具有相同唯一类型的一组已编号且长度固定的数据项序列。

声明数组:Go 语言数组声明需要指定元素类型及元素个数,语法格式如下:

//格式
var variable_name [SIZE] variable_type
//例子
var balance [10] float32
//初始化数组
var balance = [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
//如果忽略 [] 中的数字不设置数组大小,Go 语言会根据元素的个数来设置数组的大小:
var balance = [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0}

数组元素可以通过索引(位置)来读取。格式为数组名后加中括号,中括号中为索引的值。eg:   Element[0] = 100

Go 语言指针:

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

类似于变量和常量,在使用指针前你需要声明指针。指针声明格式如下:

格式
var var_name *var-type
例子
var ip *int        /* 指向整型*/

如何使用指针?指针使用流程:定义指针变量,为指针变量赋值,访问指针变量中指向地址的值。在指针类型前面加上 * 号(前缀)来获取指针所指向的内容。当一个指针被定义后没有分配到任何变量时,它的值为 nil。

Go 语言结构体

在结构体中我们可以为不同项定义不同的数据类型。结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。

定义结构体:结构体定义需要使用 type 和 struct 语句。struct 语句定义一个新的数据类型,结构体中有一个或多个成员。type 语句设定了结构体的名称。结构体的格式如下:

type struct_variable_type struct {
   member definition
   member definition
   ...
   member definition
}

eg:
variable_name := structure_variable_type {value1, value2...valuen}

访问结构体成员:如果要访问结构体成员,需要使用点号 . 操作符。

参考:

1.网页资料:https://www.runoob.com/go/go-program-structure.html​​​​​​​

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章