入门
第一个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) }匿名变量不占用内存空间,不会分配内存
数据类型
基本类型:
-
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指针指向的变量赋值
}