go语言基础语法示例

周末天气不好,只能宅在家里,于是就顺便看了一下Go语言,觉得比较有意思,所以写篇文章介绍一下。我想写一篇你可以在乘坐地铁或公交车上下班时就可以初步了解一门语言的文章。所以,下面的文章主要是以代码和注释为主。只需要你对Java,Python,C等编程语言有一点基础,我相信你会在30分钟左右读完并对Go语言有一些初步了解的。

本文的唯一目的,就是希望大家阅读之后,能够了解go语言长什么样子。。。

Hello World

package main //声明本文件的package名
 import "fmt" //import语言的fmt库——用于输出
 func main() {
   fmt.Println("hello world")
 }

运行

你可以有两种运行方式,

解释执行(实际是编译成a.out再执行.
 $go run hello.go
 hello world
编译执行

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

自己的package

你可以使用GOPATH环境变量,或是使用相对路径来import你自己的package。

Go的规约是这样的:

1)在import中,你可以使用相对路径,如 ./或 ../ 来引用你的package

2)如果没有使用相对路径,那么,go会去找$GOPATH/src/目录。

使用相对路径

import "./haoel" //import当前目录里haoel子目录里的所有的go文件

使用GOPATH路径

import "haoel" //import 环境变量 $GOPATH/src/haoel子目录里的所有的go文件

fmt输出格式

fmt包和libc里的那堆使用printf, scanf,fprintf,fscanf 很相似。下面的东西对于C程序员不会陌生。

注意:Println不支持,Printf才支持%式的输出:

package main

import "fmt"
import "math"

func main() {
  fmt.Println("hello world")

  fmt.Printf("%t\n", 1==2)
  fmt.Printf("二进制:%b\n", 255)
  fmt.Printf("八进制:%o\n", 255)
  fmt.Printf("十六进制:%X\n", 255)
  fmt.Printf("十进制:%d\n", 255)
  fmt.Printf("浮点数:%f\n", math.Pi)
  fmt.Printf("字符串:%s\n", "hello world")
}

当然,也可以使用如\n\t\r这样的和C语言一样的控制字符

变量和常量

变量的声明很像 javascript,使用 var关键字。注意:go是静态类型的语言,下面是代码:

//声明初始化一个变量
var x int = 100
var str string = "hello world"</pre>
//声明初始化多个变量
var i, j, k int = 1, 2, 3

//不用指明类型,通过初始化值来推导
var b = true //bool型

还有一种定义变量的方式(这让我想到了Pascal语言,但完全不一样)

x := 100 //等价于 var x int = 100;

常量很简单,使用const关键字:

const s string = "hello world"
 const pi float32 = 3.1415926

数组

直接看代码(注意其中的for语句,和C很相似吧,就是没有括号了)

func main() {
  var a [5]int
  fmt.Println("array a:", a)

  a[1] = 10
  a[3] = 30
  fmt.Println("assign:", a)

  fmt.Println("len:", len(a))

  b := [5]int{1, 2, 3, 4, 5}
  fmt.Println("init:", b)

  var c [2][3]int
  for i := 0; i < 2; i++ {
    for j := 0; j < 3; j++ {
      c[i][j] = i + j
    }
  }
  fmt.Println("2d: ", c)
}

运行结果:

array a: [0 0 0 0 0]
assign: [0 10 0 30 0]
len: 5
init: [1 2 3 4 5]
2d: [[0 1 2] [1 2 3]]

数组的切片操作

这个很Python了。

a := [5]int{1, 2, 3, 4, 5}
b := a[2:4] // a[2] 和 a[3],但不包括a[4]
fmt.Println(b)
b = a[:4] // 从 a[0]到a[4],但不包括a[4]
fmt.Println(b)
b = a[2:] // 从 a[2]到a[4],且包括a[2]
fmt.Println(b)

分支循环语句

if语句

注意:if 语句没有圆括号,而必需要有花括号

//if 语句
if x % 2 == 0 {
  //...
}
//if - else
if x % 2 == 0 {
  //偶数...
} else {
  //奇数...
}

//多分支
if num < 0 {
  //负数
} else if num == 10 {
  //零
} else {
  //正数
}

switch 语句

注意:switch语句没有break,还可以使用逗号case多个值

switch i {
  case 1:
    fmt.Println("one")
  case 2:
    fmt.Println("two")
  case 3:
    fmt.Println("three")
  case 4,5,6:
    fmt.Println("four, five, six")
  default:
    fmt.Println("invalid value!")
}

for 语句

前面你已见过了,下面再来看看for的三种形式:(注意:Go语言中没有while)

//经典的for语句 init; condition; post
for i := 0; i<10; i++{
   fmt.Println(i)
}

//精简的for语句 condition
i := 1
for i<10 {
  fmt.Println(i)
  i++
}

//死循环的for语句 相当于for(;;)
i :=1
for {
  if i>10 {
    break
  }
  i++
}

关于分号

从上面的代码我们可以看到代码里没有分号。其实,和C一样,Go的正式的语法使用分号来终止语句。和C不同的是,这些分号由词法分析器在扫描源代码过程中使用简单的规则自动插入分号,因此输入源代码多数时候就不需要分号了。

规则是这样的:如果在一个新行前方的最后一个标记是一个标识符(包括像int和float64这样的单词)、一个基本的如数值这样的文字、或以下标记中的一个时,会自动插入分号:

break continue fallthrough return ++ -- ) }
通常Go程序仅在for循环语句中使用分号,以此来分开初始化器、条件和增量单元。如果你在一行中写多个语句,也需要用分号分开。

注意:无论任何时候,你都不应该将一个控制结构((if、for、switch或select)的左大括号放在下一行。如果这样做,将会在大括号的前方插入一个分号,这可能导致出现不想要的结果。

map

map在别的语言里可能叫哈希表或叫dict,下面是和map的相关操作的代码,代码很容易懂

func main(){
  m := make(map[string]int) //使用make创建一个空的map

  m["one"] = 1
  m["two"] = 2
  m["three"] = 3

  fmt.Println(m) //输出 map[three:3 two:2 one:1] (顺序在运行时可能不一样)
  fmt.Println(len(m)) //输出 3

  v := m["two"] //从map里取值
  fmt.Println(v) // 输出 2

  delete(m, "two")
  fmt.Println(m) //输出 map[three:3 one:1]

  m1 := map[string]int{"one": 1, "two": 2, "three": 3}
  fmt.Println(m1) //输出 map[two:2 three:3 one:1] (顺序在运行时可能不一样)

  for key, val := range m1{
    fmt.Printf("%s => %d \n", key, val)
    /*输出:(顺序在运行时可能不一样)
      three => 3
      one => 1
      two => 2*/
  }
}

指针

Go语言一样有指针,看代码

var i int = 1
var pInt *int = &i
//输出:i=1   pInt=0xf8400371b0    *pInt=1
fmt.Printf("i=%d\tpInt=%p\t*pInt=%d\n", i, pInt, *pInt)

*pInt = 2
//输出:i=2   pInt=0xf8400371b0    *pInt=2
fmt.Printf("i=%d\tpInt=%p\t*pInt=%d\n", i, pInt, *pInt)

i = 3
//输出:i=3   pInt=0xf8400371b0    *pInt=3
fmt.Printf("i=%d\tpInt=%p\t*pInt=%d\n", i, pInt, *pInt)

Go具有两个分配内存的机制,分别是内建的函数new和make。他们所做的事不同,所应用到的类型也不同,这可能引起混淆,但规则却很简单。

内存分配

new 是一个分配内存的内建函数,但不同于其他语言中同名的new所作的工作,它只是将内存清零,而不是初始化内存。new(T)为一个类型为T的新项目分配了值为零的存储空间并返回其地址,也就是一个类型为*T的值。用Go的术语来说,就是它返回了一个指向新分配的类型为T的零值的指针。

make(T, args)函数的目的与new(T)不同。它仅用于创建切片、map和chan(消息管道),并返回类型T(不是*T)的一个被初始化了的(不是零)实例。这种差别的出现是由于这三种类型实质上是对在使用前必须进行初始化的数据结构的引用。例如,切片是一个具有三项内容的描述符,包括指向数据(在一个数组内部)的指针、长度以及容量,在这三项内容被初始化之前,切片值为nil。对于切片、映射和信道,make初始化了其内部的数据结构并准备了将要使用的值。如:

下面的代码分配了一个整型数组,长度为10,容量为100,并返回前10个数组的切片

make([]int, 10, 100)
以下示例说明了new和make的不同。

var p *[]int = new([]int)  // 为切片结构分配内存;*p == nil;很少使用
var v []int = make([]int, 10) // 切片v现在是对一个新的有10个整数的数组的引用

// 不必要地使问题复杂化:
var p *[]int = new([]int)
fmt.Println(p) //输出:&[]
*p = make([]int, 10, 10)
fmt.Println(p) //输出:&[0 0 0 0 0 0 0 0 0 0]
fmt.Println((*p)[2]) //输出: 0

// 习惯用法:
v := make([]int, 10)
fmt.Println(v) //输出:[0 0 0 0 0 0 0 0 0 0]

函数

老实说,我对Go语言这种反过来声明变量类型和函数返回值的做法有点不满(保持和C一样的不可以吗? 呵呵)

package main
import "fmt"

func max(a int, b int) int { //注意参数和返回值是怎么声明的

  if a > b {
    return a
  }
  return b
}

func main(){
  fmt.Println(max(4, 5))
}

函数返回多个值

Go中很多Package 都会返回两个值,一个是正常值,一个是错误,如下所示:

package main
import "fmt"

func main(){
  v, e := multi_ret("one")
  fmt.Println(v,e) //输出 1 true

  v, e = multi_ret("four")
  fmt.Println(v,e) //输出 0 false

  //通常的用法(注意分号后有e)
  if v, e = multi_ret("four"); e {
    // 正常返回
  }else{
    // 出错返回
  }
}

func multi_ret(key string) (int, bool){
  m := map[string]int{"one": 1, "two": 2, "three": 3}

  var err bool
  var val int

  val, err = m[key]

  return val, err
}

函数不定参数

例子很清楚了,我就不多说了

func sum(nums ...int) {
  fmt.Print(nums, " ") //输出如 [1, 2, 3] 之类的数组
  total := 0
  for _, num := range nums { //要的是值而不是下标
    total += num
  }
  fmt.Println(total)
}
func main() {
  sum(1, 2)
  sum(1, 2, 3)

  //传数组
  nums := []int{1, 2, 3, 4}
  sum(nums...)
}

函数闭包

nextNum这个函数返回了一个匿名函数,这个匿名函数记住了nextNum中i+j的值,并改变了i,j的值,于是形成了一个闭包的用法

func nextNum() func() int {
  i,j := 1,1
  return func() int {
    var tmp = i+j
    i, j = j, tmp
    return tmp
  }
}
//main函数中是对nextNum的调用,其主要是打出下一个斐波拉契数
func main(){
  nextNumFunc := nextNum()
  for i:=0; i<10; i++ {
    fmt.Println(nextNumFunc())
  }
}

函数的递归

和c基本是一样的

func fact(n int) int {
  if n == 0 {
    return 1
  }
  return n * fact(n-1)
}

func main() {
  fmt.Println(fact(7))
}

结构体

Go的结构体和C的基本上一样,不过在初始化时有些不一样,Go支持带名字的初始化。

type Person struct {
  name string
  age int
  email string
}

func main() {
  //初始化
  person := Person{"Tom", 30, "tom@gmail.com"}
  person = Person{name:"Tom", age: 30, email:"tom@gmail.com"}

  fmt.Println(person) //输出 {Tom 30 tom@gmail.com}

  pPerson := &person

  fmt.Println(pPerson) //输出 pPerson.age = 40
  person.name = "Jerry"
  fmt.Println(person) //输出 {Jerry 40 tom@gmail.com}
}

结构体方法

不多说了,看代码吧。

注意:Go语言中没有public, protected, private的关键字,所以,如果你想让一个方法可以被别的包访问的话,你需要把这个方法的第一个字母大写。这是一种约定。

type rect struct {
  width, height int
}

func (r *rect) area() int { //求面积
  return r.width * r.height
}

func (r *rect) perimeter() int{ //求周长
  return 2*(r.width + r.height)
}

func main() {
  r := rect{width: 10, height: 15}

  fmt.Println("面积: ", r.area())
  fmt.Println("周长: ", r.perimeter())

  rp := &r
  fmt.Println("面积: ", rp.area())
  fmt.Println("周长: ", rp.perimeter())
}

接口和多态

接口意味着多态,下面是一个经典的例子,不用多说了,自己看代码吧。

//---------- 接 口 --------//
type shape interface {
  area() float64 //计算面积
  perimeter() float64 //计算周长
}

//--------- 长方形 ----------//
type rect struct {
  width, height float64
}

func (r *rect) area() float64 { //面积
  return r.width * r.height
}

func (r *rect) perimeter() float64 { //周长
  return 2*(r.width + r.height)
}

//----------- 圆 形 ----------//
type circle struct {
  radius float64
}

func (c *circle) area() float64 { //面积
  return math.Pi * c.radius * c.radius
}

func (c *circle) perimeter() float64 { //周长
  return 2 * math.Pi * c.radius
}

// ----------- 接口的使用 -----------//
func interface_test() {
  r := rect {width:2.9, height:4.8}
  c := circle {radius:4.3}

  s := []shape{&r, &c} //通过指针实现

  for _, sh := range s {
    fmt.Println(sh)
    fmt.Println(sh.area())
    fmt.Println(sh.perimeter())
  }
}

错误处理 – Error接口

函数错误返回可能是C/C++时最让人纠结的东西的,Go的多值返回可以让我们更容易的返回错误,其可以在返回一个常规的返回值之外,还能轻易地返回一个详细的错误描述。通常情况下,错误的类型是error,它有一个内建的接口。

type error interface {
Error() string
}

还是看个示例吧:

package main

import "fmt"
import "errors"

//自定义的出错结构
type myError struct {
  arg int
  errMsg string
}
//实现Error接口
func (e *myError) Error() string {
  return fmt.Sprintf("%d - %s", e.arg, e.errMsg)
}

//两种出错
func error_test(arg int) (int, error) {
  if arg < 0 {
     return -1, errors.New("Bad Arguments - negtive!")
   }else if arg >256 {
    return -1, &myError{arg, "Bad Arguments - too large!"}
  }
  return arg*arg, nil
}

//相关的测试
func main() {
  for _, i := range []int{-1, 4, 1000} {
    if r, e := error_test(i); e != nil {
      fmt.Println("failed:", e)
    } else {
      fmt.Println("success:", r)
    }
  }
}

程序运行后输出:

1 failed: Bad Arguments - negtive!
2 success: 16
3 failed: 1000 - Bad Arguments - too large!

错误处理 – Defer

下面的程序对于每一个熟悉C语言的人来说都不陌生(有资源泄露的问题),C++使用RAII来解决这种问题。

func CopyFile(dstName, srcName string) (written int64, err error) {
  src, err := os.Open(srcName)
  if err != nil {
    return
  }

  dst, err := os.Create(dstName)
  if err != nil {
    return
  }

  written, err = io.Copy(dst, src)
  dst.Close()
  src.Close()
  return
}

Go语言引入了Defer来确保那些被打开的文件能被关闭。如下所示:(这种解决方式还是比较优雅的)

func CopyFile(dstName, srcName string) (written int64, err error) {
  src, err := os.Open(srcName)
  if err != nil {
    return
  }
  defer src.Close()

  dst, err := os.Create(dstName)
  if err != nil {
    return
  }
  defer dst.Close()

  return io.Copy(dst, src)
}

Go的defer语句预设一个函数调用(延期的函数),该调用在函数执行defer返回时立刻运行。该方法显得不同常规,但却是处理上述情况很有效,无论函数怎样返回,都必须进行资源释放。

我们再来看一个defer函数的示例:

1 for i := 0; i < 5; i++ {
2 defer fmt.Printf("%d ", i)
3 }

被延期的函数以后进先出(LIFO)的顺行执行,因此以上代码在返回时将打印4 3 2 1 0。

总之,我个人觉得defer的函数行为有点怪异,我现在还没有完全搞清楚。

错误处理 – Panic/Recover

对于不可恢复的错误,Go提供了一个内建的panic函数,它将创建一个运行时错误并使程序停止(相当暴力)。该函数接收一个任意类型(往往是字符串)作为程序死亡时要打印的东西。当编译器在函数的结尾处检查到一个panic时,就会停止进行常规的return语句检查。

下面的仅仅是一个示例。实际的库函数应避免panic。如果问题可以容忍,最好是让事情继续下去而不是终止整个程序。

var user = os.Getenv("USER")

func init() {
  if user == "" {
    panic("no value for $USER")
  }
}

当panic被调用时,它将立即停止当前函数的执行并开始逐级解开函数堆栈,同时运行所有被defer的函数。如果这种解开达到堆栈的顶端,程序就死亡了。但是,也可以使用内建的recover函数来重新获得Go程的控制权并恢复正常的执行。 对recover的调用会通知解开堆栈并返回传递到panic的参量。由于仅在解开期间运行的代码处在被defer的函数之内,recover仅在被延期的函数内部才是有用的。

你可以简单地理解为recover就是用来捕捉Painc的,防止程序一下子就挂掉了。

下面是一个例程,很简单了,不解释了

func g(i int) {
  if i>1 {
    fmt.Println("Panic!")
    panic(fmt.Sprintf("%v", i))
  }

}

func f() {
  defer func() {
    if r := recover(); r != nil {
      fmt.Println("Recovered in f", r)
    }
  }()

  for i := 0; i < 4; i++ {
    fmt.Println("Calling g with ", i)
    g(i)
    fmt.Println("Returned normally from g.")
   }
}

func main() {
  f()
  fmt.Println("Returned normally from f.")
}

运行结果如下:(我们可以看到Painc后的for循环就没有往下执行了,但是main的程序还在往下走)

Calling g with 0
Returned normally from g.
Calling g with 1
Returned normally from g.
Calling g with 2
Panic!
Recovered in f 2
Returned normally from f

总结

以上就是本文关于go语言基础语法示例的全部内容,希望对大家有所帮助。如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

(0)

相关推荐

  • Go语言中函数的参数传递与调用的基本方法

    按值传递函数参数,是拷贝参数的实际值到函数的形式参数的方法调用.在这种情况下,参数在函数内变化对参数不会有影响. 默认情况下,Go编程语言使用调用通过值的方法来传递参数.在一般情况下,这意味着,在函数内码不能改变用来调用所述函数的参数.考虑函数swap()的定义如下. 复制代码 代码如下: /* function definition to swap the values */ func swap(int x, int y) int {    var temp int temp = x /* s

  • Go语言编程中对文件读写的基本方法整理

    1.func Copy(dst Writer, src Reader) (written int64, err error)这个函数是从一个文件读取拷贝到另外一个文件,一直拷贝到读取文件的EOF,所以不会返回io.EOF错误,参数是写入目标器和读取目标器,返回int64的拷贝字节数和err信息 复制代码 代码如下: import (  "fmt"  "io"  "os" ) func main() {  r, _ := os.Open("

  • Go语言基本的语法和内置数据类型初探

    Go令牌 Go程序包括各种令牌和令牌可以是一个关键字,一个标识符,常量,字符串文字或符号.例如,下面的Go语句由六个令牌: 复制代码 代码如下: fmt.Println("Hello, World!") 个体令牌是: 复制代码 代码如下: fmt . Println ( "Hello, World!" ) 行分离器 在Go程序,行的分隔符关键是一个语句终止.也就是说,每一个单独语句不需要特殊的分隔线; 在C编译器转到内部的地方; 作为语句终止符,表示一个逻辑实体的结

  • GO语言基本数据类型总结

    本文实例总结了GO语言基本数据类型.分享给大家供大家参考.具体如下: 1.注释(与C++一样) 行注释://块注释:/* ...*/ 2.标识符 可以这么说,除了数字开头的不允许,符号开头的不允许,关键字不允许,其他的Unicode字符组合都可以."_33"也可以是标识符."我们"也可以是标识符.标识符也区分大小写. (1).以大写字母开头的标识符是公开的.(这个很有意思) (2).其他任何标识符都是私有的. (3).空标识符"_"是一个占位符,

  • GO语言基本类型分析

    本文实例分析了GO语言基本类型.分享给大家供大家参考.具体如下: 一.整型 go语言有13种整形,其中有2种只是名字不同,实质是一样的,所以,实质上go语言有11种整形.如下: (1)int :依赖不同平台下的实现,可以是int32或int64 (2)int8 :  (-128->127) (3)int16: (-32768->32767) (4)int32: (-2 147 483 648->2 147 483 647) (5)int64 :(-9 223 372 036 854 77

  • Go语言中数组的基本用法演示

    首先来看一下如何声明数组: 复制代码 代码如下: package main import "fmt" var arr [2]int //申明一个数组 func main() {  arr[0] = 1 //数组赋值  fmt.Println(arr)  arrtest := [3]int{1, 2, 3} //数组的另一种申明方式  fmt.Println(arrtest)  a := [...]int{1, 2} //[...]自动识别数组的长度  fmt.Println(a)  f

  • go语言基础语法示例

    周末天气不好,只能宅在家里,于是就顺便看了一下Go语言,觉得比较有意思,所以写篇文章介绍一下.我想写一篇你可以在乘坐地铁或公交车上下班时就可以初步了解一门语言的文章.所以,下面的文章主要是以代码和注释为主.只需要你对Java,Python,C等编程语言有一点基础,我相信你会在30分钟左右读完并对Go语言有一些初步了解的. 本文的唯一目的,就是希望大家阅读之后,能够了解go语言长什么样子... Hello World package main //声明本文件的package名 import "fm

  • Go语言基础反射示例详解

    目录 概述 语法 一.基本操作 二.修改目标对象 三.动态调用方法 总结 示例 概述 在程序运行期对程序动态的进行访问和修改 reflect godoc: https://golang.org/pkg/reflect/ reflect包有两个数据类型: Type:数据类型 [reflect.TypeOf():是获取Type的方法] Value:值的类型[reflect.ValueOf():是获取Value的方法] 语法 一.基本操作 获取变量类型 func TypeOf(i interface{

  • Go语言基础语法之结构体及方法详解

    结构体类型可以用来保存不同类型的数据,也可以通过方法的形式来声明它的行为.本文将介绍go语言中的结构体和方法,以及"继承"的实现方法. 结构体类型 结构体类型(struct)在go语言中具有重要地位,它是实现go语言面向对象编程的重要工具.go语言中没有类的概念,可以使用结构体实现类似的功能,传统的OOP(Object-Oriented Programming)思想中的继承在go中可以通过嵌入字段的方式实现. 结构体的声明与定义: // 使用关键字 type 和 struct 定义名字

  • C语言 基本语法示例讲解

    C 基本语法 我们已经看过 C 程序的基本结构,这将有助于我们理解 C 语言的其他基本的构建块. C 的令牌(Tokens) C 程序由各种令牌组成,令牌可以是关键字.标识符.常量.字符串值,或者是一个符号.例如,下面的 C 语句包括五个令牌: printf("Hello, World! \n"); 这五个令牌分别是: printf ( "Hello, World! \n" ) ;  分号 ; 在 C 程序中,分号是语句结束符.也就是说,每个语句必须以分号结束.它表

  • Go语言入门教程之基础语法快速入门

    Go语言是一个开源的,为创建简单的,快速的,可靠的软件而设计的语言. Go语言实(示)例教程,通过过实例加注释的方式来介绍Go语言的用法. Hello World 第一个程序会输出"hello world"消息.源代码如下: 复制代码 代码如下: package main import "fmt" func main() {     fmt.Println("hello world") } //通过go run来运行Go程序 $ go run h

  • Go语言基础Json序列化反序列化及文件读写示例详解

    目录 概述 JSON序列化 结构体转JSON map转JSON 切片转JSON JSON反序列化 JSON转map JSON转结构体 JSON转切片 写JSON文件 map写入JSON文件 切片写入JSON文件 结构体写入JSON文件 读JSON文件 解码JSON文件为map 解码JSON文件为切片 解码JSON文件为结构体 示例 概述 JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的.键值对的数据交换格式.结构由大括号'{}',中括

  • Go语言基础go接口用法示例详解

    目录 概述 语法 定义接口 实现接口 空接口 接口的组合 总结 概述 Go 语言中的接口就是方法签名的集合,接口只有声明,没有实现,不包含变量. 语法 定义接口 type [接口名] interface { 方法名1(参数列表) 返回值列表 方法名2(参数列表) 返回值列表 ... } 例子 type Isay interface{ sayHi() } 实现接口 例子 //定义接口的实现类 type Chinese struct{} //实现接口 func (_ *Chinese) sayHi(

  • Go语言基础切片的创建及初始化示例详解

    目录 概述 语法 一.创建和初始化切片 make 字面量 二.使用切片 赋值和切片 切片增长 遍历切片 总结 总示例 示例一  两个slice是否相等 示例二 两个数字是否包含 概述 切片是一种动态数组 按需自动改变大小 与数组相比,切片的长度可以在运行时修改 语法 一.创建和初始化切片 make 使用内置函数make()创建切片: var slice []type = make([]type, len, cap) //简写: slice := make([]type, len, cap) 字面

  • Go语言基础map用法及示例详解

    目录 概述 语法 声明和初始化 读取 删除 遍历 总结 示例 概述 map是基于key-value键值对的无序的集合 Go语言中的map是引用类型 必须初始化才能使用. 语法 声明和初始化 配合make使用,否则是nil var map[KeyType]ValueType //KeyType:表示键的类型 //ValueType:表示键对应的值的类型 make(map[KeyType]ValueType, [cap]) //cap表示map的容量,该参数虽然不是必须的,但是我们应该在初始化map

  • Go语言基础函数基本用法及示例详解

    目录 概述 语法 函数定义 一.函数参数 无参数无返回 有参数有返回 函数值传递 函数引用传递 可变参数列表 无默认参数 函数作为参数 二.返回值 多个返回值 跳过返回值 匿名函数 匿名函数可以赋值给一个变量 为函数类型添加方法 总结 示例 概述 函数是基本的代码块,用于执行一个任务 语法 函数定义 func 函数名称( 参数列表] ) (返回值列表]){ 执行语句 } 一.函数参数 无参数无返回 func add() 有参数有返回 func add(a, b int) int 函数值传递 fu

随机推荐