go基础语法

news/2025/2/26 21:46:23

go基础语法

先下载安装go,然后到vscode下载go插件

1. 基础

输入输出

package main
import "fmt"
func main(){
    a:=1
    var b=2 
    var c int //不给初始值得标出变量类型 
    c=3
    var d string
    fmt.Scanf("%s",&d) //接收用户输入
	fmt.Printf("Hello World! %d,%d,%d,%s",a,b,c,d)
}

基本类型

//整数
int int8 int16 int32 int64
uint uint uint8 uint16 uint32 uint64
uintptr 
byte //uint8别名
rune //int32别名
//浮点数
float32 float64
//复数
complex64 complex128
//布尔
bool
//字符串
string
	fmt.Printf("hello "+"world")//hello world

标识符

标识符用来命名变量、类型等程序实体。一个标识符实际上就是一个或是多个字母(AZ和az)数字(0~9)、下划线_组成的序列,但是第一个字符必须是字母或下划线而不能是数字。

注意:变量一旦声明必须使用否则编译报错,可以用_来作变量名来解决这个问题。

Go 字符串格式化符号:

格式化符号描述示例
通用格式
%v以默认格式输出变量fmt.Printf("%v", 42)
%+v对结构体加字段名的方式输出fmt.Printf("%+v", struct{A int}{A: 42})
%#v以 Go 语法格式化输出fmt.Printf("%#v", map[string]int{"a": 1})
%T输出值的类型fmt.Printf("%T", 42)
%%输出百分号fmt.Printf("%%")
布尔值
%t输出 truefalsefmt.Printf("%t", true)
整数
%b二进制表示fmt.Printf("%b", 5)
%cUnicode 对应字符fmt.Printf("%c", 65)
%d十进制表示fmt.Printf("%d", 42)
%o八进制表示fmt.Printf("%o", 10)
%x十六进制表示(小写字母)fmt.Printf("%x", 15)
%X十六进制表示(大写字母)fmt.Printf("%X", 15)
%UUnicode 格式输出fmt.Printf("%U", 65)
浮点数
%f十进制浮点数fmt.Printf("%f", 3.14)
%e科学计数法(小写 e)fmt.Printf("%e", 3.14)
%E科学计数法(大写 E)fmt.Printf("%E", 3.14)
%g自动选择 %f%e 的简洁表示fmt.Printf("%g", 3.14)
字符串与字节
%s普通字符串fmt.Printf("%s", "Go")
%q带双引号的字符串或字符fmt.Printf("%q", "Go")
%x每个字节用两字符十六进制表示fmt.Printf("%x", "abc")
%X十六进制(大写)表示fmt.Printf("%X", "abc")
指针
%p指针地址fmt.Printf("%p", &x)

2. 分支,选择,循环

if…else if…else

package main
import "fmt"
func main(){
    var a int = 100;
    if a>10{//if语句还可以初始化变量,比如if b:=5;a>10{}
		fmt.Printf("a>10\n" );
	} else if a>5{
		fmt.Printf("a>5\n" );
	} else {
		fmt.Printf("a<5\n" );
	}
	fmt.Printf("a 的值为 : %d\n", a);
}

switch

var grade string = "B"
var marks int = 90
switch marks {
    case 90: grade = "A"
	case 80: grade = "B"
	case 50,60,70 : grade = "C"
	default: grade = "D"  
}
switch {
    case grade == "A" :
    	fmt.Printf("优秀!\n" )    
    case grade == "B", grade == "C" : //多条件匹配
    	fmt.Printf("良好\n" )      
    case grade == "D" :
    	fmt.Printf("及格\n" )      
    case grade == "F":
    	fmt.Printf("不及格\n" )
    default:
    	fmt.Printf("差\n" );
}

for

for i:=1;i<5;i++{
    fmt.Println(i)
}
numbers := [6]int{1, 2, 3, 5}
for i,x:= range numbers {
    fmt.Printf("第 %d 位 x 的值 = %d\n", i,x)
} 

3. 函数

func swap(a,b int)(int ,int){
    return b,a
}
func sum(a int,b int,hello666 func(int)int) int{//`func(int)int`类型参数为int类型,返回值为int类型
	return hello666(a)+hello666(b)
}
func main(){
    a,b:=1,2
    a,b=swap(a,b)
    fmt.Println(a,b)
    
    //匿名函数赋值给square
    square:=func(x int)int{
        return x*x;
    }
    fmt.Println(sum(1,2,square))
}

方法:一个方法就是一个包含了接受者的函数

type Point struct{//定义一个结构体
    X int
    Y int
}
func (p *Point) SetPoint(x int,y int){//该method属于Point类型对象中的方法,注意要指针引用
    p.X=x
    p.Y=y
}
func main(){
	var p Point
    p.SetPoint(3,4)//可以通过这种方式调用方法
    fmt.Println(p)//{3 4}
}

4. 派生类型

派生类型

//数组,长度不可变
a:=[5]int{1,2,3,4,5}

//切片Slice,长度可变
a:=make([]int,0)//创建Slice,长度为0
a=append(a,1,2,3,4)//添加元素
b:=[]int{1,2,3,4}//创建Slice并赋值
b[0]=5
fmt.Println(a,b[1:4])//[1 2 3 4] [2 3 4]
//[1,4),区间左闭右开
s[:len(s)/2]//默认下限为 0
s[len(s)/2:]//默认上限为 len(s)

//集合(映射)Map
m:=map[string]int{//指定键为string类型,值为int类型
    "a":1,
    "b":2, //不要忘了逗号
}
fmt.Println(m)

m:=make(map[string]int)
m["a"]=1
m["b"]=2

//语言范围range
range 关键字用于 for 循环中迭代数组(array)、切片(slice)、通道(channel)或集合(map)的元素

结构体

type Point struct{
    X int
    Y int
}
func main(){
    p:=Point{1,2}
	q:=p
	z:=&p
	p.X=9
	z.Y=6
	fmt.Println(p)//{9 6}
	fmt.Println(q)//{1 2}
	fmt.Println(*z)//{9 6}
}
type Point struct{
    X int
    Y int
}
func (p *Point) SetPoint(x int,y int){
    p.X=x
    p.Y=y
}
func main(){
	var p Point
    p.SetPoint(3,4)
    fmt.Println(p)//{3 4}
}

接口

type Shape interface{
    Print() //无需func关键字
}
type Rectangle struct{}
type Triangle struct{}
func(r Rectangle) Print(){
    fmt.Println("矩形")
}
func(r Triangle) Print(){
    fmt.Println("三角形")
}

func printShape(s Shape){
    s.Print()
}
func main(){
    printShape(Rectangle{})//矩形
    printShape(Triangle{})//三角形
}

nil可以表示指针,接口,切片,映射,通道,函数的零值。

5. 错误处理

_,err:=fmt.Println("dd")//变量名_可忽略变量未使用导致的编译报错
if err != nil {
    fmt.Println("错误执行")
}else{
    fmt.Println("正常执行")
}

6. 并发

Goroutines:

  • Go 中的并发执行单位,类似于轻量级的线程。
  • Goroutine 的调度由 Go 运行时管理,用户无需手动分配线程。
  • 使用 go 关键字启动 Goroutine。
  • Goroutine 是非阻塞的,可以高效地运行成千上万个 Goroutine
package main
import (
        "fmt"
        "time"
)
func sayHello() {
        for i := 0; i < 5; i++ {
                fmt.Println("Hello")
                time.Sleep(100 * time.Millisecond)
        }
}
func main() {
        go sayHello() // 启动 Goroutine
        for i := 0; i < 5; i++ {
                fmt.Println("Main")
                time.Sleep(100 * time.Millisecond)
        }
}
/*输出是没有固定先后顺序,因为它们是两个 goroutine 在执行,同一个程序中的所有 goroutine 共享同一个地址空间。
Main
Hello
Main
Hello
Hello
Main
Main
Hello
Hello
Main
*/

Channel:

  • Go 中用于在 Goroutine 之间通信的机制。
  • 支持同步和数据共享,避免了显式的锁机制。
  • 使用 chan 关键字创建,通过 <- 操作符发送和接收数据。
package main
import "fmt"

func sum(s []int, c chan int) {
    sum := 0
    for _, v := range s {
        sum += v
    }
    c <- sum // 把 sum 发送到通道 c
}
func main() {
    s := []int{7, 2, 8, -9, 4, 0}
    c := make(chan int) //声明一个通道
    go sum(s[:len(s)/2], c)//默认下限为 0
    go sum(s[len(s)/2:], c)//默认上限为 len(s)
    x, y := <-c, <-c // 从通道 c 中接收

    fmt.Println(x, y, x+y)//-5 17 12
}

http://www.niftyadmin.cn/n/5869192.html

相关文章

vLLM专题(十三)-结构化输出(Structured Outputs)

vLLM 支持使用 outlines、lm-format-enforcer 或 xgrammar 作为引导解码的后端来生成结构化输出。本文档展示了一些可用于生成结构化输出的不同选项示例。 一、在线服务(OpenAI API) 你可以使用 OpenAI 的 Completions 和 Chat API 生成结构化输出。 支持以下参数,这些参…

结构型模式 - 代理模式 (Proxy Pattern)

结构型模式 - 代理模式 (Proxy Pattern) 代理模式是一种结构型设计模式&#xff0c;它允许通过代理对象来控制对另一个对象&#xff08;目标对象&#xff09;的访问。代理对象充当目标对象的接口&#xff0c;客户端通过代理对象间接访问目标对象。 分为两大类 静态代理&#…

互联网+房产中介+装修设计+物料市场+智能家居一体化平台需求书

一、项目概述 1.1 项目背景 随着互联网技术的飞速发展以及人们生活品质的显著提升&#xff0c;传统房产交易、装修设计、家居购物等领域暴露出诸多问题。信息不对称使得用户难以获取全面准确的信息&#xff0c;在房产交易中可能高价买入或低价卖出&#xff0c;装修时可能遭遇…

windows笔记本如何设置显示器和笔记本屏幕显示的一样

windows笔记本如何设置显示器和笔记本屏幕显示的一样 DeepSeek R1 思考 27 秒 思考过程 好的&#xff0c;用户问的是Windows笔记本如何设置显示器和笔记本屏幕显示一样。我需要先理解用户的具体需求。这里的“显示器和笔记本屏幕显示一样”可能有两种情况&#xff1a;一种是希…

数据安全_笔记系列06:数据生命周期管理(存储、传输、使用、销毁)深度解析

数据安全_笔记系列06&#xff1a;数据生命周期管理&#xff08;存储、传输、使用、销毁&#xff09;深度解析 数据生命周期管理&#xff08;存储、传输、使用、销毁&#xff09;详解 数据生命周期管理&#xff08;Data Lifecycle Management, DLM&#xff09;是围绕数据从创建…

汽车无钥匙进入一键启动操作正确步骤

汽车智能无钥匙进入和一键启动的技术在近年来比较成熟&#xff0c;不同车型的操作步骤可能略有不同&#xff0c;但基本的流程应该是通用的&#xff0c;不会因为时间变化而有大的改变。 移动管家汽车一键启动无钥匙进入系统通常是通过携带钥匙靠近车辆&#xff0c;然后触摸门把…

C语言 第一章 认识C语言

目录 C语言的发展史 为什么要学习C语言 常用的IDE工具 Dev-C Microsoft Visual Studio CLion 第一个编程程序 C语言的程序运行机制 C语言的程序结构 C语言的发展史 1960年&#xff0c;ALGOL 60语言诞生&#xff0c;它的块结构、数据类型等概念为C语言奠定了基础。196…

DeepSeek赋能大模型内容安全,网易易盾AIGC内容风控解决方案三大升级

在近两年由AI引发的生产力革命的背后&#xff0c;一场关乎数字世界秩序的攻防战正在上演&#xff1a;AI生成的深度伪造视频导致企业品牌声誉损失日均超千万&#xff0c;批量生成的侵权内容使版权纠纷量与日俱增&#xff0c;黑灰产利用AI技术持续发起欺诈攻击。 与此同时&#…