Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >移动开发(六):.NET MAUI中布局笔记介绍

移动开发(六):.NET MAUI中布局笔记介绍

原创
作者头像
小明互联网技术分享社区
发布于 2024-09-18 02:57:53
发布于 2024-09-18 02:57:53
60100
代码可运行
举报
运行总次数:0
代码可运行

一、StackLayout 布局

StackLayout 主要用于水平或者垂直方向一组元素的排列布局。 其中 Orientation 属性用来指定元素排列的方向,默认为 Vertical

(垂直)。 StackLayout 通常用于在页面上排列 UI 的子布局。

官方介绍

代码示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   <StackLayout Margin="10,15,10,15" Orientation="Horizontal">
<Label Text="StackLayout水平布局" VerticalOptions="Center" HorizontalOptions="Center" />
       <Button x:Name="Btn1" Text="按钮一" HeightRequest="50"  HorizontalOptions="Center" Margin="5"  Style="{StaticResource ButtonStyle}" BorderWidth="1" TextColor="White"  BackgroundColor="#2946E6" BorderColor="#2946E6"  />
       <Button x:Name="Btn2" Text="按钮二" HeightRequest="50"  HorizontalOptions="Center" Margin="5"  Style="{StaticResource ButtonStyle}" BorderWidth="1" TextColor="White"  BackgroundColor="#2946E6" BorderColor="#2946E6" />
       <Button x:Name="Btn3" Text="按钮三" HeightRequest="50"  HorizontalOptions="Center" Margin="5"  Style="{StaticResource ButtonStyle}" BorderWidth="1" TextColor="White"  BackgroundColor="#2946E6" BorderColor="#2946E6" />
   </StackLayout>

运行效果:

注意

● 未显式设置某元素的大小,则该元素将展开以填充可用宽度,如果 Orientation 属性设置为 Horizontal,则填充可用高度。

● 一般作包含其他子布局的父布局,不应使用 StackLayout 通过 StackLayout 对象的组合来重现 Grid 布局。 建议使用使用 Grid 更好地实现所需的布局。

二、HorizontalStackLayout 水平排列布局

其功能相当于StackLayout + Orientation 属性为值为Horizontal 。官方说使用该布局性能优于StackLayout。如果遇到水平排列布局建议使用HorizontalStackLayout。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  <HorizontalStackLayout>
      <Button x:Name="Btn1" Text="按钮一" HeightRequest="50"  HorizontalOptions="Center" Margin="5"  Style="{StaticResource ButtonStyle}" BorderWidth="1" TextColor="White"  BackgroundColor="#2946E6" BorderColor="#2946E6"  />
      <Button x:Name="Btn2" Text="按钮二" HeightRequest="50"  HorizontalOptions="Center" Margin="5"  Style="{StaticResource ButtonStyle}" BorderWidth="1" TextColor="White"  BackgroundColor="#2946E6" BorderColor="#2946E6" />
      <Button x:Name="Btn3" Text="按钮三" HeightRequest="50"  HorizontalOptions="Center" Margin="5"  Style="{StaticResource ButtonStyle}" BorderWidth="1" TextColor="White"  BackgroundColor="#2946E6" BorderColor="#2946E6" />
  </HorizontalStackLayout>

三、VerticalStackLayout 垂直排列布局

其功能相当于StackLayout + Orientation 属性为值为Horizontal 。官方说使用该布局性能优于StackLayout。如果遇到水平排列布局建议使用HorizontalStackLayout。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<VerticalStackLayout>
        <Button x:Name="Btn1" Text="按钮一" HeightRequest="50"  HorizontalOptions="Center" Margin="5"  Style="{StaticResource ButtonStyle}" BorderWidth="1" TextColor="White"  BackgroundColor="#2946E6" BorderColor="#2946E6"  />
        <Button x:Name="Btn2" Text="按钮二" HeightRequest="50"  HorizontalOptions="Center" Margin="5"  Style="{StaticResource ButtonStyle}" BorderWidth="1" TextColor="White"  BackgroundColor="#2946E6" BorderColor="#2946E6" />
        <Button x:Name="Btn3" Text="按钮三" HeightRequest="50"  HorizontalOptions="Center" Margin="5"  Style="{StaticResource ButtonStyle}" BorderWidth="1" TextColor="White"  BackgroundColor="#2946E6" BorderColor="#2946E6" />
    </VerticalStackLayout>

运行效果如下:

四、Grid 网格布局

Grid 用于显示行和列中的元素,这些元素可以有比例大小或绝对大小。 可使用 RowDefinitions 和 ColumnDefinitions 属性指定网格的行和列。

属性列表

属性名

类型

描述

默认值

Column

int

附加属性,指示视图在父 Grid 中的列对齐方式。

0

ColumnDefinitions

ColumnDefinitionCollection

定义网格列宽度的 ColumnDefinition 对象列表。

N/A

ColumnSpacing

double

指示网格列之间的间距。

0

ColumnSpan

int

附加属性,指示视图在父 Grid 中跨越的总列数。

1

Row

int

附加属性,指示视图在父 Grid 中的行对齐方式。

0

RowDefinitions

RowDefinitionCollection

定义网格行高度的 RowDefinition 对象列表。

N/A

RowSpacing

double

指示网格行之间的间距。

0

RowSpan

int

附加属性,指示视图在父 Grid 中跨越的总行数。

1

注意:ColumnDefinitions 和 RowDefinitions 属性没有默认值,因为它们是由用户定义的集合,通常在初始化 Grid 时明确设置。

代码示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 <Grid>
     <Grid.RowDefinitions>
         <RowDefinition Height="2*" />
         <RowDefinition />
         <RowDefinition Height="60" />
     </Grid.RowDefinitions>
     <Grid.ColumnDefinitions>
         <ColumnDefinition />
         <ColumnDefinition />
     </Grid.ColumnDefinitions>
     <BoxView Color="Green" />
     <Label Text="第一行第一列"
            HorizontalOptions="Center"
            VerticalOptions="Center" />
     <Image x:Name="Image1" Source="ImageSources" ></Image>
     <ImageButton ></ImageButton>
     
     <BoxView Grid.Column="1"
              Color="Gray" />
     <Label Grid.Column="1"
            Text="第一行第二列"
            HorizontalOptions="Center"
            VerticalOptions="Center" />
     <BoxView Grid.Row="1"
              Color="Teal" />    

     <Button Grid.Row="0" Grid.Column="1" x:Name="Btn1" Text="按钮二" HeightRequest="50"  HorizontalOptions="Center" Margin="5"  Style="{StaticResource ButtonStyle}" BorderWidth="1" TextColor="White"  BackgroundColor="#2946E6" BorderColor="#2946E6" />

     <BoxView Grid.Row="1"
              Grid.Column="1"
              Color="Purple" />      
     
     <Button Grid.Row="1" Grid.Column="1" x:Name="Btn2" Text="按钮二" HeightRequest="50"  HorizontalOptions="Center" Margin="5"  Style="{StaticResource ButtonStyle}" BorderWidth="1" TextColor="White"  BackgroundColor="#2946E6" BorderColor="#2946E6" />

     <BoxView Grid.Row="2"
              Grid.ColumnSpan="2"
              Color="Red" />
     <Label Grid.Row="2"
            Grid.ColumnSpan="2"
            Text="Row 2, Columns 0 and 1"
            HorizontalOptions="Center"
            VerticalOptions="Center" />
 </Grid>

运行效果如下:

五、FlexLayout

.NET Multi-platform App UI (.NET MAUI) 中的 FlexLayout 是一种灵活的布局控件,它可以在堆栈中水平和垂直排列其子项。当子项太多无法容纳在单行或单列时,FlexLayout 还可以自动换行以适应内容。此外,它还提供了丰富的属性来控制方向、对齐方式,并且能够适应不同的屏幕大小。FlexLayout 基于 CSS 的灵活框布局模块,因此它具有类似 CSS 的灵活性。

属性列表

属性名

类型

描述

默认值

AlignContent

FlexAlignContent

确定多行布局中子元素之间的空间分配方式。

Stretch

AlignItems

FlexAlignItems

指示子元素沿交叉轴的空间分配方式。

Stretch

Direction

FlexDirection

定义子元素的方向和主轴方向。

Row

JustifyContent

FlexJustify

指定子元素沿主轴的空间分配方式。

Start

Position

FlexPosition

确定子元素的位置方式,是相对位置还是使用固定位置。

Relative

Wrap

FlexWrap

控制子元素是否应该换行到新行。

NoWrap

AlignSelf

FlexAlignSelf

指示特定子元素沿交叉轴的空间分配方式。

Auto

Basis

FlexBasis

定义子元素在分配空间前的初始大小。

Auto

Grow

float

指定子元素在主轴上扩展的可用空间量。

0.0

Order

int

确定子元素在容器中的布局顺序。

0

Shrink

float

控制子元素在必要时如何收缩以适应容器。

1.0

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 <StackLayout>
     <FlexLayout Direction="Column"
      AlignItems="Center"
      JustifyContent="SpaceEvenly">
         <Label Text="FlexLayout 垂直布局" />
         <Button x:Name="Btn1" Text="按钮一" HeightRequest="50"  HorizontalOptions="Center" Margin="5"  Style="{StaticResource ButtonStyle}" BorderWidth="1" TextColor="White"  BackgroundColor="#2946E6" BorderColor="#2946E6"  />
         <Button x:Name="Btn2" Text="按钮二" HeightRequest="50"  HorizontalOptions="Center" Margin="5"  Style="{StaticResource ButtonStyle}" BorderWidth="1" TextColor="White"  BackgroundColor="#2946E6" BorderColor="#2946E6" />
         <Button x:Name="Btn3" Text="按钮三" HeightRequest="50"  HorizontalOptions="Center" Margin="5"  Style="{StaticResource ButtonStyle}" BorderWidth="1" TextColor="White"  BackgroundColor="#2946E6" BorderColor="#2946E6" />

         <Label Text="Another Label" />
     </FlexLayout>
     <FlexLayout Direction="Row" Margin="50"
      AlignItems="Center"
      JustifyContent="SpaceEvenly">
         <Label Text="FlexLayout 水平布局" />
         <Button x:Name="Btn4" Text="按钮四" HeightRequest="50"  HorizontalOptions="Center" Margin="5"  Style="{StaticResource ButtonStyle}" BorderWidth="1" TextColor="White"  BackgroundColor="#2946E6" BorderColor="#2946E6"  />
         <Button x:Name="Btn5" Text="按钮五" HeightRequest="50"  HorizontalOptions="Center" Margin="5"  Style="{StaticResource ButtonStyle}" BorderWidth="1" TextColor="White"  BackgroundColor="#2946E6" BorderColor="#2946E6" />
         <Button x:Name="Btn6" Text="按钮六" HeightRequest="50"  HorizontalOptions="Center" Margin="5"  Style="{StaticResource ButtonStyle}" BorderWidth="1" TextColor="White"  BackgroundColor="#2946E6" BorderColor="#2946E6" />
         <Label Text="Another Label" />
     </FlexLayout>
 </StackLayout>

六、AbsoluteLayout布局

.NET Multi-platform App UI (.NET MAUI) 中的 AbsoluteLayout 是一种特殊的布局控件,它允许你精确地控制子项的位置和大小。你可以使用设备无关的单位来指定子项相对于 AbsoluteLayout 左上角的位置。这种布局还支持按比例定位和调整大小,这意味着你可以根据屏幕大小或容器尺寸来动态调整子项的位置和大小。

与 .NET MAUI 中的其他布局不同,AbsoluteLayout 允许子项相互重叠。因此,它适用于那些需要精确控制子项位置的场景,比如创建复杂的界面元素或动画效果。不过,由于它不自动调整子项的位置以避免重叠,所以在大多数常规布局需求中并不常用。当你知道子项的大小或不需要考虑子项之间的相互影响时,AbsoluteLayout 是一个很好的选择。

优点

灵活性高:BindableLayout可以根据需要呈现多种不同类型的数据,而不仅仅局限于单一的列表或网格布局。

可定制性强:BindableLayout可以使用自定义的数据模板来呈现数据,以满足不同的呈现需求。

数据绑定方便:BindableLayout可以直接绑定一个集合数据源,无需编写额外的代码来维护数据绑定。

性能高效:BindableLayout使用虚拟化技术来呈现大量的数据,从而保证了性能的高效和稳定。

属性列表

属性名

类型

描述

默认值

LayoutBounds

Rect

表示子元素的位置和大小。该属性允许您指定子元素相对于其父 AbsoluteLayout 的位置和尺寸。

(0, 0, AutoSize, AutoSize)

LayoutFlags

AbsoluteLayoutFlags 枚举

指示用于调整子元素位置和大小的布局边界属性是否按比例解释。

AbsoluteLayoutFlags.None

代码示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    <AbsoluteLayout>
        <BoxView Color="Blue"
                 AbsoluteLayout.LayoutBounds="0.5,0,100,45"
                 AbsoluteLayout.LayoutFlags="PositionProportional" />     
        <BoxView Color="Green"
                 AbsoluteLayout.LayoutBounds="0,0.5,45,100"
                 AbsoluteLayout.LayoutFlags="PositionProportional" />
        <BoxView Color="Red"
                 AbsoluteLayout.LayoutBounds="1,0.5,45,100"
                 AbsoluteLayout.LayoutFlags="PositionProportional" />
        <BoxView Color="Black"
                 AbsoluteLayout.LayoutBounds="0.5,1,100,45"
                 AbsoluteLayout.LayoutFlags="PositionProportional" />
        <Label Text="AbsoluteLayout 布局"
               AbsoluteLayout.LayoutBounds="0.5,0.5,150,35"
               AbsoluteLayout.LayoutFlags="PositionProportional" />
    </AbsoluteLayout>

运行效果

七、BindableLayout布局

BindableLayout 是一种特殊的布局类,它允许你通过绑定数据集(通常是实现 IEnumerable 接口的集合)来动态地生成布局的内容。这意味着你可以把一个数据列表绑定到这个布局上,然后布局会根据数据集中的每一项自动生成对应的视图组件。

属性列表

属性名

类型

描述

ItemsSource

IEnumerable

想要显示的数据集,比如一个用户列表

ItemTemplate

DataTemplate

告诉布局如何显示每一个数据项,比如每个用户的名字和头像怎么展示

ItemTemplateSelector

DataTemplateSelector

在某些情况下,你可能希望根据数据的不同来改变显示方式,这时候就需要用到选择器来决定使用哪个模板。

新增user实体类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public class User : INotifyPropertyChanged
 {
     private string name ;
     private int age;
     private string imagePath;

     public string Name
     {
         get => name;
         set
         {
             name = value;
             OnPropertyChanged();
         }
     }

     public int Age
     {
         get => age;
         set
         {
             age = value;
             OnPropertyChanged();
         }
     }

     public string ImagePath
     {
         get => imagePath;
         set
         {
             imagePath = value;
             OnPropertyChanged();
         }
     }

     public event PropertyChangedEventHandler PropertyChanged;

     protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
     {
         PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
     }
 }

xaml代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 <StackLayout x:Name="userList" BindableLayout.ItemsSource="{Binding}"
     Orientation="Vertical">
     <BindableLayout.ItemTemplate>
         <DataTemplate>
             <Border StrokeThickness="1">
                 <HorizontalStackLayout Margin="5">
                     <Image Source="{Binding ImagePath}"
                     Aspect="AspectFill"
                     WidthRequest="44"
                     HeightRequest="44" />
                     <Label FontSize="Large" Text="{Binding Name}"></Label>
                     <Label FontSize="Medium" Text="{Binding Age}"></Label>
                 </HorizontalStackLayout>
             </Border>
         </DataTemplate>
     </BindableLayout.ItemTemplate>
 </StackLayout>

后台绑定代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 ObservableCollection<User> users = new ObservableCollection<User>();
 users.Add(new User()
 {
     Name = "小明",
     Age = 25,
     ImagePath = "dotnet_bot.png"
 });
 users.Add(new User()
 {
     Name = "小李",
     Age = 30,
     ImagePath = "dotnet_bot.png"
 });
 userList.BindingContext = users;

效果展示

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Go语言上下文Context包源码分析和实践
context包最早在golang.org/x/net/context中,在Go1.7时,正式被官方收入,进入标准库,目前路径为src/context/,目前context包已经在Go各个项目中被广泛使用。并且在Co中Context和并发编程有着密切的关系(context ,chan ,select,go这些个词经常密不可分)
阿伟
2019/12/17
9190
go context详解
在 Go 服务器中,每个传入的请求都在其自己的 goroutine 中处理。请求处理程序通常会启动额外的 goroutine 来访问数据库和 RPC 服务等后端。处理请求的一组 goroutine 通常需要访问特定于请求的值,例如最终用户的身份、授权令牌和请求的截止日期。当请求被取消或超时时,所有处理该请求的 goroutines 都应该快速退出,以便系统可以回收它们正在使用的任何资源。
Johns
2022/06/22
2K0
轻松上手!手把手带你掌握从Context到go设计理念
: 导语 | 本文推选自腾讯云开发者社区-【技思广益 · 腾讯技术人原创集】专栏。该专栏是腾讯云开发者社区为腾讯技术人与广泛开发者打造的分享交流窗口。栏目邀约腾讯技术人分享原创的技术积淀,与广泛开发者互启迪共成长。本文作者是腾讯后端开发工程师陈雪锋。 context包比较小,是阅读源码比较理想的一个入手,并且里面也涵盖了许多go设计理念可以学习。 go的Context作为go并发方式的一种,无论是在源码net/http中,开源框架例如gin中,还是内部框架trpc-go中都是一个比较重要的存在,而整个 c
腾讯云开发者
2022/09/27
4300
轻松上手!手把手带你掌握从Context到go设计理念
深入Go:Context
在理解了 package context 的使用后,我们很自然地想问其背后的设计哲学有什么?实际上,我们发现无论是在关于 Context 的批评/讨论也不少,那么 Context 的设计合不合理?带着这些疑虑,我们深入 context 的源码,尝试对这些问题作出解答。
wenxing
2021/12/14
8620
深入Go:Context
[Golang]Context详解
Context 是 Golang 中非常有趣的设计,它与 Go 语言中的并发编程有着比较密切的关系,在其他语言中我们很难见到类似 Context 的东西,它不仅能够用来设置截止日期、同步『信号』还能用来传递请求相关的值。
宇宙无敌暴龙战士之心悦大王
2023/04/07
9130
go context原理
在 go 语言开发中, context 用于提供上下文的联系, 在不同协程调用间建立取消和超时机制,也可以用于传递相关值。
leobhao
2024/04/01
1820
一日一学_Go语言Context(设计及分析)
Go服务器的每个请求都有自己的goroutine,而有的请求为了提高性能,会经常启动额外的goroutine处理请求,当该请求被取消或超时,该请求上的所有goroutines应该退出,防止资源泄露。那
李海彬
2018/03/28
1.1K0
一日一学_Go语言Context(设计及分析)
浅析golang中的context
go1.7才引入context,译作“上下文”,实际也叫goroutine 的上下文,包含 goroutine 的运行状态、环境、现场等信息、context 主要用来在 goroutine 之间传递上下文信息,包括:取消信号、超时时间、截止时间、k-v 等。与WaitGroup最大的不同点是context对于派生goroutine有更强的控制力,它可以控制多级的goroutine
素履coder
2022/02/17
1.1K0
浅析golang中的context
Context源码,再度重相逢
各位读者朋友们大家好,我是随波逐流的薯条。深秋了,前几天气温骤降,北京的人和狗都不愿意出门,趴在窝里冻的打寒颤。我的书房里没装空调,暖气要十一月中旬才来,每次想学习都得下很大的决心,所以这篇文章发出来时比预期又晚了几天~
薯条的编程修养
2022/08/10
2800
Context源码,再度重相逢
Golang context 包入门
概述 Golang 的 context Package 提供了一种简洁又强大方式来管理 goroutine 的生命周期,同时提供了一种 Requst-Scope K-V Store。但是对于新手来说,Context 的概念不算非常的直观,这篇文章来带领大家了解一下 Context 包的基本作用和使用方法。 1. 包的引入 在 go1.7 及以上版本 context 包被正式列入官方库中,所以我们只需要import "context"就可以了,而在 go1.6 及以下版本,我们要 import "golang
李海彬
2018/03/26
1.1K0
Go组件:context学习笔记!
导语 | 最近学习go有一段时间了,在网上一直看到别人推荐,学go可以学习里面的context源码,短小精悍。看了下确实有所收获,本文是基于我最近对context源码学习的一些心得积累,望大家不吝赐教。 一、为什么使用Context (一)go的扛把子 要论go最津津乐道的功能莫过于go强大而简洁的并发能力。 func main(){ go func(){ fmt.Println("Hello World") }()} 通过简单的go func(){},go可以快速生成新的协程并运行。
腾讯云开发者
2022/08/26
4210
Go组件:context学习笔记!
深入解析Golang之context
context翻译成中文就是上下文,在软件开发环境中,是指接口之间或函数调用之间,除了传递业务参数之外的额外信息,像在微服务环境中,传递追踪信息traceID, 请求接收和返回时间,以及登录操作用户的身份等等。本文说的context是指golang标准库中的context包。Go标准库中的context包,提供了goroutine之间的传递信息的机制,信号同步,除此之外还有超时(timeout)和取消(cancel)机制。概括起来,Context可以控制子goroutine的运行,超时控制的方法调用,可以取消的方法调用。
数据小冰
2022/08/15
1.4K0
深入解析Golang之context
Go context.WithCancel()的使用
WithCancel可以将一个Context包装为cancelCtx,并提供一个取消函数,调用这个取消函数,可以Cancel对应的Context Go语言context包-cancelCtx[1]
fliter
2023/09/05
2400
Go context.WithCancel()的使用
Go Context解析 A Brief Inquiry Into Go Context
Package context defines the Context type, which carries deadlines,
takeonme.
2021/11/26
9683
Go Context 详解之终极无惑
Go 1.7 标准库引入 Context,中文名为上下文,是一个跨 API 和进程用来传递截止日期、取消信号和请求相关值的接口。
恋喵大鲤鱼
2022/05/09
5.4K0
Go Context 详解之终极无惑
golang源码分析(2):Golang context 包
应用场景:在 Go http 包的 Server 中,每一个请求在都有一个对应的goroutine去处理。请求处理函数通常会启动额外的goroutine用来访问后端服务,比如数据库和 RPC 服务。用来处理一个请求的goroutine通常需要访问一些与请求特定的数据,比如终端用户的身份认证信息、验证相关的 token、请求的截止时间。当一个请求被取消或超时时,所有用来处理该请求的goroutine都应该迅速退出,然后系统才能释放这些goroutine占用的资源,官方博客。
golangLeetcode
2022/08/02
5030
Golang 并发 与 context标准库
这篇文章将:介绍context工作机制;简单说明接口和结构体功能;通过简单Demo介绍外部API创建并使用context标准库;从源码角度分析context工作流程(不包括mutex的使用分析以及timerCtx计时源码)。
李海彬
2019/05/08
8250
Golang 并发 与 context标准库
Golang——Context
Go中goroutine之间没有父与子的关系,多个gorountine都是平行的被调度,不存在所谓的子进程退出后的通知机制。多个goroutine协调工作涉及 通信,同步,通知,退出 四个方面: 通信:chan通道是各goroutine之间通信的基础。注意这里的通信主要指程序的数据通道。 同步:可以使用不带缓冲的chan;sync.WaitGroup为多个gorouting提供同步等待机制;mutex锁与读写锁机制。 通知:通知与上文通信的区别是,通知的作用为管理,控制流数据。一般的解决方法是在输入端绑定两个chan,通过select收敛处理。这个方案可以解决简单的问题,但不是一个通用的解决方案。 退出:简单的解决方案与通知类似,即增加一个单独的通道,借助chan和select的广播机制(close chan to broadcast)实现退出。 context设计目的: 1.退出通知机制一一通知可以传递给整个 goroutine 调用树上的每一个。 2.传递数据一一数据可 以传递给整个 goroutine 调用树上的每一个 goroutine
羊羽shine
2019/05/29
1.1K1
Go 并发模式: context.Context 上下文详解
Package context 中定义了 Context 类型, 用于跨 API 或跨进程之间传递数据,包含 deadlines, cancellation signals, 以及其他 request-scoped values 。
一个会写诗的程序员
2022/05/13
1.4K1
Go 并发模式: context.Context 上下文详解
深入理解Golang之Context
这篇文章将介绍Golang并发编程中常用到一种编程模式:context。本文将从为什么需要context出发,深入了解context的实现原理,以及了解如何使用context。
KevinYan
2020/03/12
8980
相关推荐
Go语言上下文Context包源码分析和实践
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验