• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Go 语言入门学习

武飞扬头像
米酱
帮助3

基础概念

特点

  • 自动垃圾回收
  • 更丰富的内置类型
  • 函数多返回值
  • 错误处理
  • 匿名函数和闭包
  • 类型和接口
  • 并发编程
  • 反射
  • 语言交互性

用途

  • Go 语言被设计成一门应用于搭载 Web 服务器,存储集群或类似用途的巨型中央服务器的系统编程语言。
  • 对于高性能分布式系统领域而言,Go 语言无疑比大多数其它语言有着更高的开发效率。它提供了海量并行的支持,这对于游戏服务端的开发而言是再好不过了

一个go文件的基础结构

学新通

  • 包声明

  • 引入包

  • 注释 /*...*/ 是注释,在程序执行时将被忽略。单行注释是最常见的注释形式,你可以在任何地方使用以 // 开头的单行注释。

  • 变量

  • 函数

  • 语句 & 表达式

基础语法

数据类型

  • 布尔 var b bool = true

  • 数字

    整型 int 和浮点型 float32、float64,Go 语言支持整型和浮点型数字,并且支持复数,位的运算采用补码。

  • 字符串

  • 派生

    • 指针类型(Pointer)

      空指针:当一个指针被定义后没有分配到任何变量时,它的值为 nil

    • 数组类型

      • 声明 var arrayName [size]dataType

        在 Go 语言中,数组的大小是类型的一部分,因此不同大小的数组是不兼容的,也就是说 [5]int 和 [10]int 是不同的类型

      • 初始化

        var numbers [5]int
        var numbers = [5]int{1, 2, 3, 4, 5}
        var balance = [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0} 或 balance := [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
        
      • 访问 var salary float32 = balance[9]

    • 结构化类型(struct)

      • 定义

         type struct_variable_type struct { member definition member definition ... member definition }
        
      • 访问结构体成员:使用点号.操作符

    • 切片类型

      Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go 中提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。

      • 定义

        var identifier []type
        var slice1 []type = make([]type, len) 也可以简写为 slice1 := make([]type, len)
        
      • 操作

        append() 和 copy() 函数 如果想增加切片的容量,我们必须创建一个新的更大的切片并把原分片的内容都拷贝过来。

    • Map 类型

      • 定义
        /* 使用 make 函数 */ 
        map_variable := make(map[KeyType]ValueType, initialCapacity)
        
    • 函数类型

    • Channel 类型

    • 接口类型(interface)

      Go 语言提供了另外一种数据类型即接口,它把所有的具有共性的方法定义在一起,任何其他类型只要实现了这些方法就是实现了这个接口。 接口可以让我们将不同的类型绑定到一组公共的方法上,从而实现多态和灵活的设计。

      /* 定义接口 */ 
      type interface_name interface {    
          method_name1 [return_type]    
          method_name2 [return_type]    
          method_name3 [return_type]    
          ...    
          method_namen [return_type] 
      } 
      
      /* 定义结构体 */ 
      type struct_name struct {    
          /* variables */ 
      } 
      
      /* 实现接口方法 */ 
      func (struct_name_variable struct_name) method_name1() [return_type] {    
          /* 方法实现 */ 
      } 
      
      ... 
      
      func (struct_name_variable struct_name) method_namen() [return_type] {    
          /* 方法实现*/ 
      }
      
      

变量声明

  • 声明变量的一般形式是使用 var 关键字

  • 方式

// 实例1
var identifier type
var identifier1, identifier2 type

// 实例2

// 赋初值,不用给类型,自动判断

// 实例3

// := 是一个声明语句

// intVal := 1 相等于 var intVal int intVal =1
  • _实际上是一个只写变量,你不能得到它的值。这样做是因为 Go 语言中你必须使用所有被声明的变量,但有时你并不需要使用从一个函数得到的所有返回值。

    • 并行赋值也被用于当一个函数返回多个返回值时,如下:

学新通

常量声明

  • 常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型。

  • 方式

    const identifier [type] = value
    const c_name1, c_name2 = value1, value2
    
  • iota,特殊常量,可以认为是一个可以被编译器修改的常量。

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

运算符

  • 算术

  • 关系

  • 逻辑

  • 赋值

  • 其他

学新通

条件判断

Go 没有三目运算符,所以不支持 ?: 形式的条件判断。

学新通

循环

学新通

函数

  • 定义
func function_name( [parameter list] ) [return_types] { 
    // 函数体 
}

// func:函数由 func 开始声明 
// function_name:函数名称,参数列表和返回值类型构成了函数签名。  
// parameter list:参数列表,参数就像一个占位符,当函数被调用时,你可以将值传递给参数,这个值被称为实际参数。参数列表指定的是参数类型、顺序、及参数个数。参数是可选的,也就是说函数也可以不包含参数。 // // return_types:返回类型,函数返回一列值。return_types 是该列值的数据类型。有些功能不需要返回值,这种情况下 return_types 不是必须的。 
// 函数体:函数定义的代码集合。
  • 声明
/* 声明函数变量 */ 
getSquareRoot := func(x float64) float64 { 
    return math.Sqrt(x) 
}

语言范围(Range)

Go 语言中 range 关键字用于 for 循环中迭代数组(array)、切片(slice)、通道(channel)或集合(map)的元素。在数组和切片中它返回元素的索引和索引对应的值,在集合中返回 key-value 对。

package main 

import "fmt" 

func main() {     
    map1 := make(map[int]float32)     
    map1[1] = 1.0     
    map1[2] = 2.0     
    map1[3] = 3.0     
    map1[4] = 4.0         
    // 读取 key 和 value     
    for key, value := range map1 {       
        fmt.Printf("key is: %d - value is: %f\n", key, value)     
    }
    // 读取 key     
    for key := range map1 {       
        fmt.Printf("key is: %d\n", key)     
    }
    // 读取 value
    for _, value := range map1 {
        fmt.Printf("value is: %f\n", value)     
    } 
}

类型转换

  • 定义:type_name(expression)

  • 转换

    • 数值类型:var a int = 10 var b float64 = float64(a)

    • 字符串类型

      // strconv.Atoi 函数返回两个值,第一个是转换后的整型值,第二个是可能发生的错误,我们可以使用空白标识符 _ 来忽略这个错误
      var str string = "10" 
      var num int num, _ = strconv.Atoi(str)       
      
      package main 
      
      import (
          "fmt"     
          "strconv" 
      ) 
      
      func main() {     
          num := 3.14     
          str := strconv.FormatFloat(num, 'f', 2, 64)     
          fmt.Printf("浮点数 %f 转为字符串为:'%s'\n", num, str) 
      }   
      

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfhbbij
系列文章
更多 icon
同类精品
更多 icon
继续加载