# 基本语法

# 1. 变量

// 申明的变量必须被使用 否则编译不通过
var a int
var b string 
var c []float // 一个 float 类型的切片
var d struct{  // 申明一个匿名结构体 该结构体有一个 int 类型字段 x
  x int
}
var e func() bool  // 申明一个函数变量
var// 同时申明多组变量
 f int
 g string
// 省略类型 编译器会尝试进行类型推导
var a = 100 
a := 100 // 编译报错  
a, b = 100, "ok" // := 左值必须有一个未被定义过的变量 否则编译报错
c := 0.17 // 浮点类型会被默认推导成 float64
a, b = b, a  // 多重赋值  可实现变量交换  从左到右依次赋值
_, c = 0, 100 // 匿名变量 _ 被忽略不占用命名空间 不分配内存

# 2. 原生数据类型

  • 整型
int8   int16 int32 int64 // 按长度划分
uint8  uint16 uint32 uint64 // 无符号
// 高长度类型向低长度类型转换会发生长度截取
var a uint16 = math.MaxUint8 + 1 //a = 256   16 位存储为 00000001 00000000
var b = uint8(a) //b = 0  转换截取后 8 位为 00000000
  • 浮点型
float32  float64
  • 布尔型
true false
  • 字符串型
// 基于 utf-8 编码实现  需要区分 byte (类型为 uint8) 和 rune (类型为 int32)
f := "golang编程"
len(f) // 长度为 12 统计 ASCII 字符数量
utf8.RuneCountInString(f) // 长度为 8 统计 unicode 字符数量

# 3. 指针

go 语言相比较 C/C++ 限制了指针的偏移和运算能力,仅包含了以下三个概念

  • 指针地址
  • 指针类型
  • 指针取值
str := "Golang is Good!" // 类型为 string
strPrt := &str // 取址符 & amp; 获取 str 的指针  类型为 * string
newStr := *strPrt // 取值符 * 进行了值拷贝  newStr 与 str 指针地址不同
*strPrt = "PHP is Good too!" // 通过指针对变量进行赋值
str := new(string) // 使用 new 函数直接分配内存 返回 * string 类型
*str = "Golang is Good!"

# 4. 使用 flag 从命令行中读取参数

package main
import (
	"flag"
	"fmt"
)
func main() {
	surname := flag.String("surname", "王", "您的姓") //surname 类型为 * string
	var personalName string
	flag.StringVar(&personalName, "personalName", "小二", "您的名") // 还可以直接传入变量地址获取参数值
	id := flag.Int("id", 0, "您的ID")                            //id 类型为 * int
	flag.Parse()                                               // 解析命令行参数
	fmt.Printf("I am %v %v, and my id is %v\n", *surname, personalName, *id)
}
go run Flag.go -surname="杜" -personalName="小猫" -id=100
// I am 杜 小猫,and my id is 100

# 5. 常量与类型别名

// 申明常量
const str string = "Golang is Good!"
const name = "Golang is Good!"
const (
	surname = "王"
  personalName = "小二"
)
type aliasInt = int // 定义类型别名 type name = T
type myInt int // 定义了一个新的类型  本质上都是 int 类型

# 6. 分支与循环控制

//if 语句
if expression1 {
  branch1
} else if expression2 {
  branch2
} else {
  branch3
}
//switch 语句  无需 break 控制跳出 
name := "小红"
switch name {
case "小红"
  fmt.Println("倒垃圾")
case "小明"
  fallthrough  // 合并连接 case 控制体都为 fmt.Println ("扫地") 
case "小刚":
  fmt.Println("扫地")
default:
  fmt.Println('没人干活')
}
//case 可接表达式
score := 90
switch {
  case score < 100 && score >= 90:
  	fmt.Println("优秀")
  case score < 90 && score >= 80:
  	fmt.Println("良好")
  case score < 80 && score >= 60:
  	fmt.Println("及格")
  case score < 60:
  	fmt.Println("不及格")
default:
  fmt.Println("分数有问题")
}
//for 循环 init condition end 三者缺省 就是无限循环
for init;condition;end {
  // 循环体代码
  // break
  // continue
}
更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

PPYYLEE 微信支付

微信支付

PPYYLEE 支付宝

支付宝

PPYYLEE 贝宝

贝宝