Un port GUI du framework de Python à Go. Analyse des râteaux et des petits pains

Avec Python, je devais travailler sans désespoir - ML, réseaux de neurones, scripts, c'était là-dessus que c'était plus pratique. Mais le temps passe et l'anxiété quant à la vitesse de votre code vous pousse à quelque chose de plus rapide et de plus fiable.





La tâche de porter le framework GUI était pénible, car mon Unigui universel ne fonctionnait qu'à partir de Python et n'était universel qu'en théorie. Une API extrêmement laconique y a été développée, qui aurait dû être conservée dans la version Go. De plus, la masse d'automatisme pour générer les données nécessaires n'était pas soumise au portage, car Go manque de contrôle d'ordre de compilation, de préprocesseur, de métaprogrammation, ce qui garantissait une expérience spartiate délicate.





La première difficulté que j'ai rencontrée était l'impossibilité d'attribuer directement des champs promoutés (imbriqués) dans et uniquement dans l'initialiseur struct. Si la structure a une structure imbriquée sans nom, ses champs sont accessibles à partir de la racine externe partout, sauf pour l'initialiseur. À cause de quoi, entre autres, toute l'idée avec des champs imbriqués comme le remplacement de la hiérarchie est devenue à la fois douteuse et lourde à utiliser. Demander à l'utilisateur d'écrire de longs initialiseurs imbriqués avec des types inutiles serait le comble de l'indécence. Toutes les structures GUI sont devenues complètement plates, indépendantes, bien qu'il y ait une hiérarchie claire en Python.





, Go , . , - , , , , , “ API”. , , . , , .   . Type_ a Type(…) *Type_. , , Go .





Go Json . nil ( ), nil nil a / [ ] . , — . k, Google, , == nil, = make(0, []Any). , == nil, reflect != nil. reflect.ValueOf(ptr).IsNil() , , true! , ..





hash. . . . . .





, ? , , Any — interface{}. ! ,  100% — . “ , !” 





. , , ( ) , , . , , . , ( ). Google





 MyField int json:"myfield"



, JSON . — - . ? , , — , , . .. !





  Dart _ . , Go Dart- , . . .  , Google , “” . , , , , ?





, map/filter/.. , RemoveAtIndex, , 1.17 , , , .





? ! fmt.Sprintf. - — , , — “ ”.





  .





  • — . , . , , ML- Go… 





  • /. , , Python-a Go — . — , , , . Python - .





  • / — Go. github ( ), . , Visual C++ ~20 , Edit & Continue . , Edit & Continue Go VS Code , , . --. ..





  • . . Go. , . , , , — . 





  • . , Go , 20% . 70% reflect . . , . . 





  • . ( 8000 ) Python Go.





Go:





package main
import . "github.com/Claus1/unigui-go"		

func screenTest(user* User)* Screen_{	
	table := Table("Videos",0, nil, []string{"Video", "Duration",  "Links", "Mine"},
	SeqSeq(Seq("opt_sync1_3_0.mp4", "30 seconds",  "@Refer to signal1", true),
		Seq("opt_sync1_3_0.mp4", "37 seconds",  "@Refer to signal8", false)))
			
	cleanButton := Button("Clean table", nil, "")
	selector := Select("Select", "All", nil, []string{"All","Based","Group"})
	block := Block("X Block", Seq(cleanButton, selector), table)
	block.Icon = "api"
	return Screen(block)	
}
func main(){			
	//register screens
	Register(screenTest, "Main", 0, "insights")	
	Start()
}
      
      



Python:





from unigui import *
name = "Main" #name of screen to show
icon = 'blur_linear' #MD icon of screen to show
order = 0 #order in the program menu
table = Table('Videos', 0, headers = ['Video', 'Duration',  'Links', 'Mine'],rows = [
    ['opt_sync1_3_0.mp4', '30 seconds',  '@Refer to signal1', True],
    ['opt_sync1_3_0.mp4', '37 seconds',  '@Refer to signal8', False]    
])
block = Block('X Block',
    [           
        Button('Clean table'),
        Select('Select', value='All', options=['All','Based','Group'])
    ], table, icon = 'api')
blocks = [block] #what to show on the screen
start('Test app')

      
      



Vais-je continuer à utiliser Go? Où vais-je descendre du sous-marin ... et je veux vraiment que Crystal, Nim et d'autres langages simples et avancés entrent en production et donnent à Go un pendule. Jusqu'à présent, malheureusement, je ne vois pas d'alternative à cela dans le créneau de la production légère pour développer des logiciels productifs. Paix!





Liens pour les curieux:





→ Aller 





→ Python 








All Articles