Go入门(1)| 豆包MarsCode AI 刷题

75 阅读4分钟

入门

第一个go程序

/* 
 * 包名可以与其目录名不同,
 * main 包是Go语言程序的入口包,一个Go语言程序必须有且仅有一个 main包。
 * 如果一个程序没有 main 包,那么编译时将会出错,无法生成可执行文件。
 */
package main

import(
	"fmt"
)

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

go的编译和运行

go是和c语言一样的编译型静态语言,所以在运行Go程序之前先要将其编译成二进制可执行文件

  • go build可以将go程序代码编译成可执行文件,但是我们要手动运行该文件
  • go run更方便,会在编译后直接运行go程序,编译过程中产生一个临时文件,但不会生成可执行文件,适合用来调试程序

go变量声明

var 变量名 数据类型

使用go多重赋值的特性,可以轻松完成变量交换的任务

var a int = 100
var b int = 80
b,a = a,b
fmt.Println(a,b)

匿名变量

在编码过程中,可能会遇到没有名称的变量、类型或方法。虽然这不是必须的,但有时候这样做可以极大地增强代码的灵活性,这些变量被统称为匿名变量。

匿名变量的特点是一个下画线__本身就是一个特殊的标识符,被称为空白标识符。相当于一个占位符

func GetData() (int, int) {
    return 100, 200
}
func main(){
    a, _ := GetData()
    _, b := GetData()
    fmt.Println(a, b)
}

匿名变量不占用内存空间,不会分配内存

数据类型

image.png

基本类型:

  • int8, 16, 32, 64

  • uint8, 16, 32, 64

  • int,uint: 取决于操作系统位数

  • uintptr:无符号整型,用于存放一个指针

  • float32,float64

  • bool

  • string

    • 字符串底层是一个byte数组,所以可以和[]byte类型相互转换。
    • 字符串是不能修改的 字符串是由byte字节组成,所以字符串的长度是byte字节的长度。
  • 字符:

    • uint8类型(或者叫byte型)代表一个ASCII码字符
    • rune类型,代表一个UTF-8字符,实际上是一个int32
      • 当需要处理中文,日文或者其他复合字符,需要用到rune类型
      • rune类型用来表示utf8字符,一个rune字符由一个或多个byte组成。
  • 复数:complex64,complex128

字符串

多行字符串

在Go语言中,使用双引号书写字符串的方式是字符串常见表达方式之一,被称为字符串字面量(string literal),这种双引号字面量不能跨行,如果想要在源码中嵌入一个多行字符串时,就必须使用`` `反引号

var str string = "第一行\n第二行"
var s string = `第一行
第二行
hh`
字符串长度

Go 语言的内建函数 len(),可以用来获取切片、字符串、通道(channel)等的长度。下面的代码可以用 len() 来获取字符串的长度。

len() 函数的返回值的类型为 int,表示字符串的 ASCII 字符个数或字节长度。

但是Go语言的字符串都以 UTF-8 格式保存,每个中文占用 3 个字节,如果希望按习惯上的字符个数来计算,就需要使用 Go 语言中 UTF-8 包提供的 RuneCountInString() 函数,统计 Uncode 字符数量。

import (
	"fmt"
	"unicode/utf8"
)
func main() {
	st := "忍者"
	en := "gogogogo"
	fmt.Println(utf8.RuneCountInString(st))
	fmt.Println(len(en))
}
遍历字符串

遍历ASCII字符直接使用下标

func main() {
	en := "English"
	for i := 0;i < len(en); i++  {
		fmt.Printf("%c ",en[i])
	}
}

遍历Unicode字符使用for range

func main() {
	str := "java 世界上最好的语言"
	for _,s := range str {
		fmt.Printf("%c ",s)
	}
}
连接

Go 语言和大多数其他语言一样,使用+对字符串进行连接操作,非常直观。

但是Go中也有类似于StringBuilder的机制来进行高效字符串连接

import (
	"fmt"
	"bytes"
)

func main() {
	str1 := "java"
	str2 := "是世界上最好的语言"
	var sb bytes.Buffer  // 声明字节缓冲
	sb.WriteString(str1)
	sb.WriteString(str2)

	fmt.Println(sb.String())
}

bytes.Buffer是可以缓冲并且往里面写入各种字节数组的,字符串也是一种字节数组,使用WriteString()方法写入

数据类型转换

由于Go语言不存在隐式类型转换,因此所有的类型转换都必须显式的声明:

a := 5.0
b := int(a)

指针

  • &:取地址 *:根据地址取值
  • 指针的值就是地址,*int*float等指针类型指的是这个地址下存的是int类型的变量
  • 在Go语言中对于引用类型的变量,我们在使用的时候不仅要声明它,还要为它分配内存空
  • 指针是引用类型
  • 指针是可比较的
使用指针修改值
func main() {
	x,y := 1,2
	swap(&x,&y)
	fmt.Println(x,y)
}

func swap(a , b *int) {
	t := *a //取a指针的值赋值给t
	*a = *b //取b指针的值,赋值给a指针指向的变量
	*b = t  //给b指针指向的变量赋值
}